2012-02-26 30 views
2

我正在嘗試編寫一個觸發器,用於將新用戶添加到表中時執行。當用戶被添加時,我需要觸發器檢查表以查看用戶是否已經存在,如果存在,則吐出一條錯誤消息,指出用戶已經存在。否則,插入應該通過。用於檢查用戶是否在表中被讀取的SQL觸發器

ALTER TRIGGER tR_CustomerCheck ON CUSTOMER 
FOR INSERT, UPDATE 
AS 
IF EXISTS 
    (SELECT * 
    FROM CUSTOMER AS C 
     JOIN inserted as I 
      ON C.UserID = I.UserID 
    WHERE C.UserID = I.UserID) 
    BEGIN 
     PRINT 'Customer already exists.'; 
     ROLLBACK TRANSACTION; 
     RETURN; 
    END; 

看來該行被插入,然後被檢查,所以它總是失敗。我相信它必須是一個簡單的解決方案,但我無法找到它。

+3

爲什麼觸發器?客戶表的外鍵約束就足夠了。 – wildplasser 2012-02-26 18:16:09

+0

我同意外鍵會更好/更易於維護,但在這種情況下,它必須是觸發器。 – THansenite 2012-02-26 18:21:06

+0

我想你不能檢查前端的存在嗎? – 2012-02-26 18:32:17

回答

1

而不是使用FOR/AFTER觸發器,使用INSTEAD OF觸發器。雖然我必須同意wildplasser的評論。這是一個獨特約束的教科書使用情況。

+0

我曾嘗試使用INSTEAD OF,但是當我在觸發器中切換它時,我嘗試插入有效行時沒有任何反應。如果代碼已經存在,它會捕獲該代碼,但如果它是新的,則不插入該行。 – THansenite 2012-02-26 18:23:02

+0

@THsensenite你可以在你的問題中發佈你的'INSTEAD OF'觸發器代碼嗎?另外,你爲什麼不去約束? – 2012-02-27 01:48:39

相關問題