View Full Version : سوال: کار با تریگرها
Bahar_HS
شنبه 29 آبان 1389, 07:29 صبح
با سلام
درQuery Analyzer با استفاده از دستورCreate Triggerتریگری ایجاد کردم که اجرا میشه و
Query Analyzer پیغام اجرا میده(که این دستور درسته) ولی به دیتابیس اعمال نمیشه،
1)چطور باید تریگر ساخته شده رو به دیتابیس اعمال کرد؟
اگرid مشتری در جدول Update,Customerشد،این تغییر مقدار idباید به جداول دیگه که با اینid کار می کنند هم اعمال بشه،
(باید با تریگر نوشتش)
2)سوالم اینه که چطور میشه مقدار قبلی و جدیدid رو داشت؟
اینid در جدول Update,Customerشده و حالا می خوایم به جداول مرتبط بگیم که مقدار جدید رو بگیرند بر اساس مقدار قبلی(برای قسمت شرطی)،چطور میشه؟
حمیدرضاصادقیان
شنبه 29 آبان 1389, 08:05 صبح
سلام.
در مورد سوال اول شما نمیتونید در نسخه 2000 تریگرهارو ببینید
تریگرها روی هر دیتابیس و جدولی که ساخته می شوند بسته به نوع تریگر خودشون اجرا میشن نیازی نیست شما چیزی رو اجرا کنید.
در مورد سوال دوم بهتره شما FK تعریف کنید در جداول دیگه و وقتی که Relation ایجاد میکنید میتونید گزینه Cascade update رو انتخاب کنید با این وضع وقتی مقدار id شما تغییر کرد خودش id های زیرمجموعه شمارو تغییر میده و نیازی نیست براش کدنویسی کنید.
Reza_Yarahmadi
شنبه 29 آبان 1389, 08:10 صبح
1)چطور باید تریگر ساخته شده رو به دیتابیس اعمال کرد؟احتمال داره تريگري نوشتيد به هر دليلي در اون حالتي كه تست ميكنيد كاري انجام نده. بعد از نوشتن تريگر و انتخاب ديتابيس با زدن دكمه Execute تريگر توي ديتابيس ذخيره ميشه كار خاصي نميخواد انجام بديد.
اگرid مشتری در جدول Update,Customerشد،این تغییر مقدار idباید به جداول دیگه که با اینid کار می کنند هم اعمال بشه،
در وحله اول روش جناب صادقيان توصيه ميشه.
به هر حال براي تغيير id به id قبلي نياز داريد ، معمولا به دليل وجود ريليشن بين جداول اول بايد جدولهايي كه از جدول مذكور رابطه گرفتند آپديت بشن بعد جدول اصلي. براي اين كار هم معمولا از تريگر استفاده نميشه چون اولا سربار بيخودي به سرور اعمال ميكنه ثانيا در صورت وجود رابطه احتمالا قبل از انجام تريگر (در زمان اجراي دستور آپديت رو جدول اصلي) با خطا مواجه ميشيد (چون امتحان نكردم مطمئن نيستم). شما ميتونيد با يك SP و استفاده از TransAction آپديت مورد نظرتون رو بدون استفاده از تريگر انجام بديد.
2)سوالم اینه که چطور میشه مقدار قبلی و جدیدid رو داشت؟توي تريگر حساس به آپديت شما به 2 جدول Inserted و Deleted دسترسي داريد. ركوردهاي درون Deleted ركوردهاي قبل از آپديت و ركوردهاي درون Inserted ركوردهاي بعد از آپديت درش قرار دارند.
Bahar_HS
شنبه 29 آبان 1389, 08:31 صبح
تریگری که نوشتم اینه:
Create Trigger TirggInsertTB ON [dbo].[Customer]
After Insert AS
Declare @id nvarchar(50),@type nvarchar(50)
IF EXISTS(SELECT 1 FROM inserted)
SELECT @id = id FROM inserted
SET @type=(SELECT type FROM Customer WHERE id=@id)
IF(@type!='پرسنل')
BEGIN
INSERT INTO Talabkarha VALUES(@id,0,0,0)
INSERT INTO Sandogh VALUES(@id,0,0,0)
END
درQuery اجرا کردم،پیغام اجرا هم داد،ولی بعد ازInsert به جدول مشتری ،Insertهای بعدی انجام نمیشه،اشکال کار از کجاست؟این که تریگر رو درQueryنوشته واجرا کردم،اشکالی نداره؟
دستور ساخت تریگر رو کجا باید نوشت؟:متفکر:
Reza_Yarahmadi
شنبه 29 آبان 1389, 08:47 صبح
تا جايي كه من ميدونم چنين عملگري توي اس كيو ال ندارم
If @Type != 'پرسنل'
اين دستور رو بصورت زير امتحان كنيد.
If @Type <> N'پرسنل'
دستور ساخت تریگر رو کجا باید نوشت؟:متفکر:
تقريبا هر جايي كه بشه دستورات SQL رو نوشت ميشه تريگر هم نوشت. مهم اينه كه روي ديتابيس و جدول و رويداد درست نوشته بشه. جدول و رويداد كه توي دستور تعيين ميشه ، تعيين ديتابيس هم به محيطي كه دستور رو مينويسيد بستگس داره.
Bahar_HS
شنبه 29 آبان 1389, 09:08 صبح
بازهم نمیشه،
وقتی دستور تریگر رو نوشتم پیغام داد که این تریگر موجوده،نامش رو تغییر دادم و تریگر دیگه ای اضافه شد،الان 2تاتریگرکه یک کار رو انجام می دن به دیتابیس اضافه شده،چطور یکی ش رو حذف کنم؟
وچکار باید کرد که این تریگر اجرا بشه؟
Reza_Yarahmadi
شنبه 29 آبان 1389, 09:20 صبح
وقتی دستور تریگر رو نوشتم پیغام داد که این تریگر موجوده،
براي رفعش Create رو تبديل به Alter كنيد.
چطور یکی ش رو حذف کنم؟
با دستور زير
Drop trigger TriggerName
وچکار باید کرد که این تریگر اجرا بشه؟
اگر شرط تريگر درست باشه خودش كار ميكنه و نيازي نيست شما كاري كنيد.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.