PDA

View Full Version : سوال: مشکل با ساخته trigger



cjcoax
دوشنبه 17 خرداد 1389, 16:57 عصر
سلام دوستان،
من میخواستم یک تریگر بسازم که منطقش به صورته زیر باشه
اگر یک ردیفی insert یا update شد چک کن که آیا column ه isAdmin مساوی یک بود یا نه، اگر بود مقداره column ه adminAccess ه همون روو رو ۱ قرار بده
فرض کنید که این هم table schema ی منه

UserTable(UniqueId,Name,isAdmin,adminAccess)
خودم اینو نوشتم که غلطه

CREATE TRIGGER myTrigger AFTER INSERT,UPDATE AS UPDATE myTable SET adminAccess=1 WHERE isAdmin=1
والی این درست نیست چون هر دفعه کله table رو اپداته میکنه
یک چیزی میخام مسله دستوره زیر (البته دستوره زیر کار نمیکنه والی فقط میخام منطق رو برسونم )


CREATE TRIGGER myTrigger AFTER INSERT,UPDATE AS UPDATE myTable SET adminAccess=1 IF(newlyAddedRow.isAdmin=1)
واقعن متشکر میشم اگر بتونین کمکم کنید چون خیلی فوری و واجبه

محمد سلیم آبادی
دوشنبه 17 خرداد 1389, 19:05 عصر
وقتی که سطری به یک جدول اضافه میشود، داده ها در جدول مجازی به نام inserted قرار می گیرند.
وقتی که داده ای از سطری ویرایش میشه داده های قبلی در جدول مجازی deleted و داده های جدید در جدول مجازی inserted قرار می گیرند.

سوالتون برایم کاملا واضح نیست. وقتی که یک سطری تازه درج شود باید قبل از درج چک کنید ستون isAdmin برابر با 1 هست یا نه و در صورتی که 1 بود داده ی متناظر در ستون adminAccess یک شود؟

به هر حال این trigger را امتحان کنید:


CREATE TRIGGER test ON Mytable AFTER insert, update
AS UPDATE t
SET adminAccess = 1
FROM Mytable t
JOIN inserted i
ON t.uniqueID = i.uniqueID AND i.isAdmin = 1;

cjcoax
سه شنبه 18 خرداد 1389, 03:10 صبح
متشکرم منظورم همین بود که شما نوشتید

محمد سلیم آبادی
سه شنبه 18 خرداد 1389, 04:13 صبح
پس علاوه بر trigger ای که در پس قبلیم قرار دادم این trigger هم همان کار را انجام می دهد البته با منطقی ساده تر:


CREATE TRIGGER TestTrigger
ON Mytable
INSTEAD OF insert, update
AS
INSERT INTO Mytable (col1, col2, ...)
SELECT col1, col2, ... , CASE WHEN isAdmin = 1 THEN 1 ELSE AdminAccess END AS AdminAccess
FROM inserted