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