監査を使用して、データベース内の一部のプロシージャの使用状況を追跡しています。ログでは、実行中のプロシージャのレコードと、その直後に実行中のSQLステートメントを確認できます。ステートメントは、値ではなくパラメータ名を示します。つまり、WHERE CaseId=@P_CaseId
のではなく WHERE CaseId =100
これを実現するSQL 2008(R2ではない)の修正プログラムがあることを知っています: http://support.Microsoft.com/kb/967552 。
これはR2に組み込まれませんでしたか?適用できる別の修正はありますか?誰かが知っている回避策はありますか?
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つの単純なパラメーター化されたステートメントの実行プランは、単純なパラメーター化が期待どおりに機能していることを示しています。
カーソルと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') ;
上記の出力からわかるように、単純なパラメーター化されたステートメントのランタイム値が監査ログにキャプチャされました。