Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server触发器—一个失败,一个不失败';T_Sql_Sql Server_Triggers - Fatal编程技术网

SQL Server触发器—一个失败,一个不失败';T

SQL Server触发器—一个失败,一个不失败';T,sql,sql-server,triggers,Sql,Sql Server,Triggers,我们有一个触发器,它是为一组大约40个表动态生成的。如果触发器位于表A上,则它会以两种方式修改表B: 在表B 在表B 这两个表之间有一个链接,使得abID是Bid的外键 本周我们发现至少有一个表的触发器没有执行步骤2(我们不确定它是否执行步骤1)。但它似乎在其他大多数桌子上都起作用 一时兴起,我们的一位开发人员将触发器更改为“更高效”。但随后问题似乎消失了 我们不太清楚这两个触发器之间有什么不同,有什么见解吗 触发器损坏: 工作触发器: [B]中是否有[id]的空值?如果是,则不在中将无法正常

我们有一个触发器,它是为一组大约40个表动态生成的。如果触发器位于表
A
上,则它会以两种方式修改表
B

  • 在表
    B
  • 在表
    B
  • 这两个表之间有一个链接,使得
    a
    bID
    B
    id
    的外键

    本周我们发现至少有一个表的触发器没有执行步骤2(我们不确定它是否执行步骤1)。但它似乎在其他大多数桌子上都起作用


    一时兴起,我们的一位开发人员将触发器更改为“更高效”。但随后问题似乎消失了

    我们不太清楚这两个触发器之间有什么不同,有什么见解吗

    触发器损坏:

    工作触发器:


    [B]中是否有[id]的空值?如果是,则
    不在
    中将无法正常工作。您需要更新到以下内容:

    INSERT INTO [B] ([id], [timeDirty])
        SELECT DISTINCT [bID], GETUTCDATE() FROM inserted
        WHERE [bID] NOT IN (SELECT [id] FROM [B] WHERE [id] IS NOT NULL)
    

    第一个查询使用
    [B].id
    ,第二个查询使用
    [B].guid
    进行加入。是印刷错误吗?对不起,那是印刷错误。我已经在问题中更正了它,[id]字段不可为空,因此不存在空值。
    CREATE TRIGGER [A_Dirty] ON [A] AFTER INSERT, UPDATE, DELETE
    BEGIN
        SET NOCOUNT ON;
    
        UPDATE [B] SET [timeDirty] = GETUTCDATE() FROM inserted WHERE [id] = [bID];
        UPDATE [B] SET [timeDirty] = GETUTCDATE() FROM deleted WHERE [id] = [bID];
    
        INSERT INTO [B] ([id], [timeDirty])
            SELECT DISTINCT [bID], GETUTCDATE()
                FROM inserted
            LEFT OUTER JOIN [B]
                ON [B].[id] = inserted.[bID]
            WHERE [B].[id] IS NULL
    END
    
    INSERT INTO [B] ([id], [timeDirty])
        SELECT DISTINCT [bID], GETUTCDATE() FROM inserted
        WHERE [bID] NOT IN (SELECT [id] FROM [B] WHERE [id] IS NOT NULL)