在插入SQL Server之前添加触发器

时间:2018-01-05 22:29:00

标签: sql sql-server

我想创建一个触发器,阻止具有相同昵称的2个用户注册到同一个应用程序。

例如,如果我的用户Bob注册到app1的nickName B123 我不希望那个带有 B123 的用户Brian能够注册app1。

我正在使用的表格tblRegisteredTo包含以下列:

email (key), appName (key), registrationDate, nickName

这是我试图做的,但不管他是否有相同的昵称,都不会让我注册任何用户。

CREATE TRIGGER ifSameNick
ON [dbo].[tblRegisteredTo] 
AFTER INSERT
AS
    DECLARE @email NVARCHAR(100),
            @appName NVARCHAR(50),
            @nickName NVARCHAR(55)

    SELECT
        @email = INSERTED.email, 
        @appName = INSERTED.AppName, 
        @nickName = INSERTED.nickName
    FROM
        INSERTED

    IF EXISTS (SELECT * FROM dbo.tblRegisteredTo B
               WHERE B.nickName = @nickName AND B.appName = @appName)
        ROLLBACK

2 个答案:

答案 0 :(得分:2)

您不应该使用触发器执行此操作。您应该使用唯一约束来执行此操作:

alter table tblRegisteredTo
    add constraint unq_tblRegisteredTo_nickname
        unique (nickname);

如果你正在学习SQL,这是一个触发器的例子,那么这是一个非常糟糕的例子。您应该学习如何正确使用数据库。

答案 1 :(得分:1)

戈登的答案是对的,但是如果必须使用触发器,则必须考虑刚刚插入的记录(期望不超过1行的nickName和appName)。另外,不要将inserted伪表视为标量。

create trigger ifSameNick
on [dbo].[tblRegisteredTo] after insert as

IF EXISTS (
    SELECT * FROM dbo.tblRegisteredTo B
    INNER JOIN inserted ON B.nickName = inserted.nickName and B.appName = inserted.appName
    GROUP BY inserted.nickName, inserted.appName
    HAVING COUNT(*) > 1)
ROLLBACK

在撰写本文时,我对UNIQUE约束的存在有了新的认识。