SHR*_*SHR 1 trigger sql-server
假设我有下表:
Create Table [dbo].[Test_IP]
(
[IP] varchar(40),
[IPType] varchar(6)
)
Run Code Online (Sandbox Code Playgroud)
这个表上有更多的触发器,但它们都是 AFTER 触发器,它是一个大数据库,有很多表、视图和存储过程,并且它被多个进程使用。
我添加了一个日志表和这样的触发器
Create Table [dbo].[Log_Test_IP]
(
[Action] varchar(10),
[IP] varchar(40),
[IPType] varchar(6)
)
GO
Create Trigger MYTR_Log_Test_IP_INS On [dbo].[Test_IP] After insert AS
BEGIN
insert into [dbo].[Log_Test_IP]([Action],[IP],[IPType])
select 'Insert', [IP], [IPType] from inserted
END
GO
Create Trigger MYTR_Log_Test_IP_DEL On [dbo].[Test_IP] After delete AS
BEGIN
insert into [dbo].[Log_Test_IP]([Action],[IP],[IPType])
select 'Delete', [IP], [IPType] from deleted
END
GO
Run Code Online (Sandbox Code Playgroud)
现在我进入了有趣的部分:当我直接插入到Test_IP表中时,我可以看到 Insert 触发器正在工作,但是当它从应用程序或服务(我不知道它是做什么的)定期工作时,我不知道看到日志表中的任何插入记录,我只能看到“删除”记录,即使它在开始时是空的。
我的结论是有一些方法可以绕过触发器,数据库中有很多触发器和存储过程,我不知道去哪里找。
所以,我的问题是如何绕过触发器?
触发器不会在几种情况下运行。
1)显然如果触发器被禁用
2) 如果触发器被标记为NOT FOR REPLICATION并且 DML 是由复制分发代理发出的。
3) 如果用户具有 ALTER TABLE 权限并且正在执行 BULK INSERT、BCP 或 SqlBulkCopy 等,同时禁用 FIRE_TRIGGERS 选项。