Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 2008 如何知道是否对表进行了更新/插入/删除_Sql Server 2008 - Fatal编程技术网

Sql server 2008 如何知道是否对表进行了更新/插入/删除

Sql server 2008 如何知道是否对表进行了更新/插入/删除,sql-server-2008,Sql Server 2008,我创建了一个名为表A的表,并创建了一个触发器来处理插入、更新和删除。现在为了处理我的下一步,我想知道DML采取了什么行动。如何知道是否已进行更新/插入/删除 非常感谢您的想法、反馈 在触发器内部,您可以使用两个特殊的表:INSERTED和DELETED。如果一行仅存在于插入的表中,则发生插入操作。同样,如果一行仅存在于DELETED表中,则会发生删除操作。如果两个表中都存在该行,则会发生更新,并且插入的表会保存新值,而删除的表会保存旧值 插入的行: SELECT i.* FROM INS

我创建了一个名为表A的表,并创建了一个触发器来处理插入、更新和删除。现在为了处理我的下一步,我想知道DML采取了什么行动。如何知道是否已进行更新/插入/删除


非常感谢您的想法、反馈

在触发器内部,您可以使用两个特殊的表:
INSERTED
DELETED
。如果一行仅存在于插入的
表中,则发生插入操作。同样,如果一行仅存在于
DELETED
表中,则会发生删除操作。如果两个表中都存在该行,则会发生更新,并且插入的
表会保存新值,而删除的
表会保存旧值

插入的行:

SELECT i.*
    FROM INSERTED i
        LEFT JOIN DELETED d
            ON i.PrimaryKey = d.PrimaryKey
    WHERE d.PrimaryKey IS NULL
已删除的行:

SELECT d.*
    FROM DELETED d
        LEFT JOIN INSERTED i
            ON d.PrimaryKey = i.PrimaryKey
    WHERE i.PrimaryKey IS NULL
更新的行:

SELECT *
    FROM INSERTED i
        INNER JOIN DELETED d
            ON i.PrimaryKey = d.PrimaryKey

或者为每个事件创建一个触发器,这是一个可能的解决方案。我想知道是否有一个地方可以让我们同时做这件事。最佳做法是什么?谢谢乔的回答。但当我试图编译触发器时,我得到一条错误消息,无效列PrimaryKey@SaiBand:
PrimaryKey
在我的示例中是一个虚构的列名。您需要替换表中实际主键列的名称。谢谢!在将主键替换为表中的实际主键后,该操作将起作用。干杯