如何绕过触发器?

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 触发器正在工作,但是当它从应用程序或服务(我不知道它是做什么的)定期工作时,我不知道看到日志表中的任何插入记录,我只能看到“删除”记录,即使它在开始时是空的。

我的结论是有一些方法可以绕过触发器,数据库中有很多触发器和存储过程,我不知道去哪里找。

所以,我的问题是如何绕过触发器?

Dav*_*oft 6

触发器不会在几种情况下运行。

1)显然如果触发器被禁用

2) 如果触发器被标记为NOT FOR REPLICATION并且 DML 是由复制分发代理发出的。

3) 如果用户具有 ALTER TABLE 权限并且正在执行 BULK INSERT、BCP 或 SqlBulkCopy 等,同时禁用 FIRE_TRIGGERS 选项。