我正在写ddl触发器来创建和更改存储过程。如何在ddl触发器触发时获取存储过程的脚本?
对于创建存储过程触发器,我想获取create语句的脚本。对于更改存储过程触发器,我想获取新的“创建存储过程”语句而不是alter语句。
有没有办法做到这一点?对于第一个,我知道eventdata()可以做到。但对于第二个,我不确定。
我正在写ddl触发器来创建和更改存储过程。如何在ddl触发器触发时获取存储过程的脚本?
对于创建存储过程触发器,我想获取create语句的脚本。对于更改存储过程触发器,我想获取新的“创建存储过程”语句而不是alter语句。
有没有办法做到这一点?对于第一个,我知道eventdata()可以做到。但对于第二个,我不确定。
在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触发器执行任何策略)之前捕获“after”图像。 (2)STUFF方法取决于前5个字符是'ALTER'。如果你在CREATE/ALTER语句之前做了非标准的事情,比如在CREATE/ALTER语句之前放置注释,或者在CREATE/ALTER之前放置了回车符或其他空格,那么你必须做相应的调整。第一种方法在这方面更安全。 –
什么你可以使用哪些技术? TSQL? CLR?其他.NET? – JNK
所以你不喜欢DDL触发器捕获ALTER命令?你不能使用'STUFF(cmd,1,5,'CREATE')'将它转换为CREATE命令吗? –
@JNK它是TSQL。 –