【问题标题】:SQL Trigger - help with fundamentalsSQL 触发器 - 基础知识帮助
【发布时间】:2011-08-27 13:47:07
【问题描述】:

我很少写触发器。我可以使用帮助来设置这个东西。

CREATE TRIGGER audit_tableName
ON dbo.tableNameAudit
AFTER CREATE, UPDATE, DELETE on tableName
AS
BEGIN
  --Get Created,updated,deletes items
  INSERT into dbo.tableNameAudit(columns) VALUES ([allCUDitems])

END
GO

如何迭代导致触发的任何已创建、已更新、已删除的项目?

【问题讨论】:

    标签: sql triggers sql-server-2000


    【解决方案1】:

    查看this msdn article

    简而言之,有 2 个特殊表,插入和删除,可在您的触发器中访问。插入将包含更新的行和插入的行,而删除的将包含更新的行和删除的行。

    确保您了解,对于批处理操作,触发器只会触发一次,因此请务必处理这些表中存在多行的可能性。

    【讨论】:

    • @Remus Rusanu - 取得了很大进展。在观看 INSERT、UPDATE、DELETE 时,如何判断哪个操作触发了触发器?从我在文档中阅读的内容来看,我似乎需要在 INSERT 上使用inserted,在 UPDATE/DELETE 上使用deleted。我不关心 UPDATE 审计跟踪中的新值。
    • @P.Brian.Mackey,您可以使用 Update 函数,它接受一个列名并告诉您它是否已更新,或者您可以比较插入和删除的计数,如果它们'相同的是更新,或者您可以手动从已删除的行中选择插入和删除的值不匹配的行
    【解决方案2】:

    触发器可以访问两个pseudo tablesINSERTEDDELETED。顾名思义,这些伪表将包含从表中添加或删除的所有值。更新将导致每个伪表中出现一行。这些伪表的结构与声明该表的表的结构相同。

    此外,触发器内的 UPDATE() 函数将为已更新的列返回 TRUE。

    【讨论】:

    • 虽然我很确定信息会相似,但您的链接适用于 sql server 2008 r2,而不是 2000。
    【解决方案3】:

    您可以使用 INSERTED.[COLUMN] 或

    SELECT [COLUMN] 
    FROM INSERTED
    

    这在 SQL Server 上。

    希望对你有帮助。

    【讨论】:

    • @user728314 如果您突出显示代码并按{},您的代码将被格式化