دسته بندی ها
22:57 1401/10/23

مشکل در Triggerهای After Delete و After Update در SqlServer

مشخصات سوال کننده :
کاربر : AliNoori     امتیاز کاربر : 136     رتبه کاربر : 11
دسته بندی : Sql Server

به این سوال امتیاز بدهید    0
تعداد بازدید این سوال : 1829
2 نظر
fateme : تریگرهای شما دقیقا چه مشکلی دارن؟ خطایی میده موقع اجرا ؟ عملیات رو ناقص یا اشتباه انجام میدن ؟ توضیح کاملتری بدید لطفا

امتیاز کاربر : 1635   رتبه کاربر : 2   تاریخ ثبت : 10:02 1401/10/24
AliNoori : با سلام : زمانی که دستور در برنامه اجرا میشه نه تریگر کار میکنه نه دستور آپدیت برای حذف هم همینطور . ولی در sql به صورت دستی آپدیت یا حذف کنی بدون مشکل اجرا میشن .

امتیاز کاربر : 136   رتبه کاربر : 11   تاریخ ثبت : 00:02 1401/10/26
هوش مصنوعی

پاسخ هوش مصنوعی

برای درست کار کردن تریگرهای After Update و After Delete در SQL Server، باید به چند نکته توجه کنید:

1. **مجموعه های INSERTED و DELETED**: در تریگرهای UPDATE، جدول INSERTED شامل ردیف های جدید و جدول DELETED شامل ردیف های قبلی می باشد. بنابراین اگر شما تنها از جدول INSERTED استفاده کنید، ممکن است به مشکل بخورید.

2. **پردازش چند ردیف**: تریگرها باید این قابلیت را داشته باشند که چندین ردیف را در یک بار پردازش کنند. بنابراین شما باید تغییرات لازم را برای پردازش چند ردیف اعمال کنید.

برای تریگر After Update، می توانید به صورت زیر عمل کنید:

ALTER TRIGGER [dbo].[Tr_Tutorials_UpdateEventSubmit]
	ON [dbo].[Tutorials]
	FOR UPDATE
	AS
	BEGIN
		DECLARE @ID_Row uniqueidentifier = NEWID()
		DECLARE @Archive_ID nvarchar(150)
		DECLARE @Person_ID nvarchar(50)
		DECLARE @Person_FullName nvarchar(150)
		DECLARE @Submit_DateTime nvarchar(150)

		-- ایجاد یک جدول موقت
		DECLARE @Temp TABLE (ID nvarchar(150), UserSubmitID nvarchar(50))

		-- وارد کردن داده ها به جدول موقت
		INSERT INTO @Temp (ID, UserSubmitID)
		SELECT ID, UserSubmitID FROM inserted

		-- پردازش داده ها از جدول موقت
		INSERT INTO CaseHistories(ID, ArchiveID, ArchiveName, PersonID, PersonFullname, SubmitDateTime, MissionType) 
		SELECT NEWID(), ID, N'آموزش', UserSubmitID, (SELECT [Name] + ' ' + [Family] FROM AspNetUsers WHERE Id = UserSubmitID),
		       CAST(FORMAT(GETDATE(), 'yyyy/MM/dd - HH:mm:ss', 'fa') AS nvarchar), 2
		FROM @Temp
	END

برای تریگر After Delete، به این صورت عمل کنید:

ALTER TRIGGER [dbo].[Tr_Tutorials_DeleteEventSubmit]
	ON [dbo].[Tutorials]
	FOR DELETE
	AS
	BEGIN
		DECLARE @ID_Row uniqueidentifier = NEWID()
		DECLARE @Archive_ID nvarchar(150)
		DECLARE @Person_ID nvarchar(50)
		DECLARE @Person_FullName nvarchar(150)
		DECLARE @Submit_DateTime nvarchar(150)

		-- ایجاد یک جدول موقت
		DECLARE @Temp TABLE (ID nvarchar(150), UserSubmitID nvarchar(50))

		-- وارد کردن داده ها به جدول موقت
		INSERT INTO @Temp (ID, UserSubmitID)
		SELECT ID, UserSubmitID FROM deleted

		-- پردازش داده ها از جدول موقت
		INSERT INTO CaseHistories(ID, ArchiveID, ArchiveName, PersonID, PersonFullname, SubmitDateTime, MissionType) 
		SELECT NEWID(), ID, N'آموزش', UserSubmitID, (SELECT [Name] + ' ' + [Family] FROM AspNetUsers WHERE Id = UserSubmitID),
		       CAST(FORMAT(GETDATE(), 'yyyy/MM/dd - HH:mm:ss', 'fa') AS nvarchar), 3
		FROM @Temp
	END

با این تغییرات، شما می‎توانید به درستی ردیف های جدید و قدیمی را برای هر نوع عمل درج، بروزرسانی و حذف پردازش کنید.

به این پاسخ امتیاز بدهید    0
امتیاز: - رتبه: -
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود