我有一个典型的网络应用程序,非常基于CRUD。当某些表或列发生变化时,我们需要存储有关它的历史信息。这可以是例如是一个AUDIT表,包含新/旧列值,时间戳,与之相关的表,更改它的用户名等等。
通常我已经实现了这个,例如with Triggers获取此信息并存储到AUDIT表。
但是,使用SQL Server 2016审核功能可以自动实现这一点吗?我想到了一些问题: 1)是否能够将审计数据存储在数据库表中,如上例中的触发器? 2)是允许读取数据的应用程序,还是访问审计数据需要一些特殊的管理凭据? 3)是否可以指定需要记录哪些信息,或者功能是否自动记录所有内容?
答案 0 :(得分:0)
您可以使用触发器跟踪数据库表上的数据更改 您可以在参考教程
中找到如何log sql table data changes using triggers的示例在这里,您需要知道,如果应用程序的用户映射到数据库上的单个用户,则必须在UPDATE,DELETE或INSERT命令中明确地将用户信息插入,更新或删除作为表字段值。否则,您获得的将是所有交易的同一用户
就像t emporal tables on SQL Server 2016一样,您需要手动使用或创建历史记录表或日志表
请检查以下SQL触发器代码
CREATE TRIGGER dbo.LogTbl
ON dbo.Tbl
AFTER INSERT, UPDATE, DELETE
AS
IF EXISTS (
SELECT * FROM Inserted
) -- INSERT or UPDATE
BEGIN
IF EXISTS (
SELECT * FROM Deleted
)
-- UPDATE Statement was executed
INSERT INTO HistoryTbl (
...
UpdatedDate,
UpdatedByUserId
)
SELECT
...
i.UpdatedDate,
i.UpdatedByUserId
FROM Deleted d
INNER JOIN Inserted i ON i.Id = d.Id
ELSE
-- INSERT Statement was executed
INSERT INTO HistoryTbl (
...
InsertedDate,
InsertedByUserId
)
SELECT
...
i.InsertedDate,
i.InsertedByUserId
FROM Inserted i
END
ELSE
-- DELETE Statement was executed
INSERT INTO HistoryTbl (
...
DeletedDate,
DeletedByUserId
)
SELECT
GETDATE(), ---!!!
USER_ID() ---!!!
FROM Deleted
GO
注意删除命令,在删除命令中我们没有删除用户数据。所以我使用了USER_ID(),你也可以使用USER_NAME()
另一种方法可以是,不是删除行,而是通过将ACTIVE列值更新为false来删除它。我的意思是UPDATE数据,你将它的活动字段设置为0,可以认为它被删除了。
因此,您必须通过仅选择活动数据来修改所有代码...