gpt4 book ai didi

SQL 服务器 : trigger firing every time

转载 作者:搜寻专家 更新时间:2023-10-30 22:28:20 25 4
gpt4 key购买 nike

对于我的学校项目,我需要向我的 SQL Server 数据库添加一个触发器。我决定在我的 Users 表上使用“无双重用户名”触发器是相关的。

问题是,每次我执行 INSERT 查询时都会触发此触发器。我无法弄清楚为什么每次都会发生这种情况。我什至尝试了不同的方式来编写我的触发器。

我现在的触发器:

CREATE TRIGGER [Trigger_NoDuplicates]
ON [dbo].[Users]
FOR INSERT
AS
BEGIN
SET NOCOUNT ON

IF(EXISTS(SELECT Username FROM Users
WHERE Username = (SELECT Username FROM inserted)))
BEGIN;
RAISERROR('This username already exists!',15, 0)
ROLLBACK
END
END

提前致谢!

最佳答案

触发器总是每次都会触发,您是说“每次都会引发错误”吗?

您当前有以下(扩展为多行以使其更清晰)...

IF (
EXISTS (
SELECT Username
FROM users
WHERE Username = (SELECT Username FROM inserted)
)
)

这里的重点是inserted的表名。过去式。这已经发生了。

inserted 表中的任何内容都已经插入到目标表中。

因此,您需要检查的是目标表中的用户名一次。

但是,可以一次向一个表中插入多个记录。这意味着 Username = (SELECT Username FROM inserted) 将导致其自身的错误。 (您不能将单个值与一组值进行比较,inserted 可以包含多个行 => 多个用户名...)

这就是我处理触发器的方式...

IF EXISTS (
SELECT
users.Username
FROM
users
INNER JOIN
inserted
ON inserted.Username = users.Username
GROUP BY
users.Username
HAVING
COUNT(*) > 1
)

这会获取(已插入到) 用户表,并挑选出所有匹配用户名与已插入 表中的任何记录的记录。

然后它根据 username 字段对他们进行 GROUP

然后它将结果过滤为包含超过 1 条记录的组。

这些组 (用户名) 具有重复的条目,应该会导致您的触发器引发错误。


替代方案与您的方法有点相似,但很多人不会认可它,所以我通常不会推荐它...

IF EXISTS (
SELECT
users.Username
FROM
users
WHERE
users.Username = ANY (SELECT username FROM inserted)
GROUP BY
users.Username
HAVING
COUNT(*) > 1
)

ANY 关键字很少使用,但确实如其名。它允许将单个值与一组值进行比较。


最后,如果您的表有一个 IDENTITY 列,您可以通过明确声明您不想将某行与其自身进行比较来避免 GROUP BY ...

IF EXISTS (
SELECT
users.Username
FROM
users
INNER JOIN
inserted
ON inserted.Username = users.Username
AND inserted.id <> users.id
)

关于SQL 服务器 : trigger firing every time,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48139238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com