sql server需显式指定schema、表名、触发器名且禁用后须验证is_disabled=1;postgresql必须在begin事务内执行alter table disable trigger并同会话导入;mysql无临时禁用语法,只能删重建触发器。

临时禁用触发器不是“关一下再开就行”,关键在于作用域是否可控、是否可逆、是否影响其他会话。SQL Server 和 PostgreSQL 的做法完全不同,MySQL 则根本没提供会话级禁用能力——选错方法会导致数据不一致或主从断裂。
SQL Server:DISABLE TRIGGER 语句必须带 schema + 表名 + 触发器名
漏掉任意一部分都会失败,而且命令成功不等于真正禁用了。
-
DISABLE TRIGGER dbo.trg_audit ON dbo.Orders—— 安全,显式指定 schema、触发器名、表名 -
DISABLE TRIGGER trg_audit ON Orders—— 危险,多 schema 环境下可能误操作OtherSchema.Orders -
DISABLE TRIGGER trg_audit—— 报错:Incorrect syntax near the keyword 'TRIGGER'(缺ON子句) - 触发器名含空格或特殊字符时,必须用方括号:
DISABLE TRIGGER [my trigger] ON [order details] - 执行后立刻查状态:
SELECT name, is_disabled FROM sys.triggers WHERE parent_id = OBJECT_ID('dbo.Orders'),is_disabled = 1才算生效
PostgreSQL:ALTER TABLE … DISABLE TRIGGER 必须在 BEGIN 事务内
默认每条命令自动提交,单独写 ALTER TABLE student DISABLE TRIGGER audit_log 后跟 COPY,触发器照常执行。
- 正确写法:
BEGIN;<br>ALTER TABLE student DISABLE TRIGGER audit_log;<br>COPY student FROM '/tmp/data.csv' WITH CSV;<br>ALTER TABLE student ENABLE TRIGGER audit_log;<br>COMMIT;
- 触发器名大小写敏感,查定义用:
\d+ student或SELECT tgname FROM pg_trigger JOIN pg_class ON tgrelid = pg_class.oid WHERE relname = 'student' -
ALTER TABLE student DISABLE TRIGGER ALL也有效,但风险更高,容易遗漏恢复 - 该操作只影响当前会话,不影响其他连接,适合脚本化导入
MySQL:没有临时禁用语法,只能删重建
SET SQL_LOG_BIN = 0 不跳过触发器,DISABLE KEYS 只影响索引,两者都无效。
- 导出原触发器:
SHOW CREATE TRIGGER audit_insert,保存建语句 - 删除:
DROP TRIGGER IF EXISTS audit_insert - 执行导入:
LOAD DATA INFILE或INSERT INTO ... SELECT - 重建:
CREATE TRIGGER audit_insert ...(注意需有TRIGGER权限) - 不能用于实时写入场景,仅适用于初始化或离线 ETL
最易被忽略的点是:SQL Server 的 DISABLE TRIGGER 默认全局生效,且不可回滚;PostgreSQL 的 DISABLE TRIGGER 虽然会话级安全,但必须和导入操作同事务;MySQL 则根本没有“临时”选项——三者底层机制不同,混用语法必踩坑。










