PDA

View Full Version : ادغام کردن تریگرها



RK977877
یک شنبه 15 شهریور 1394, 10:38 صبح
با سلام
من 3 تا تریگر دارم که میخوام برای عملیات حذف و اضافه و اصلاح روی یک جدول بزارم
ولی عملا این 3 تا تریگر یک کار انجام میدند
میخوام بدونم اگه من این 3 تا رو یکی کردم مشکلی پیش نمیاد ؟
مثلا Deaclock یا Process id ویا خطاهای دیگه ؟

SabaSabouhi
یک شنبه 15 شهریور 1394, 14:38 عصر
با سلام
من 3 تا تریگر دارم که میخوام برای عملیات حذف و اضافه و اصلاح روی یک جدول بزارم
ولی عملا این 3 تا تریگر یک کار انجام میدند
میخوام بدونم اگه من این 3 تا رو یکی کردم مشکلی پیش نمیاد ؟
مثلا Deaclock یا Process id ویا خطاهای دیگه ؟

سلام
بستگی داره چه‌کاری داری انجام می‌دی و اون کار رو چطوری انجام می‌دی.
در حالت عادی نباید مشکلی پیش بیاد.
چند تا نکته:
* در Trigger از جدول‌های مجازی inserted, deleted استفاده کن
* تا حدی که ممکنه از متغیر محلی استفاده نکن
* مواظب باش که در صورت اصلاح همون جدول تریگرت recursive می‌شه. اگه مجبور بودی
این کار رو بکنی، باید کنترل کنی که فراخوانی اول هستی یا نه.
* اگه جدول deleted خالی بود، یعنی عمل انجام شده Insert بوده، اگه inserted خالی بود یعنی Delete انجام شده
و در غیر این صورت عمل انجام شده update است.

صبا صبوحی

RK977877
یک شنبه 15 شهریور 1394, 16:15 عصر
تمام این حالتها بررسی شده
فقط من وقتی 3 تا رو یکی کردم حالت Deadlock بوجود امود ولی وقتی که 3 تاش کردم درست شد علت چی بوده ؟

SabaSabouhi
دوشنبه 16 شهریور 1394, 09:54 صبح
تمام این حالتها بررسی شده
فقط من وقتی 3 تا رو یکی کردم حالت Deadlock بوجود امود ولی وقتی که 3 تاش کردم درست شد علت چی بوده ؟

سلام
متن trigger رو بگذار تا بررسی کنیم. چون هیچ دلیلی برای deadlock وجود نداره. تنها مشکلی که ممکنه به وجود بیاد اینه که recursive بشه

صبا صبوحی

RK977877
دوشنبه 16 شهریور 1394, 12:34 عصر
CREATE TRIGGER [dbo].[T_TotPrice] ON [dbo].[T2]
AFTER Insert, Update , Delete
As
Declare @InsId Bigint
Declare @DelId Bigint
Declare @Id Bigint
Select @InsId = Id From Inserted Group By Id
Select @DelId = Id From deleted Group By Id
IF @InsId is null
Set @Id =Delid
Else
Set @Id = InsId

Update TmpHeadH Set
Tot_Price_KHarid = T.TotPriceKharid ,
Tot_Price_forosh = T.TotPriceForosh ,
Tot_Price_Omdeh = T.TotPriceOmdeh
From T1
Inner Join (
Select Id,
Sum(Round(Qty * Pricekharid,0)) TotPriceKharid,
Sum(Round(Qty * PriceForosh,0)) TotPriceForosh,
Sum(Round(Qty * PriceOmdeh,0)) TotPriceOmdeh
From T2
Where Id = @Id
Group By Id
) As T on T1.Id =T2.Id
Where T1.Id = @id

SabaSabouhi
دوشنبه 16 شهریور 1394, 13:26 عصر
CREATE TRIGGER [dbo].[T_TotPrice] ON [dbo].[T2]
AFTER Insert, Update , Delete
As
Declare @InsId Bigint
Declare @DelId Bigint
Declare @Id Bigint
Select @InsId = Id From Inserted Group By Id
Select @DelId = Id From deleted Group By Id
IF @InsId is null
Set @Id =Delid
Else
Set @Id = InsId

Update TmpHeadH Set
Tot_Price_KHarid = T.TotPriceKharid ,
Tot_Price_forosh = T.TotPriceForosh ,
Tot_Price_Omdeh = T.TotPriceOmdeh
From T1
Inner Join (
Select Id,
Sum(Round(Qty * Pricekharid,0)) TotPriceKharid,
Sum(Round(Qty * PriceForosh,0)) TotPriceForosh,
Sum(Round(Qty * PriceOmdeh,0)) TotPriceOmdeh
From T2
Where Id = @Id
Group By Id
) As T on T1.Id =T2.Id
Where T1.Id = @id

سلام
دوست عزیز، وقتی من پست می‌زنم و بهش توجه نمی‌کنی من چه کمکی می‌تونم بکنم؟
1. تمام متغیرهای محلی رو حذف کن. و فرمان‌ها رو بدون متغیرهای محلی بنویس. ( شاید یه کم برات سخت باشه، اما مطمئن باش که می‌تونی )
2. بجای استفاده از T2 تو queryهات از inserted , deleted استفاده کن
3. وقتی متنی رو اینجا کپی می‌کنی از امکانات ویرایش‌گر اینجا استفاده کن و اون‌ها رو توی تگ‌های [-CODE-] مانند قرار بده تا درست خونده بشه
خوندن یک متن به این شکل که شما فرستادی کار سختیه.

صبا صبوحی

RK977877
دوشنبه 16 شهریور 1394, 16:04 عصر
شرمنده و لی ظاهرا شما متوجه نشدید
اولا T2 نام یه جدول بود نه Deleted , inserted ثانیه
من متغیر id@ رو تو همین جا 3 بار استفاده کردم چطوری متغیر تعریف نکنم ؟
نمیتونم به عنوان مثال 3 بار بنویسم
Id From Inserted Group By Id