0

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

对于创建存储过程触发器,我想获取创建语句的脚本。对于更改存储过程触发器,我想获得新的“创建存储过程”语句而不是更改语句。

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

4

1 回答 1

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 - 否则您需要在执行这些操作之前检查事件类型。)

于 2012-06-05T19:07:52.797 回答