4

手順テキストがどのようにALTER編集されたかを追跡するトリガーを作成しています。

データベースのDDLトリガー内では、を介して現在のプロシージャTextにアクセスできます/EVENT_INSTANCE/TSQLCommand

調査した後でもEVENTDATA()、以前の手順の定義の値は含まれていませんでしたALTER

DELETEDテーブルを使用してDMLトリガーの削除された値にアクセスする方法など、以前のテキストを取得する方法はありますか?

create trigger trgDDLAuditQuery
on  database
for     alter_procedure
as 
begin
    set nocount on;

    declare @data xml
    set @data = EVENTDATA()

    insert  dbo.tblQueryAudit(ObjectName, TSQLCommand)
    select  @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'nvarchar(256)'), 
        --; Only gets currently changed procedure text, not previous one
        @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(max)')
end
GO
4

1 に答える 1

2

トリガーは、変更が行われた後に実行されます。これは、「前」の値にアクセスできないことがわかる限りです。EVENTDATA()が定義されており、「前へ」のプロビジョニングはありません。その結果、現在の値をログに記録するだけで済みます。ただし、次のコマンドをログに事前入力する場合:

    INSERT INTO dbo.tblQueryAudit
            (ObjectName, TSQLCommand)
    SELECT
        o.Name,m.definition
        FROM sys.objects                 o
            INNER JOIN sys.sql_modules   m ON o.object_id=m.object_id
        WHERE type='P'

トリガーを使用しても、すべての変更の全体像を把握できます。ログには、以前のすべてのバージョンと、各プロシージャの現在のバージョンが含まれます。私のバージョンのトリガー(以下を参照)を使用すると、sys.objectsおよびsys.sql_modulesから他のいくつかの列にアクセスできます。

uses_ansi_nulls
uses_quoted_identifier
is_schema_bound
null_on_null_input
principal_id

これもログに記録するのに便利かもしれません。代替バージョン:

CREATE trigger trgDDLAuditQuery
on  database
for             alter_procedure
as 
begin
    set nocount on;

    DECLARE @EventData      xml
    SET @EventData=EVENTDATA()

    INSERT INTO dbo.tblQueryAudit
            (ObjectName, TSQLCommand) --hope you have  datetime column that defaults to GETDATE()
        SELECT
            o.Name,m.definition
            FROM sys.objects                 o
                INNER JOIN sys.sql_modules   m ON o.object_id=m.object_id
            WHERE o.Name=@EventData.value('(/EVENT_INSTANCE/ObjectName)[1]', 'nvarchar(max)')
                --modify as necessary AND type='P'

end
GO
于 2009-10-05T18:45:45.850 に答える