审计表的轨道

时间:2017-08-23 05:08:18

标签: sql sql-server tsql audit

我想在特定的表上做审计跟踪 在表中插入,更新,删除的内容以及所有这些日志都保存在一个表中 我正在使用sql server 2012。 任何人都可以帮我解决这个问题吗?

请注意 - 使用光标限制

3 个答案:

答案 0 :(得分:0)

在该表上创建一个after触发器并将记录插入到日志表中。

create trigger <trigger_name> after insert/update/delete/ on 
table <orig table>
  begin
     insert into the log tables ('all the fields that you require');
  end 

答案 1 :(得分:0)

这可以使用Triggers来实现。如果您的表上发生了大量的插入,删除和更新操作,触发器将使您的DML操作变慢。如果它是小表,您可以创建如下所示的TRIGGER,根据发生的操作将行记录到另一个表。

您可以使用Inserted and Deleted魔术表来保存触发器中正在插入和删除的行。

如果您需要使用CDC (Change Data Capture)更多地控制审核,还有另一种替代方法。

CREATE TABLE TrailTable
(
    Id INT,
    Name VARCHAR(100)
);

CREATE TABLE TrailTableLog
(
    Id INT,
    Name VARCHAR(100),
    Action CHAR(3)
);


Insert Into TrailTable VALUES (1,'Vi');
Insert Into TrailTable VALUES (2,'Vr');
Insert Into TrailTable VALUES (3,'An');
Insert Into TrailTable VALUES (4,'Ma');

CREATE TRIGGER dbo.TRG_IDU_TrailTable
ON dbo.TrailTable
AFTER INSERT, UPDATE, DELETE
AS 
BEGIN
    SET NOCOUNT ON;

    DECLARE @Action as char(1);
    SET @Action = (CASE WHEN EXISTS(SELECT * FROM INSERTED)
                         AND EXISTS(SELECT * FROM DELETED)
                        THEN 'U'  -- Set Action to Updated.
                        WHEN EXISTS(SELECT * FROM INSERTED)
                        THEN 'I'  -- Set Action to Insert.
                        WHEN EXISTS(SELECT * FROM DELETED)
                        THEN 'D'  -- Set Action to Deleted.
                        ELSE NULL -- Skip. It may have been a "failed delete".   
                    END)

    IF(@Action = 'I')
    BEGIN
        INSERT INTO TRG_IDU_TrailTable (Id, Name, Action)
        SELECT Id, Name, 'I' FROM INSERTED;
    END

    IF(@Action = 'D')
    BEGIN
        INSERT INTO TRG_IDU_TrailTable (Id, Name, Action)
        SELECT Id, Name, 'D' FROM DELETED;
    END

    IF(@Action = 'U')
    BEGIN

        INSERT INTO TRG_IDU_TrailTable (Id, Name, Action)
        SELECT Id, Name, 'U-D' FROM INSERTED; -- Records Deleted to Update

        INSERT INTO TRG_IDU_TrailTable (Id, Name, Action)
        SELECT Id, Name, 'U-I' FROM INSERTED; --Records Inserted to Update
    END

END

答案 2 :(得分:0)

尝试使用CDC (Change Data Capture)。一个非常有用的工具,有助于管理审计跟踪

阅读MSDN

中的文章