我使用的是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_INSERTED
和DATA_DELETED
)。我甚至不确定数据类型是否应该是XML,但是当某人
INSERTS
或UPDATES
(仅限新值),USER_DATA
的所有列上插入/更新的所有数据都应以某种方式合并到DATA_INSERTED
1}}。
DELETES
或UPDATES
(仅限旧值),USER_DATA
的所有列上删除/更新的所有数据都应以某种方式合并到DATA_DELETED
1}}。
有可能吗?
答案 0 :(得分:0)
Use the inserted and deleted Tables
DML触发器语句使用两个特殊的表:删除的表和 插入的表格。 SQL Server自动创建和管理 这些表格。您可以使用这些临时的,驻留内存的表 测试某些数据修改的效果并设置条件 用于DML触发器操作。你无法直接修改数据 表或执行数据定义语言(DDL)操作 表,例如CREATE INDEX。在DML触发器中,插入和 删除的表主要用于执行以下操作:扩展 表之间的参照完整性。在base中插入或更新数据 视图下的表。测试错误并根据错误采取行动 错误。找出之前和之前表的状态之间的差异 在数据修改之后,根据这种差异采取行动。
并且
从受影响的每一行返回信息或基于表达式的表达式 通过INSERT,UPDATE,DELETE或MERGE语句。这些结果可以 返回处理应用程序以用于此类事物 确认消息,存档和其他此类应用程序 要求。结果也可以插入表格或表格中 变量。此外,您可以捕获OUTPUT的结果 嵌套INSERT,UPDATE,DELETE或MERGE语句中的子句,以及 将这些结果插入目标表或视图中。
答案 1 :(得分:0)
刚发布,因为这就解决了我的问题。正如用户@SeanLange在我的帖子的评论中所说,他告诉我使用"audit"
,我不知道它存在。
谷歌搜索它,引导我到this Stackoverflow answer,其中第一个链接是一个创建触发器和"阴影"表格做了我需要的东西(它没有将所有值合并到一个列中,但它适合工作)。