如何为db中的所有表设置数据库审计规范

时间:2010-10-07 14:32:57

标签: sql sql-server sql-server-2008 audit

我需要创建一个审计来跟踪数据库中所有表的所有CRUD事件, 现在我在DB中有超过100个表,有没有办法创建包含DB中所有表的规范?

P.S:我正在使用SQL Server 2008

3 个答案:

答案 0 :(得分:1)

我有同样的问题。答案实际上比预期的简单,并且不需要自定义C#应用程序来生成大量SQL来覆盖所有表。下面的示例SQL。重要的是为INSERT / UPDATE / DELETE指定数据库和公共。

USE [master]
GO

CREATE SERVER AUDIT [CancerStatsAudit]
TO FILE 
(   FILEPATH = N'I:\CancerStats\Audit\'
    ,MAXSIZE = 128 MB
    ,MAX_ROLLOVER_FILES = 64
    ,RESERVE_DISK_SPACE = OFF
)
WITH
(   QUEUE_DELAY = 1000
    ,ON_FAILURE = CONTINUE
    ,AUDIT_GUID = '5a0a18cf-fe42-4171-ad01-5e19af9e27d1'
)
ALTER SERVER AUDIT [CancerStatsAudit] WITH (STATE = ON)
GO

USE [CancerStats]
GO

CREATE DATABASE AUDIT SPECIFICATION [CancerStatsDBAudit]
FOR SERVER AUDIT [CancerStatsAudit]
ADD (INSERT ON DATABASE::[CancerStats] BY [public]),
ADD (UPDATE ON DATABASE::[CancerStats] BY [public]),
ADD (DELETE ON DATABASE::[CancerStats] BY [public]),
ADD (EXECUTE ON DATABASE::[CancerStats] BY [public]),
ADD (DATABASE_OBJECT_CHANGE_GROUP),
ADD (SCHEMA_OBJECT_CHANGE_GROUP)
WITH (STATE = ON)
GO

注意:审核INSERT,UPDATE和DELETE不需要DATABASE_OBJECT_CHANGE_GROUP和SCHEMA_OBJECT_CHANGE_GROUP - 请参阅下面的其他说明。

附加说明:

上面的示例还包括DATABASE_OBJECT_CHANGE_GROUP和SCHEMA_OBJECT_CHANGE_GROUP。这些都包含在内,因为我的要求是跟踪数据库对象上的CREATE / ALTER / DROP操作。值得注意的是,这些文档是错误的。 https://docs.microsoft.com/en-us/sql/relational-databases/security/auditing/sql-server-audit-action-groups-and-actions

上面的页面说明DATABASE_OBJECT_CHANGE_GROUP跟踪CREATE,UPDATE和DELETE。这不是真的(我已经在SQL Server 2016中测试过),只跟踪了CREATE,请参阅: https://connect.microsoft.com/SQLServer/feedback/details/370103/database-object-change-group-audit-group-does-not-audit-drop-proc

实际上,要跟踪CREATE,UPDATE,DELETE,请使用SCHEMA_OBJECT_CHANGE_GROUP。尽管上面的docs.microsoft.com文档页面建议这仅适用于模式,但它实际上也适用于模式中的对象。

答案 1 :(得分:0)

更改数据捕获

您可以使用SQL Server 2008提供的更改数据捕获功能机制。

http://msdn.microsoft.com/en-us/library/bb522489.aspx

请注意,这只会执行创建,更新和删除。

触发器和审核表

即使对于100个表,您也可以使用一个脚本来生成审计表和必要的触发器。请注意,这不是一个非常好的机制 - 除非触发器执行完成,否则将不会返回控件的速度。

答案 2 :(得分:0)

找到了一种创建数据库审计规范的方法, 编写了一个c#代码,动态生成所有表的sql语句以及我需要的所有操作并执行结果字符串。 坦率地说,如果要为多个表创建数据库审计规范,向导提供的帮助就完全没有了。