2009-10-05 70 views
4

獲得過程文本我創建一個觸發器來跟蹤過程文本已經ALTER版。如何改變之前,DDL觸發器

在數據庫DDL觸發器中, 可以通過/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 

回答

2

觸發運行更改之後,所以據我可以告訴有是「之前」值的訪問權限。 EVENTDATA()被定義並且沒有爲「previous」提供。因此,您只需在日誌中記錄當前值即可。但是,如果預填充日誌使用此命令:

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 [email protected]('(/EVENT_INSTANCE/ObjectName)[1]', 'nvarchar(max)') 
       --modify as necessary AND type='P' 

end 
GO 
+0

@KM:「m.definition」返回當前文本,而不是以前的文本。我也嘗試過「sp_helptext」來返回值,但沒有成功。 – Sung 2009-10-05 19:01:02

+0

謝謝,KM。我想我需要制定一個不同的計劃,以便按照我的要求工作。 – Sung 2009-10-06 13:12:27