2012-06-05 64 views
0

我正在写ddl触发器来创建和更改存储过程。如何在ddl触发器触发时获取存储过程的脚本?

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

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

+0

什么你可以使用哪些技术? TSQL? CLR?其他.NET? – JNK

+0

所以你不喜欢DDL触发器捕获ALTER命令?你不能使用'STUFF(cmd,1,5,'CREATE')'将它转换为CREATE命令吗? –

+0

@JNK它是TSQL。 –

回答

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

+0

只需注意以下两点:(1)假设您在代码有机会调用回滚(如果您试图通过DDL触发器执行任何策略)之前捕获“after”图像。 (2)STUFF方法取决于前5个字符是'ALTER'。如果你在CREATE/ALTER语句之前做了非标准的事情,比如在CREATE/ALTER语句之前放置注释,或者在CREATE/ALTER之前放置了回车符或其他空格,那么你必须做相应的调整。第一种方法在这方面更安全。 –