我正在为创建和更改存储过程编写ddl触发器。
对于create storage procedure trigger,我想获取create语句的脚本。对于alter storage procedure触发器,我想获取新的“create stored procedure”语句而不是alter语句。
有什么办法吗?对于第一个,我知道eventdata()可以做到。但对于第二个,我不确定。
答案 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 - 否则您希望在执行这些操作之前检查事件类型。)