【问题标题】:Trigger to log inserted/updated/deleted values SQL Server 2012触发器以记录插入/更新/删除的值 SQL Server 2012
【发布时间】:2016-11-04 17:19:51
【问题描述】:

我正在使用 SQL Server 2012 Express,因为我真的习惯了 PL/SQL,所以很难找到一些 T-SQL 问题的答案。

我所拥有的:大约 7 个具有不同列的表和一个用于记录其他 7 个插入/更新/删除值的附加表。

问题:我如何为每个表创建一个触发器,以便它将修改后的数据存储在 Log 表上,考虑到我不能使用更改数据捕获,因为我使用的是 SQL Server Express 版?

其他信息:Logs 表中只有两列需要帮助填写;合并的所有列中的更改数据,示例如下:

CREATE TABLE USER_DATA
(
    ID INT IDENTITY(1,1) NOT NULL, 
    NAME NVARCHAR2(25) NOT NULL,
    PROFILE INT NOT NULL,
    DATE_ADDED DATETIME2 NOT NULL
)
GO

CREATE TABLE AUDIT_LOG
(
    ID INT IDENTITY(1,1) NOT NULL,
    USER_ALTZ NVARCHAR(30) NOT NULL,
    MACHINE SYSNAME NOT NULL,
    DATE_ALTERERED DATETIME2 NOT NULL,
    DATA_INSERTED  XML,
    DATA_DELETED XML
)
GO

我需要帮助填写的列是最后两列(DATA_INSERTEDDATA_DELETED)。我什至不确定数据类型是否应该是 XML,但是当有人

INSERTSUPDATES(仅限新值),在USER_DATA所有列 上插入/更新的所有数据都应该在DATA_INSERTED 上以某种方式合并。

DELETESUPDATES(仅限旧值),USER_DATA所有列 上删除/更新的所有数据都应该以某种方式合并到 DATA_DELETED 上。

有可能吗?

【问题讨论】:

  • 我希望对每个表进行审计,而不是对一个通用表进行审计。它使查看历史变得更加简单。如果您将所有内容都存储为 XML,则必须分解所有 XML 以查看历史记录。
  • @SeanLange 嘿,谢谢!我不知道“审计”。我在谷歌上搜索了它,并在this answer 的第一个链接上找到了我想要的解决方案(有点,必须根据我的需要修改一个程序)。请将其发布为答案,以便我接受。干杯!
  • 你链接的帖子几乎描述了我在说什么。我不关心分数,我不想为了获得分数而重写它。很高兴您找到了可行的解决方案。
  • 很高兴您写了评论,让您了解什么是“审计”!

标签: sql-server sql-server-2012-express


【解决方案1】:

Use the inserted and deleted Tables

DML 触发器语句使用两个特殊表:已删除表和 插入的表。 SQL Server 自动创建和管理 这些表。您可以使用这些临时的、驻留在内存中的表来 测试某些数据修改的效果并设置条件 用于 DML 触发操作。不能直接修改数据 表或执行数据定义语言 (DDL) 操作 表,例如 CREATE INDEX。在 DML 触发器中,插入的和 删除的表主要用于执行以下操作: 扩展 表之间的参照完整性。在基础中插入或更新数据 视图下的表。测试错误并根据 错误。查找表状态之前和之前的差异 在数据修改后并根据该差异采取行动。

还有

OUTPUT Clause (Transact-SQL)

从受影响的每一行返回信息或表达式 通过 INSERT、UPDATE、DELETE 或 MERGE 语句。这些结果可以 返回到处理应用程序以用于以下用途 确认消息、归档和其他此类应用程序 要求。结果也可以插入到表格或表格中 多变的。此外,您可以捕获 OUTPUT 的结果 嵌套的 INSERT、UPDATE、DELETE 或 MERGE 语句中的子句,以及 将这些结果插入到目标表或视图中。

【讨论】:

    【解决方案2】:

    只是发布,因为这解决了我的问题。正如用户@SeanLange 在我的帖子中所说的那样,他告诉我使用"audit",我不知道它存在。

    谷歌搜索,带我到this Stackoverflow answer,其中第一个链接有一个创建触发器和“影子”表的过程,可以满足我的需要(它没有将所有值合并到一个列中,但它适合工作)。

    【讨论】:

      猜你喜欢
      • 2010-12-17
      • 2016-01-30
      • 1970-01-01
      • 1970-01-01
      • 2012-01-20
      • 2011-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多