View Full Version : سوال: تریگر INSTEAD OF
mostafa_zainy
پنج شنبه 14 مرداد 1389, 11:59 صبح
سلام
اگه من از تریگر INSTEAD OF استفاده کنم (مثلا برای INSERT) برای اینکه تریگر به درستی عمل درج رو انجام بده « مثلا یه شرطی رو بررسی کردیم و مجاز به درج بود » باید داخل تریگر دستور INSERT رو بنویسیم؟ آیا اینکار موجب اجرای دوباره و دوباره ... تریگر درج (Loop) نمیشه؟
Create TRIGGER test
ON testTable
instead of Insert
AS
BEGIN
declare @t nvarchar(50)
select @t = name from inserted
if @t = 'a' begin
rollback
return
end
INSERT INTO testTable (NAME) VALUES (@T
END
نمونه تریگر رو در فوق نوشتم . آیا این روش نوشتن تریگر Insetad OF برای رخداد درج صحیح است.
با تشکر
AminSobati
پنج شنبه 14 مرداد 1389, 22:36 عصر
سلام دوست عزیزم،
در Instead Of برای لغو عمل کاربر نیازی به Rollback نیست، کافیه فرضا عمل Insert رو انجام ندین. تریگر Instead Of جایگزین عمل کاربر محسوب میشه. ضمنا Loop به این شکل که توضیح دادین بوجود نمیاد
محمد سلیم آبادی
جمعه 15 مرداد 1389, 11:51 صبح
سلام،
a few comments :
تریگر از نوع AFTER نیاز به بحث Rollback داره چون همانطوری که از اسمش بر میاد بعد از عمل مربوطه Trigger فایر میشه. ولی در نوع inseted اختیار درج (یا ...) با شماست، به این معنا که باید خودتان این عملیات را انجام بدین.
چه یک سطر و چه یک هزار سطر با یک دستور Insert در جدول درج بشه تنها یکبار Trigger اجرا میشه. در نتیجه کدی که مربوط به انتساب هست زیاد منطقی به نظر نمیرسه منظور این کد هست:
declare @t nvarchar(50)
select @t = name from inserted
چرا که اگر 10 سطر با همدیگر درج بشن مقدار name آخرین سطر موجود در جدول مجازی inserted در متغیر t درج انتساب داده میشه.
از طرفی انتساب دادن به متغر از روش SELECT غیر استاندارد هست و بهتره که از SET برای اینکار استفاده بشه.
و همینطور می تونید از syntax زیر برای درج داده های موجود در جدول inserted در جدول targer (مقصد) بهره مند بشین:
INSERT INTO testTable (NAME)
SELECT name FROM Inserted;
mostafa_zainy
یک شنبه 17 مرداد 1389, 01:13 صبح
سلام
چه یک سطر و چه یک هزار سطر با یک دستور Insert در جدول درج بشه تنها یکبار Trigger اجرا میشه. در نتیجه کدی که مربوط به انتساب هست زیاد منطقی به نظر نمیرسه منظور این کد هست:
کد:
declare @t nvarchar(50)
select @t = name from inserted
چرا که اگر 10 سطر با همدیگر درج بشن مقدار name آخرین سطر موجود در جدول مجازی inserted در متغیر t درج انتساب داده میشه.
پس اگه اشتباه نکنم هنگامی که چندین سطر به یکباره در جدول درج شده باید با حلقه تمامی سطرهای موجود در جدول Inserted بررسی بشن و تک تک رکوردهایی که دارای اعبتار هستند ، با دستور INSERT در جدولمون درج کنیم و اونهایی که دارای اعتبار نیستند ، صرفنظر کنیم !
محمد سلیم آبادی
یک شنبه 17 مرداد 1389, 01:18 صبح
پس اگه اشتباه نکنم هنگامی که چندین سطر به یکباره در جدول درج شده باید با حلقه تمامی سطرهای موجود در جدول Inserted بررسی بشن و تک تک رکوردهایی که دارای اعبتار هستند ، با دستور INSERT در جدولمون درج کنیم و اونهایی که دارای اعتبار نیستند ، صرفنظر کنیم !
دقیقا،
ولی عموما از Cursor برای پیمایش و عملیات سطر به سطر کمک گرفته میشه.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.