PDA

View Full Version : ساخت یک تریگر ساده



Hossis
جمعه 14 آذر 1393, 17:43 عصر
سلام
من می خوام یگ تریگر ساده درست کنم که در صورت افزودن به یک جدول، یک سری مشخصات از اون رکورد مثل Id در جدول دیگری ثبت بشه
شکل کلی اش رو درست کردم منتها نمی دونم وقتی مثلا یک رکورد اضافه می شه، اسکیوال چطور فیلد های اون رو شناسایی می کنه و چطور بازگشت می ده
من به این صورت در آورده بودم ولی نتیجه نداد:
CREATE TRIGGER [Add] AFTER UPDATE ON [Jame1]
BEGIN INSERT INTO Jame ( title )
VALUES ( ' + (SELECT title FROM Jame1 WHERE id = @@IDENTITY) + ' ) ;
END;
ولی توی جدول دوم , همی کد رو ذخیره می کنه:
(SELECT title FROM Jame1 WHERE id = @@IDENTITY)

مهدی نان شکری
جمعه 14 آذر 1393, 21:12 عصر
با سلام
با استفاده از جداول inserted و deleted در DML trigger ها می توان به داده های اضافه شده و اصلاح شده و حذف شده دسترسی پیدا کرد.

create table sourceTable
(
Id int primary key identity,
FirstName nvarchar(100),
LastName nvarchar(100)
)

create table targetTable
(
Id int primary key,
FirstName nvarchar(100),
)


create trigger trg_sourceTable_Update on sourceTable after insert
as
insert targetTable(id,FirstName) select id,firstName from inserted;

Hossis
یک شنبه 16 آذر 1393, 17:41 عصر
با سلام
با استفاده از جداول inserted و deleted در DML trigger ها می توان به داده های اضافه شده و اصلاح شده و حذف شده دسترسی پیدا کرد.

جواب نمی ده
یعنی Inserted رو به عنوان جدول می شناسه در حالی که چنین جدولی وجود نداره
در ضمن، این کد چند اشکال املائی داشت مثل Insert Into و ;

مهدی نان شکری
یک شنبه 16 آذر 1393, 17:57 عصر
با سلام
این جداول temporaryو memory-resident هستند و فقط در تریگرها قابل استفاده اند.
into در دستور insert اختیاری می باشد.
اگر جواب نمی دهد مشکل کجاست؟ خطایی می گیرید؟

Hossis
یک شنبه 16 آذر 1393, 18:37 عصر
مشکل حل شد.
من از اسکیولایت استفاده کردم و در این نوع بانک، از کلمات کلیدی New , Old برای جدول جدید و قدیم استفاده می کنه .
قالب تریگر هم در این بانک به این صورته

CREATE TRIGGER update_customer_address UPDATE OF address ON customers BEGIN
UPDATE orders SET address = new.address WHERE customer_name = old.name;
END;

حمیدرضاصادقیان
یک شنبه 16 آذر 1393, 18:46 عصر
سلام
جداول Deleted,Inserted در فایل LOG ایجاد می شوند و شما میتوانید مستقیم بدون نیاز به Trigger با استفاده از دستور Output در داخل خود Update از آن استفاده کنید.
پیشنهاد میکنم این لینک (http://msdn.microsoft.com/en-us/library/ms177564.aspx) رو مشاهده کنید .

Hossis
یک شنبه 16 آذر 1393, 19:01 عصر
سلام
جداول Deleted,Inserted در فایل LOG ایجاد می شوند و شما میتوانید مستقیم بدون نیاز به Trigger با استفاده از دستور Output در داخل خود Update از آن استفاده کنید.
پیشنهاد میکنم این لینک (http://msdn.microsoft.com/en-us/library/ms177564.aspx) رو مشاهده کنید .
این فایل لوگ کجا ذخیره میشه؟؟ و اصلا امکان ذخیره سازی اش به صورت متنی خارج از دیتابیس (بر روی دیسک) هست؟
اگر این طور باشه که کار من راحت میشه.

gGolmiri
یک شنبه 16 آذر 1393, 21:31 عصر
اگر به محل فایل های دیتابیس بروید یک فایل با پسوند ldf وجود دارد که sql نتیجه تمام تراکنش ها ابتدا اونجا مینویسه سپس بعد از هر check point به disk انتقال میده.