web-dev-qa-db-ja.com

監査-パラメータ値がログに書き込まれない

監査を使用して、データベース内の一部のプロシージャの使用状況を追跡しています。ログでは、実行中のプロシージャのレコードと、その直後に実行中のSQLステートメントを確認できます。ステートメントは、値ではなくパラメータ名を示します。つまり、WHERE CaseId=@P_CaseId のではなく WHERE CaseId =100

これを実現するSQL 2008(R2ではない)の修正プログラムがあることを知っています: http://support.Microsoft.com/kb/967552

これはR2に組み込まれませんでしたか?適用できる別の修正はありますか?誰かが知っている回避策はありますか?

4
Rikalous

SQL Server 2008 R2 Service Pack 3(v10.50.6000.34)で確認できます。単純なパラメーター化クエリdoを実行すると、パラメーター化された値が監査ログ。

次のように、簡単なテストリグをセットアップしました。

サーバー監査を作成します。

USE master;
IF NOT EXISTS (SELECT 1 FROM sys.server_audits sa WHERE sa.name = 'AuditTest')
BEGIN
    CREATE SERVER AUDIT AuditTest 
    TO FILE (FILEPATH = 'D:\SQLServer\MV\Audits', MAXSIZE = 2MB, MAX_ROLLOVER_FILES = 1, RESERVE_DISK_SPACE = ON)
    WITH (
        QUEUE_DELAY = 0
        , ON_FAILURE = CONTINUE
        , AUDIT_GUID = N'B126B4DD-3973-4993-9ADF-4D324A15A8A4'
    );
END
ALTER SERVER AUDIT AuditTest WITH (STATE = ON);
GO

監査を試すことができるデータベースを作成します。

IF EXISTS (SELECT 1 FROM sys.databases d WHERE d.name = N'AuditTest') 
BEGIN
    ALTER DATABASE AuditTest SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
    DROP DATABASE AuditTest;
END
CREATE DATABASE AuditTest;
ALTER DATABASE AuditTest SET RECOVERY SIMPLE;
BACKUP DATABASE AuditTest TO DISK = 'NUL:';
ALTER DATABASE AuditTest SET PARAMETERIZATION SIMPLE;
GO

データベースにテーブルを作成します。

USE AuditTest;
CREATE TABLE dbo.TestTable
(
    id int NOT NULL
        CONSTRAINT FK_TestTable
        PRIMARY KEY
        CLUSTERED
        IDENTITY(1,1)
    , someVal varchar(30) NOT NULL
);

データベース監査仕様を作成します。

CREATE DATABASE AUDIT SPECIFICATION AuditTestSpec
FOR SERVER AUDIT AuditTest
ADD (SELECT, INSERT, UPDATE, DELETE ON dbo.TestTable BY dbo)
WITH (STATE = ON);

ストアドプロシージャを作成し、監査アクションをトリガーします。

CREATE PROCEDURE dbo.AuditTest
(
    @t varchar(50)
)
AS
BEGIN
    INSERT INTO dbo.TestTable (someVal) --stored procedure
    VALUES (@t);
END
GO
EXEC dbo.AuditTest @t = 'runtime value not audited - procedure';
GO

直接パラメーター化されたテストを実行します。

DECLARE @t varchar(50);
SET @t = 'runtime value not audited - direct insert';
INSERT INTO dbo.TestTable (someVal) --direct insert
VALUES (@t);

SELECT *
FROM dbo.TestTable tt
WHERE tt.someVal = @t;

最後に、単純なパラメーター化テストを実行します。

INSERT INTO dbo.TestTable (someVal)
VALUES ('runtime value audited - direct stmt1');
GO
INSERT INTO dbo.TestTable (someVal)
VALUES ('runtime value audited - direct stmt2');
GO

上記の2つの単純なパラメーター化されたステートメントの実行プランは、単純なパラメーター化が期待どおりに機能していることを示しています。

enter image description here

カーソルとPRINTを使用して監査ログを読み取り、フォーマットを保持します。

USE master;
DECLARE @stmt nvarchar(max);
DECLARE cur CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY
FOR
SELECT af.statement
FROM fn_get_audit_file('D:\SQLServer\MV\Audits\AuditTest_B126B4DD-3973-4993-9ADF-4D324A15A8A4_*', default, default) af;
OPEN cur;
FETCH NEXT FROM cur INTO @stmt;
WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT @stmt;
    FETCH NEXT FROM cur INTO @stmt;
END
CLOSE cur;
DEALLOCATE cur;

結果:

INSERT INTO dbo.TestTable(someVal)-ストアドプロシージャ
 VALUES(@t); 
 INSERT INTO dbo.TestTable(someVal)--direct insert 
 VALUES(@t) ; 
 
 SELECT * 
 FROM dbo.TestTable tt 
 WHERE tt.someVal = @t; 
 
 INSERT INTO dbo。 TestTable(someVal)
 VALUES( 'runtime value audited-direct stmt1'); 
 INSERT INTO dbo.TestTable(someVal)
 VALUES( 'runtime value audited-direct stmt2') ;

上記の出力からわかるように、単純なパラメーター化されたステートメントのランタイム値が監査ログにキャプチャされました。

2
Max Vernon