2012-02-26 41 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