在从DDL触发器上更改之前,如何获取过程文本
-
19-09-2019 - |
题
我正在创建一个触发器来跟踪过程文本的样子 ALTER
ed。
在数据库DDL触发器中,可以通过 /EVENT_INSTANCE/TSQLCommand
.
即使在调查之后 EVENTDATA()
, ,它不包含以前对过程定义的值 ALTER
.
有没有一种方法可以检索以前的文本,例如如何使用DML触发器中的删除值 DELETED
桌子?
create trigger trgDDLAuditQuery
on database
for alter_procedure
as
begin
set nocount on;
declare @data xml
set @data = EVENTDATA()
insert dbo.tblQueryAudit(ObjectName, TSQLCommand)
select @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'nvarchar(256)'),
--; Only gets currently changed procedure text, not previous one
@data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(max)')
end
GO
解决方案
扳机在更改后运行,因此据我所知,无法访问“之前”值。 eventdata()已定义,没有为“以前”的规定。结果,您只需要在日志中记录当前值即可。但是,如果您使用此命令预处理日志:
INSERT INTO dbo.tblQueryAudit
(ObjectName, TSQLCommand)
SELECT
o.Name,m.definition
FROM sys.objects o
INNER JOIN sys.sql_modules m ON o.object_id=m.object_id
WHERE type='P'
您可以使用扳机,并且仍然可以完整地了解所有更改。您的日志将具有所有以前的版本以及每个过程的当前版本。您可以使用我的触发器版本(请参见下文),在其中您可以访问Sys.Objects和sys.sql_modules的其他一些列,例如:
uses_ansi_nulls
uses_quoted_identifier
is_schema_bound
null_on_null_input
principal_id
这可能也很方便登录。替代版本:
CREATE trigger trgDDLAuditQuery
on database
for alter_procedure
as
begin
set nocount on;
DECLARE @EventData xml
SET @EventData=EVENTDATA()
INSERT INTO dbo.tblQueryAudit
(ObjectName, TSQLCommand) --hope you have datetime column that defaults to GETDATE()
SELECT
o.Name,m.definition
FROM sys.objects o
INNER JOIN sys.sql_modules m ON o.object_id=m.object_id
WHERE o.Name=@EventData.value('(/EVENT_INSTANCE/ObjectName)[1]', 'nvarchar(max)')
--modify as necessary AND type='P'
end
GO
不隶属于 StackOverflow