ورود

View Full Version : سوال در مورد TRIGGER در UPDATE



fakhravari
دوشنبه 11 دی 1391, 19:59 عصر
با سلام
من با این کد
AFTER DELETE
AS
BEGIN
SET NOCOUNT ON;
declare @ID int;
set @ID = (SELECT ID FROM DELETED)
مقدار ID حذف شده را میگیرم.
و با این کد مقدار ID جدید ثبت شده را میگیرم
AFTER Insert
AS
BEGIN
SET NOCOUNT ON;
declare @ID int;
set @ID = @@IDENTITY
-------------------------------------------------------
سوال اول
1) برای ویرایش چطوری میتونم ID رکورد را دریافت کنم؟
---------------------------------------------------------------
سوال دوم
2) من با این کد
set @ID = (SELECT ID FROM DELETED)
set @UserName = (SELECT Name +' ' + Family FROM DELETED)
Insert Into Tb2 (RetID, DatePost) values(@ID,@UserName+' AFTER DELETE');
مثلا میگم
19 11 محمد حسین فخراوری AFTER DELETE
یک جمله ثبت میکنم.
حال در ثبت اطلاعات insert چطوری میتونم نام در یافت کنم چون فقط بلدم @@IDENTITY برگشتی بگیرم.
------------------------
در این پست
http://barnamenevis.org/showthread.php?376629-%D9%85%D9%82%D8%AF%D8%A7%D8%B1-%D8%A8%D8%B1%DA%AF%D8%B4%D8%AA%DB%8C-%D8%A8%D8%B9%D8%AF-%D8%A7%D8%B2-%D8%AD%D8%B0%D9%81
اقای موسوی گفتن update نداریم .
من خودم برای تریگر چون فقط insert / delete تست زدم نمیدونم دقیقا یا بد منظورشون گرفتم

fakhravari
چهارشنبه 13 دی 1391, 00:38 صبح
دریافت کد ID رکورد بروز رسانی شده
declare @ID bigint;
select @ID=ID from inserted

fakhravari
سه شنبه 26 دی 1391, 22:03 عصر
با سلام
if (COLUMNS_UPDATED()> 0)
declare @ID bigint;declare @UserName nvarchar(50);
select @ID = ID from inserted
set @UserName = (SELECT 'شخص : '+UserName +'با رشته : ' + Reshte FROM DELETED)
BEGIN
Insert Into Log_Manegment ([Log]) values(@UserName + +' '+CAST(@ID as nvarchar)+' :[AFTER Update]');
END
من یک رکورد بروز میکنم مقدار insert در جدول Log_Manegment همون رکورد قبلی است < یعنی اصلاح شده نیست
چطوری اینو حل کنم؟

fakhravari
جمعه 29 دی 1391, 01:09 صبح
حل شد.
ALTER TRIGGER [dbo].[Update]
ON [dbo].[Manegment]
AFTER Update
AS
BEGIN
SET NOCOUNT ON;
if (COLUMNS_UPDATED()> 0)

declare @ID bigint;declare @UserName nvarchar(50);
select @ID = ID from INSERTED
set @UserName = (SELECT 'شخص : '+UserName +'با رشته : ' + Reshte FROM INSERTED)

BEGIN
Insert Into Log_Manegment ([Log]) values(@UserName + +' '+CAST(@ID as nvarchar)+' :[AFTER Update]');
END

END

محمد سلیم آبادی
شنبه 30 دی 1391, 21:45 عصر
همون طور که اقای موسوی در یکی از تاپیک ها اشاره کردن جداول مجازی inserted و یا deleted میتوانند بیش از یک سطر داشته باشند.
مثلا اگر جدول inserted بیش از یک سطر داشته باشد دستور انتساب زیر با خطا مواجه خواهد شد:
set @UserName = (SELECT 'شخص : '+UserName +'با رشته : ' + Reshte FROM INSERTED)

چرا که subquery فوق مقدار scalar برنمیگرداند بلکه یک مجموعه برمیگرداند.

و همین ایراد به این دستور نیز وارد هست:
Insert Into Log_Manegment ([Log])
values(@UserName + +' '+CAST(@ID as nvarchar)+' :[AFTER Update]');

پیشنهاد میکنم مطالعه داشته باشین قبل از انجام عملی. نمیدونم میدانید یا نه به هر حال آقا کفاش یک جزوه در این سایت گذاشته که trigger هم پوشش داده شده در آن...

reza69
یک شنبه 01 بهمن 1391, 15:36 عصر
@@identity چکار میکنه؟
این کدی که نوشتم درسته؟ میخوام مقدار id و name رو به جدولم بازگردانی کنم . این کد رو باید کجا بنویسم؟داخل پروسیجر؟چجوری اعمالش کنم؟

AFTER DELETE
AS
BEGIN
SET NOCOUNT ON;
declare @ID int;
set @ID = (SELECT ID FROM DELETED)

declare @name nvarchar();
set @name = (SELECT name FROM DELETED)

reza69
یک شنبه 01 بهمن 1391, 20:42 عصر
کسی نیست جواب بده؟

fakhravari
یک شنبه 01 بهمن 1391, 20:43 عصر
یک مثال
create TRIGGER [dbo].[Delete]
ON [dbo].[Manegment]
AFTER DELETE
AS
BEGIN
declare @ID int;declare @UserName nvarchar(50);

set @ID = (SELECT ID FROM DELETED)
set @UserName = (SELECT 'شخص : '+UserName +'با رشته : ' + Reshte FROM DELETED)
DELETE FROM Manegment WHERE ID = @ID
Insert Into Log_Manegment ([Log]) values(@UserName +' '+CAST(@ID as nvarchar)+' : [AFTER DELETE]');
END