ورود

View Full Version : مشکل در تریگر DELETE



fakhravari
یک شنبه 05 خرداد 1392, 01:46 صبح
با سلام
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
به صورت تک حذفی کار میکنه.
اما وقتی با دستور delete where id=5 باشه چنتا حذف بشه فقط 1 ایدی میتونه پیدا کنه:متفکر:

Mahmoud.Afrad
یک شنبه 05 خرداد 1392, 12:55 عصر
اینطوری بنویس:

ALTER TRIGGER [dbo].[Delete]
ON [dbo].[Manegment]
AFTER DELETE
AS
BEGIN
INSERT INTO log_manegment SELECT (UserName +' : ' + Reshte + ' : ID=' + CAST(ID as nvarchar) + ' : [AFTER DELETE]') FROM DELETED
END

fakhravari
یک شنبه 05 خرداد 1392, 13:01 عصر
نه ببنید مشکل از این نیست اینو نمونه گزاشتم.
مشکل اینه که وقتی چنتا رکورد حذف میکنیم
delete id=5
فقط یکی اون در INSERT INTO log_manegment میره و بقیه id ها لاگ نمیشه

hramezani
یک شنبه 05 خرداد 1392, 13:45 عصر
چرا اینو دوباره نوشتین ؟
DELETE FROM Manegment WHERE ID = @ID

fakhravari
یک شنبه 05 خرداد 1392, 13:59 عصر
عزیزان این سمپل من سوالم چیز دیگری است
create TRIGGER [dbo].[Delete]
ON TypeDrug
AFTER DELETE
AS
BEGIN
declare @ID int;
set @ID = (SELECT ID FROM DELETED)
Insert Into t1 values(CAST(@ID as nvarchar)+' : [AFTER DELETE]')
END

مثلا
DELETE FROM [TypeDrug]
WHERE [Type]= N't'
بیش از 1 حذف داشته باشه log نمیشه
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
The statement has been terminated.

hramezani
یک شنبه 05 خرداد 1392, 14:24 عصر
به خاطر اینه که چند تا ID داری , برا همین نمیتونی از دستور
set @ID = (SELECT ID FROM DELETED)
استفاده کنی , چون نمیونه چند تا مقدار رو به یه متغیر نسبت بده
باید اینطوری بنویسی
Insert Into t1 select CAST(ID as nvarchar)+' : [AFTER DELETE]' from deleted
یعنی نمیخواد ID رو تو متغیر بنویسی , وقتی اینطوری insert کنی , چندتا سطرت با هم insert میشن

hramezani
یک شنبه 05 خرداد 1392, 14:33 عصر
البته ذوستمون Mahmoud.Afrad (http://barnamenevis.org/member.php?71297-Mahmoud.Afrad) هم درست جواب داده

fakhravari
یک شنبه 05 خرداد 1392, 14:47 عصر
ممنون از دوستان
درست مطلبشون ندیدم

fakhravari
یک شنبه 05 خرداد 1392, 14:54 عصر
آیا دستور update هم به همون صورت است بر روی چند رکورد؟
اگر هست یه مثالی بزنید.

hramezani
یک شنبه 05 خرداد 1392, 15:00 عصر
آیا دستور update هم به همون صورت است بر روی چند رکورد؟
اگر هست یه مثالی بزنید.
دقیقاً یعنی چی؟
خب تو تریگر update هم از جدول deleted میخونی

fakhravari
یک شنبه 05 خرداد 1392, 16:13 عصر
اره همین شد
create TRIGGER [dbo].[Update]
ON [TypeDrug]
AFTER Update
AS
BEGIN
SET NOCOUNT ON;
if (COLUMNS_UPDATED()> 0)
Insert Into t1 select CAST(ID as nvarchar)+' : [AFTER Update]' from INSERTED
END

hramezani
یک شنبه 05 خرداد 1392, 16:53 عصر
اره همین شد
create TRIGGER [dbo].[Update]
ON [TypeDrug]
AFTER Update
AS
BEGIN
SET NOCOUNT ON;
if (COLUMNS_UPDATED()> 0)
Insert Into t1 select CAST(ID as nvarchar)+' : [AFTER Update]' from INSERTED
END
البته بهتره برا لاگ گیری از جدول deleted بخونی نه inserted

fakhravari
یک شنبه 05 خرداد 1392, 23:32 عصر
چرا:متفکر: .

hramezani
دوشنبه 06 خرداد 1392, 15:32 عصر
چون که وقتی برای بار اول داری آپدیت میکنی , اگه مقدار inserted رو نگه داری , اونوقت توی log دیتای اولیه رو نداری
چون داری تریگر رو روی delete وupdate مینویسی.
یعنی این لاگ گیری که من میگم برای نگهداری تغییرات روی دیتا هاست
نمیدونم توضیح کافیه یا نه؟