我有一个简单的日志记录脚本,该脚本会从触发器中填充变更日志表,我试图通过排除某些模式(chi)的插入来限制插入的行
触发:
DECLARE @data XML
SET @data = EVENTDATA()
INSERT INTO [dbo].[Object_ChangeLog](databasename, eventtype, objectname, objecttype, sqlcommand, loginname)
VALUES (@data.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'varchar(256)'),
@data.value('(/EVENT_INSTANCE/EventType)[1]', 'varchar(50)'),
@data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(256)'),
@data.value('(/EVENT_INSTANCE/ObjectType)[1]', 'varchar(25)'),
@data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'varchar(max)'),
@data.value('(/EVENT_INSTANCE/LoginName)[1]', 'varchar(256)'))
我需要使用where子句来过滤模式名称(chi)下的对象更改-到目前为止,我已经尝试过:
WHERE
@data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(256)') NOT LIKE 'chi%'
不幸的是,这会产生语法错误,有两个问题,首先是我需要从事件数据中带出一个单独的列来识别模式吗?其次,我该如何利用where子句从触发器中的插入内容中删除这些内容。
答案 0 :(得分:1)
由于这似乎是程序代码,因此您可以简单地使用IF
。
...
IF @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(256)') NOT LIKE 'chi%'
BEGIN
INSERT INTO [dbo].[Object_ChangeLog](databasename, eventtype,
objectname, objecttype, sqlcommand, loginname)
VALUES(
@data.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'varchar(256)'),
@data.value('(/EVENT_INSTANCE/EventType)[1]', 'varchar(50)'),
@data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(256)'),
@data.value('(/EVENT_INSTANCE/ObjectType)[1]', 'varchar(25)'),
@data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'varchar(max)'),
@data.value('(/EVENT_INSTANCE/LoginName)[1]', 'varchar(256)')
);
END;
...