【问题标题】:How to get the script of the stored procedure when a ddl trigger fires?触发ddl触发器时如何获取存储过程的脚本?
【发布时间】:2012-06-05 18:58:13
【问题描述】:

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

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

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

【问题讨论】:

  • 您可以使用哪些技术? TSQL? CLR?其他.NET?
  • 所以你不喜欢 DDL 触发器捕获 ALTER 命令?您不能使用STUFF(cmd, 1, 5, 'CREATE') 将其转换为 CREATE 命令吗?

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


【解决方案1】:

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

【讨论】:

  • 只有几个警告:(1) 这假设您在代码有机会调用回滚之前捕获“之后”图像(以防您试图通过 DDL 强制执行任何策略扳机)。 (2) STUFF 方法取决于前 5 个字符为ALTER。如果您执行非标准操作,例如在 CREATE/ALTER 语句之前放置 cmets,或者在 CREATE/ALTER 之前放置回车符或其他空格,则必须进行相应调整。第一种方法在这方面更安全。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-05
  • 1970-01-01
  • 2013-01-22
  • 2018-01-18
  • 2013-09-12
  • 1970-01-01
  • 2013-12-30
相关资源
最近更新 更多