MSSQL如何让触发器在特殊语句执行时不触发
第一种方法:临时表
- 在需要禁用触发器的存储过程当中定义一个特殊名称的局部临时表
- 在触发器当中使用
object_id(xxx)来检测是否存在来确定是否需要禁用触发器
第二种方法:context_info
理论基础
- context_info是局部的,类型是varbinary(128)的类型
- varbinary类型可以使用+来进行拼接,也就是说
0x11+0x12=0x1112 - 可以使用substring函数来进行截断,截断之后的结果仍然是varbinary
实现方法
- 生成guid
- 在需要禁用触发器的存储过程当中将生成的guid拼接到context_info当中
- 在触发器当中检测这个guid是否存在,使用
substring(context_info(),x,x)并判断是否和给定的二进制相等来实现(这里使用了上述第三点) - 示例代码
1 | |
第三种方法:使用session_context
这种方法只能在mssql 2016版本之后使用
实现方法
- 这种方式主要是引入了一个存储过程和一个函数
- 存储过程
sp_set_session_context,用于设置键值(可以指定是否只读) - 函数
session_context(N'xxx')用于获取值,获取出来的值的类型是sql_variant,需要手动转换 - 注意键必须是unicode的,必须加N前缀