我想创建一个触发器,阻止具有相同昵称的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
答案 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
约束的存在有了新的认识。