1
在SQL Server 2008R2中創建SQL審計時,如何將數據庫級審計操作組(例如.DELETE,INSERT,UPDATE)配置爲捕獲受影響的行數。在SQL審計中捕獲數據庫級審計操作的行數(DELETE,INSERT,UPDATE)
在SQL Server 2008R2中創建SQL審計時,如何將數據庫級審計操作組(例如.DELETE,INSERT,UPDATE)配置爲捕獲受影響的行數。在SQL審計中捕獲數據庫級審計操作的行數(DELETE,INSERT,UPDATE)
您無法在使用SQL Server 2008 R2的審覈日誌中跟蹤此事。sys.fn_get_audit_file返回審覈中跟蹤的所有值以及受影響的行數未包含在該項目列表中。
在SQL Server 2012中,您可以使用sp_audit_write和一個觸發器來執行此操作。
CREATE TRIGGER [dbo].[ChangeMonitor] ON [dbo].[TableToTrack]
AFTER INSERT, UPDATE, DELETE
AS
DECLARE
@InsertCount INT
,@DeleteCount INT
,@msg NVARCHAR(4000)
select @DeleteCount = COUNT(*)
from deleted d
select @InsertCount = COUNT(*)
from inserted i
IF @InsertCount = @DeleteCount
BEGIN
SET @msg = @InsertCount +' Records Updated'
EXEC sp_audit_write @user_defined_event_id = 27 ,
@succeeded = 1
, @user_defined_information = @msg;
END
IF @InsertCount > @DeleteCount
BEGIN
SET @msg = @InsertCount +' Records Inserted'
EXEC sp_audit_write @user_defined_event_id = 27 ,
@succeeded = 1
, @user_defined_information = @msg;
END
IF @DeleteCount > @InsertCount
BEGIN
SET @msg = @DeleteCount +' Records Deleted'
EXEC sp_audit_write @user_defined_event_id = 27 ,
@succeeded = 1
, @user_defined_information = @msg;
END
GO
經過一些修改的觸發器仍然可以在SQL Server 2008 R2可以用於跟蹤受影響的行數,你就不會成爲能夠使用審計日誌,你可以創建自己的日誌表並寫入信息你想要那個日誌表。
通過觸發器可以訪問兩個臨時表插入和刪除的表結構,這兩個表與源表完全相同。插入包含插入的所有新記錄,刪除包含已刪除的所有記錄。表格在事件之後被清除,所以它不是您可以在引發觸發器的事件之外進行交互的東西。
在觸發器中使用EVENTDATA()可以獲得有關觸發事件的信息。
CREATE TRIGGER [dbo].[ChangeMonitor] ON [dbo].[TableToTrack]
AFTER INSERT, UPDATE, DELETE
AS
DECLARE
@InsertCount INT
,@DeleteCount INT
,@msg NVARCHAR(4000)
,@data XML
,@PostTime DATETIME
,@User NVARCHAR(100)
,@EventType NVARCHAR(100)
,@TSQL NVARCHAR(4000)
SET @data = EVENTDATA();
SET @PostTime = GETDATE()
SET @User = CONVERT(nvarchar(100), CURRENT_USER)
SET @EventType = @data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)')
SET @TSQL = @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(2000)')
select @DeleteCount = COUNT(*)
from deleted d
select @InsertCount = COUNT(*)
from inserted i
IF @InsertCount = @DeleteCount
BEGIN
-- SQL for logging updates
END
IF @InsertCount > @DeleteCount
BEGIN
-- SQL for logging inserts
END
IF @DeleteCount > @InsertCount
BEGIN
-- SQL for loggin deletes
END
GO