触发记录插入/更新/删除的值SQL Server 2012

时间:2016-11-04 17:19:52

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

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

我拥有的内容:大约有7个包含不同列的表,另外一个用于记录其他7个插入/更新/删除的值。

问题:我如何为每个表创建一个触发器,以便将修改后的数据存储在Log表中,因为我无法使用变更数据捕获,因为我&# 39; m使用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 1}}。

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

有可能吗?

2 个答案:

答案 0 :(得分:0)

Use the inserted and deleted Tables

  

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

并且

OUTPUT Clause (Transact-SQL)

  

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

答案 1 :(得分:0)

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

谷歌搜索它,引导我到this Stackoverflow answer,其中第一个链接是一个创建触发器和"阴影"表格做了我需要的东西(它没有将所有值合并到一个列中,但它适合工作)。