嗨,我想在我的数据库中创建更新触发器。 但每次触发器触发时我都会收到此错误。
错误消息:更新或删除的行值不会使行唯一,也不会改变多行(3行)
并且继承了我的触发器
ALTER TRIGGER [dbo].[x1pk_qp_update]
ON [dbo].[x1pk] FOR UPDATE
AS
BEGIN TRY
DECLARE @UserId int
, @PackareKod int
, @PersSign varchar(10)
SELECT @PackareKod = q_packarekod
, @PersSign = q_perssign
FROM INSERTED
IF @PersSign IS NOT NULL
BEGIN
IF EXISTS (SELECT * FROM [QPMardskog].[dbo].[UserAccount] WHERE [Account] = @PackareKod)
BEGIN
SET @UserId = (SELECT [UserId]
FROM [QPMardskog].[dbo].[UserAccount]
WHERE [Account] = @PackareKod)
UPDATE [QPMardskog].[dbo].[UserAccount]
SET [Active] = 1
WHERE [Account] = @PackareKod
UPDATE [QPMardskog].[dbo].[User]
SET [Active] = 1
WHERE [Id] = @UserId
END
END
END TRY
但我只更新表中的一行,它怎么说3行。请指教。
答案 0 :(得分:6)
嗯,你在这里的陈述:
SELECT @PackareKod = q_packarekod, @PersSign = q_perssign
FROM INSERTED
似乎假设将为update语句中的每一行调用UPDATE触发器。那是不的情况 - UPDATE触发器只会被调用一次,而Inserted
伪表包含三行。
因此,您需要更改逻辑,以便能够处理Inserted
表中的多个条目。
答案 1 :(得分:0)
你需要将它作为SET处理,它应该只是两个UPDATE语句,没有变量,没有IF
s,所有必要的条件都在UPDATE join和WHERE逻辑中:
ALTER TRIGGER [dbo].[x1pk_qp_update]
ON [dbo].[x1pk] FOR UPDATE
AS
BEGIN TRY
UPDATE u
SET [Active] = 1
FROM [QPMardskog].[dbo].[UserAccount] u
INNER JOIN INSERTED i ON u.[Account]=i.q_packarekod
WHERE i.q_perssign IS NOT NULL
UPDATE u
SET [Active] = 1
FROM [QPMardskog].[dbo].[User] u
WHERE [Id] IN (SELECT [UserId]
FROM [QPMardskog].[dbo].[UserAccount]
WHERE [Account] IN (SELECT q_packarekod
FROM INSERTED
WHERE q_perssign IS NOT NULL
)
)
END TRY
如果我正确地翻译了IF并加入了逻辑,那么这应该处理一次更新的[dbo]。[x1pk]的1行和/或多行。