ورود

View Full Version : یک سوال در مورد Trigger



irpersian20
یک شنبه 08 اردیبهشت 1392, 17:34 عصر
سلام
من یک تریگر ساختم . یعنی از ماکروسافت کپی زدم
ظاهرا این طور هست که وقتی تیبل مثلا مشتری اپدیت یا حذف میشه رکوردی ازش. این یک پیغام خطا چاپ میکنه
کلا کار تریگر میشه در اصل خبررسانی؟ یا ایمیل بفرسته به مدیر مثلا موقع تغیرات؟
من از رو کتاب میخونم منتها توضیح خوب نداده
یعنی میشه گفت کارش درحد اطلاع رسانی هست؟
الان تریگر ما ای نطور هست

USE AdventureWorks2012; GO IF OBJECT_ID ('Sales.reminder1', 'TR') IS NOT NULL DROP TRIGGER Sales.reminder1; GO CREATE TRIGGER reminder1 ON Sales.Customer AFTER INSERT, UPDATE AS RAISERROR ('Notify Customer Relations', 16, 10); GO
و اجرا ما
Update sales.Customer
SET PersonID=10 where CustomerID=10
پاسخ
Msg 50000, Level 16, State 10, Procedure reminder1, Line 4
Notify Customer Relations

(1 row(s) affected)
این الان تغیرات رو اعمال کرد و یک پیغام هم چاپ کرده
درسته کارکرد؟

hossein_h62
دوشنبه 09 اردیبهشت 1392, 11:04 صبح
کلا کار تریگر میشه در اصل خبررسانی؟ یا ایمیل بفرسته به مدیر مثلا موقع تغیرات؟
من از رو کتاب میخونم منتها توضیح خوب نداده
یعنی میشه گفت کارش درحد اطلاع رسانی هست؟

تریگرها نوع ویژه ای از Stored Procedure ها هستند که در صورت رخ دادن رویدادی خاصی اعم از DML یا DDL بصورت خودکار اجرا میشن. اطلاع رسانی که شما بهش اشاره کردین یکی از موارد کاربرد تریگرهاست و اصلا استفادشون محدود به این مورد نمیشه.شما میتونید با در نظر گرفتن شرایط و کارایی بانکتون قبل/بعد از رخ دادن رویدادهای خاص عملیات مورد نظرتون رو در تریگرها پیاده سازی کنید.

irpersian20
دوشنبه 09 اردیبهشت 1392, 17:51 عصر
ممنون از پاسخ
برای برای مورد خاص که ما که ارور داشت چی؟ ایا ارور نباید بده؟

Msg 50000, Level 16, State 10, Procedure reminder1, Line 4
Notify Customer Relations

(1 row(s) affected)

این الان تغیرات رو اعمال کرد و یک پیغام هم چاپ کرده

USE AdventureWorks2012; GO IF OBJECT_ID ('Sales.reminder1', 'TR') IS NOT NULL
DROP TRIGGER Sales.reminder1; GO CREATE TRIGGER reminder1 ON Sales.Customer
AFTER INSERT, UPDATE AS RAISERROR ('Notify Customer Relations', 16, 10); GO



Update sales.Customer
SET PersonID=10 where CustomerID=10

Mahmoud.Afrad
دوشنبه 09 اردیبهشت 1392, 18:39 عصر
ممنون از پاسخ
برای برای مورد خاص که ما که ارور داشت چی؟ ایا ارور نباید بده؟

Msg 50000, Level 16, State 10, Procedure reminder1, Line 4
Notify Customer Relations

(1 row(s) affected)

دو خط اول ارور هست دیگه.

irpersian20
دوشنبه 09 اردیبهشت 1392, 20:12 عصر
دو خط اول ارور هست دیگه.
خط دوم Notify Customer Relations که همان نمایش پیغام خودمان هست. که در تریگر گفتیم چاپ کنه
اما خط اول چرا ارور داره؟ کجای کار مشکل داره؟ میشه بفرمائید؟

hossein_h62
سه شنبه 10 اردیبهشت 1392, 07:32 صبح
خط دوم Notify Customer Relations که همان نمایش پیغام خودمان هست. که در تریگر گفتیم چاپ کنه
اما خط اول چرا ارور داره؟ کجای کار مشکل داره؟ میشه بفرمائید؟
وقتی ما از تابع RAISERROR استفاده میکنیم در واقع داریم یک Error Message تولید می کنیم، در محیط Management Studio هم پیام های خطا به همین شکلی که می بینید نمایش داده میشن، اگه میخواین پیام نمایش بدین و این خط اول رو نبینید می تونید از Print یا Select استفاده کنید.

irpersian20
چهارشنبه 11 اردیبهشت 1392, 12:00 عصر
create trigger delete_factor
ON factor after delete
AS
BEGIN
DECLARE @count int
IF (select Factor.Discount from Factor,deleted
where Factor.Discount =deleted.Discount
) > 10
begin
rollback transaction
print'Rolledback!'
end
else
print'OK!'
END


این تریگر وقتی خواست یک سطر پاک بشه فعال میشه و اگر مقدار تخفیف بیشتر از 10 درصد بود. نمیزاره عمل حذف انجام بشه
اجرا میشه اما وقتی بخوام یک سطح کامل با delete from پاک کنم ارور زیر دارم
Msg 512, Level 16, State 1, Procedure delete_factor, Line 6
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.

hossein_h62
چهارشنبه 11 اردیبهشت 1392, 13:51 عصر
متن خطا گویای همه چیز هست؛ شما نتیجه کوئری تون رو دارین با عدد 10 مقایسه میکنید، در حالیکه نتیجه کوئری بصورت دسته ای از مقادیر هست و این کار امکان پذیر نیست.
در ضمن خط 5 تریگرتون هم اضافه هستش.

irpersian20
چهارشنبه 11 اردیبهشت 1392, 15:05 عصر
متن خطا گویای همه چیز هست؛ شما نتیجه کوئری تون رو دارین با عدد 10 مقایسه میکنید، در حالیکه نتیجه کوئری بصورت دسته ای از مقادیر هست و این کار امکان پذیر نیست.
در ضمن خط 5 تریگرتون هم اضافه هستش.
ببخشید برای مقایسه یک دونه با عدد 10 چی کار کنم؟ یعنی بخوام تریگر رو اصلاح کنم
باید چی رو select کنم

hossein_h62
چهارشنبه 11 اردیبهشت 1392, 15:12 عصر
میتونه شبیه به این باشه :
ALTER trigger test ON Factor
AFTER Delete
As
if Exists (select Discount From deleted where Discount > 10)
Begin
raiserror ('you can not delete it because discount bigger than 10' , 16,10)
ROLLBACK TRANSACTION;
RETURN
end
GO

irpersian20
پنج شنبه 12 اردیبهشت 1392, 14:35 عصر
آقا واقعا ممنون ازت
در مورد تریگر های instead of چی؟ میشه یک توضیحی بفرمائید؟ و یک مثال
واقعا لطف میکنی
باور کن کتاب جلوم هست منتها اصلا واضح نگفته