1

SQL Server 2008R2 で SQL 監査を作成する際に、データベース レベルの監査アクション グループ (DELETE、INSERT、UPDATE など) を構成して、影響を受ける行数を取得する方法。

4

1 に答える 1

0

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 で引き続きトリガーを使用して、影響を受ける行の数を追跡できます。監査ログを使用できなくなります。独自のログ テーブルを作成し、そのログ テーブルに必要な情報を書き込むことができます。 .

トリガーを介して、挿入および削除された 2 つの一時テーブルにアクセスできます。これら 2 つのテーブルのテーブル構造は、ソース テーブルと同じです。Inserted には、挿入されたすべての新しいレコードが含まれ、削除されたすべてのレコードが含まれます。テーブルはイベント後にクリアされるため、トリガーを引き起こしたイベントの外部で操作できるものではありません。

トリガーで 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
于 2013-08-30T03:55:34.273 に答える