Sql server T-SQL更新触发器帮助

Sql server T-SQL更新触发器帮助,sql-server,tsql,Sql Server,Tsql,嗨,我正在尝试在我的数据库中创建更新触发器。 但每次触发器触发时,我都会出现这个错误 错误消息:更新或删除的行值不会使该行唯一,或者会更改多行(3行) 这是我的扳机 ALTER TRIGGER [dbo].[x1pk_qp_update] ON [dbo].[x1pk] FOR UPDATE AS BEGIN TRY DECLARE @UserId int , @PackareKod int , @PersSign varchar(10) SEL

嗨,我正在尝试在我的数据库中创建更新触发器。 但每次触发器触发时,我都会出现这个错误

错误消息:更新或删除的行值不会使该行唯一,或者会更改多行(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行呢。请告知。

好吧,您的声明如下:

 SELECT @PackareKod = q_packarekod, @PersSign = q_perssign
 FROM INSERTED
似乎假定将为UPDATE语句中的每一行调用UPDATE触发器。事实并非如此-UPDATE触发器只调用一次,并且插入的
伪表包含三行


因此,您需要更改逻辑,以便能够处理插入的
表中的多个条目。

那么,您在这里的陈述:

 SELECT @PackareKod = q_packarekod, @PersSign = q_perssign
 FROM INSERTED
似乎假定将为UPDATE语句中的每一行调用UPDATE触发器。事实并非如此-UPDATE触发器只调用一次,并且插入的
伪表包含三行


因此,您需要更改逻辑,以便能够处理插入的
表中的多个条目。

您需要将其作为一个集合进行处理,它应该只有两个UPDATE语句,没有变量,没有
,如果
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和join逻辑,这将处理一次更新的[dbo].[x1pk]的1行和/或多行。

您需要将其作为一个集合处理,它应该只有两个UPDATE语句,没有变量,没有
If
s,所有必要的条件都在UPDATE join中,其中逻辑:

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和join逻辑,这将处理一次更新的[dbo].[x1pk]的1行和/或多行。

它可以更新1条以上的记录。您可以从最后一条记录中选择@PackareKod和@perSign。它可以更新1条以上的记录。您从最后一条记录中选择了@PackareKod和@perSign。不,它不起作用。我收到相同的错误消息:错误消息:更新或删除的行值不是使行唯一,就是更改了多行(3行)。我不明白为什么我会收到这个错误消息。我只更新了x1pk表中的一行。为什么是说3排。还有其他建议。感谢您的努力,.Nope it’s not work我收到相同的错误消息:错误消息:更新或删除的行值不是使行唯一,就是更改了多行(3行)。我不明白为什么我会收到这个错误消息。我只更新了x1pk表中的一行。为什么是说3排。还有其他建议。谢谢你的努力,。