当ddl触发器触发时如何获取存储过程的脚本?

时间:2012-06-05 18:58:13

标签: sql-server-2008 stored-procedures ddl

我正在为创建和更改存储过程编写ddl触发器。

对于create storage procedure trigger,我想获取create语句的脚本。对于alter storage procedure触发器,我想获取新的“create stored procedure”语句而不是alter语句。

有什么办法吗?对于第一个,我知道eventdata()可以做到。但对于第二个,我不确定。

1 个答案:

答案 0 :(得分:3)

在DDL触发器中,您可以使用以下方法获取过程的“之后”图像:

DECLARE @EventData XML = EVENTDATA();

SELECT OBJECT_DEFINITION(OBJECT_ID(
   @EventData.value('(/EVENT_INSTANCE/SchemaName)[1]', 'NVARCHAR(255)')
   + '.' + 
   @EventData.value('(/EVENT_INSTANCE/ObjectName)[1]', 'NVARCHAR(255)')
));

因此,您可以将该输出分配给变量并使其成为插入的一部分(我假设您将此日志记录到某种DDL审计表中)。正如我在评论中建议的那样,您也可以这样做:

DECLARE @EventData XML = EVENTDATA();

SELECT STUFF(@EventData.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'NVARCHAR(MAX)'), 
  1, 5, 'CREATE');

(这些都假设您的DDL触发器仅限于ALTER_PROCEDURE - 否则您希望在执行这些操作之前检查事件类型。)