2010-10-07 84 views

回答

0

找到了一種創建數據庫審計規範的方法, 寫了一個c#代碼,動態生成所有表的sql語句以及我需要的所有操作並執行結果字符串。 坦白地說,如果您爲多個表創建數據庫審計規範,嚮導提供的根本沒有任何幫助。

0

變化數據捕捉

可以使用由SQL Server 2008

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

說明中提供的變更數據捕獲功能機制這隻會做創建,更新和刪除。

觸發器和審計表

即使是100桌,你可以使用一個腳本,將生成審計表和必要的觸發器。請注意,這不是一個非常好的機制 - 它會減慢控制,除非觸發器執行完成,否則不會返回。

+1

此功能需要企業版。 – 2010-10-07 14:49:17

0

我有同樣的問題。答案實際上比預期的簡單,並且不需要定製的C#應用​​程序來生成大量的SQL來覆蓋所有表。下面的示例SQL。重要的一點是爲INSERT/UPDATE/DELETE指定數據庫和public。不需要審覈INSERT,UPDATE和DELETE DATABASE_OBJECT_CHANGE_GROUP和SCHEMA_OBJECT_CHANGE_GROUP - 請參見下面的其他注意事項:

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 

NB。

其他備註:

上面的例子還包括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測試),只能造成被跟蹤,請參閱: https://connect.microsoft.com/SQLServer/feedback/details/370103/database-object-change-group-audit-group-does-not-audit-drop-proc

事實上,跟蹤創建,更新,刪除,使用SCHEMA_OBJECT_CHANGE_GROUP。儘管上述docs.microsoft.com文檔頁面暗示這隻適用於模式,但它實際上也適用於模式中的對象。