PDA

View Full Version : تریگر روی delete



crazy coder
سه شنبه 05 اردیبهشت 1391, 11:25 صبح
سلام
روز بخیر
من میخام وقتی از جدول الف یک رکورد یا چند رکورد پاک میشه، در جدول ب اون رکورد یا رکوردها رو ذخیره کنم!
روش کار رو عزیزان میشه برای من با استفاده از تریگر بیان کنن!
من نمونه کد رو میذارم و اشکلات احتمالیش رو هم میگم، ممنون از راهنمایی کاربران محترم


CREATE TRIGGER text
ON dbo.tbl1
FOR DELETE
AS
INSERT INTO dbo.tbl2 (col2_1.col2_2,col2_3)
SELECT col1_1,col1_2,col1_3 FROM deleted

من میخام بدونم که وقتی چند رکورد باهم پاک میشه هم این کد درست کار میکنه!!!
سوال دقیق من اینه : وقتی یک رکورد یا چند رکورد پاک میشه به جدولی با نام deleted انتقال پیدا میکنه، خوب حالا تا کی اون رکورد تو جدول deleted میمونه؟

حمیدرضاصادقیان
سه شنبه 05 اردیبهشت 1391, 12:33 عصر
سلام.
بهتره شما ابتدا یک اطلاعاتی در مورد جداول Deleted ,Inserted کسب کنید تا کارتون بهتر انجام بشه.کد شما درسته و برای حذفهای چندگانه نیز به درستی کار میکنه.
این دو جدول در Transaction Log ایجاد می شوند و به صورت موقتی هستند و زمانی که فایل Log توسط سیستم Truncate شود اینها نیز از بین میروند. و معمولا Trigger زمانی کاربرد داره که بخواهید هنگام رخ دادن یا قبل از رخ دادن عملی یک کاری رو انجام بدید. اگر قراره مثلا یک روز بعد اینکار انجام بشه که خوب از راهکارهای دیگه استفاده میشه کرد.

crazy coder
شنبه 09 اردیبهشت 1391, 08:43 صبح
سلام
ممنون...من هم متوجه شدم این کد درست کار میکنه ولی این کدی که من خدمت شما نوشتم یه مثال بود و کار دقیقی که من میخام انجام بدم این نیست...کار دقیقی که من میخام انجام بدم اینه:


CREATE TRIGGER text
ON dbo.tbl1
FOR DELETE
AS
set @col1=//do some opreation dase on deleted record for example col1_1
set @col2=//do some operaion
set @col3=//do soe operation
INSERT INTO dbo.tbl2 (col2_1.col2_2,col2_3)
value(@col1,@col2,@col3)


حالا در کد بالا وقتی چند حذف باهم انجام بگیره ما به مشکل میخوریم چون مثلا ما سه تا رکورد رو حذف همزمان میکنیم ولی وقتی محاسبات میخاد انجام بشه مقدار col1_1 برای هر کدوم از این سه تا رکورد متفاوته و در نتیجه این روش جواب نمیده...
در واقع من مشکل mutiple rows action instead of single row in INSERTED and DELETED tables دارم...
با سپاس از پاسخ شما

حمیدرضاصادقیان
شنبه 09 اردیبهشت 1391, 10:04 صبح
اینجا (http://msdn.microsoft.com/en-us/library/ms190752.aspx) رو ملاحظه بفرمائید.

با این راهکار مشکل شما حل خواهد شد.

crazy coder
یک شنبه 10 اردیبهشت 1391, 08:47 صبح
سلام
ممنون آقای صادقیان از وقتی که گذاشتید...
این تاپیک رو قبلا هم مطالعه کرده بودم ولی بکار من نیومد...شایدهم من متوجه نشدم چطوری ازش استفاده کنم...
ببینید من میخام وقتی یک رکورد از جدولم پاک میشه اون رو تو یک جدول دیگه ذخیره کنم.... حالا هنگام ذخیره کردن این رکورد(بک آپ گرفتن) من باید با توجه به یکی status رکورد حذف شده، status رکورد جدید رو محاسبه کنم...
راهکاری که الان من استفاده کردم و جواب هم داده اینه که از کرسر استفاده کنم اما جالب اینه که این لینکی که شما فرستادین و من قبلا اون رو مطالعه کردم پیشنهاد میکنه که از کرسر تو تریگر استفاده نشه و از rowset-based استفاده بشه، این اون پیشنهاده:!!!!
We do not recommend using cursors in triggers because they could potentially reduce performance. To design a trigger that affects multiple rows, use rowset-based logic instead of cursors.
حالا من موندم که کدم رو چطور بدون استفاده از کرسر بنویسم....
کدی که الان نوشتم یه چیزی تو این مایه هاست:



ALTER TRIGGER insert_to_reserveDate_cancelDates
ON dbo.ReserveDate
FOR DELETE
AS
declare @ReserveDate_id bigint
declare @Room_id int
declare @RoomKind_id int
declare @ReserveDate datetime
declare @Reservation_num bigint
declare @Status int


DECLARE res_num CURSOR FOR select ReserveDate_id, Room_id, RoomKind_id, ReserveDate,Reservation_num from deleted
open res_num
FETCH NEXT FROM res_num into @ReserveDate_id, @Room_id, @RoomKind_id, @ReserveDate,@Reservation_num
WHILE @@FETCH_STATUS = 0
BEGIN


INSERT INTO dbo.ReserveDate_cancelDates (ReserveDate_id, Room_id, RoomKind_id, ReserveDate,Reservation_num,Status)
values (@ReserveDate_id, @Room_id, @RoomKind_id, @ReserveDate,@Reservation_num,@Status)
FETCH NEXT FROM res_num into @ReserveDate_id, @Room_id, @RoomKind_id, @ReserveDate,@Reservation_num set @Status=dbo.ReserveDate_cancelDates_status(@Reserv ation_num)END;
CLOSE res_num;
DEALLOCATE res_num;