SQL Server触发器无法直接跨服务事件触发,仅支持Service Broker(跨实例)或binlog解析(MySQL/跨平台)两种间接方案;链接服务器+分布式事务高危且不推荐。

ERROR 1371 (HY000))。
真正能落地的路径只有两条,取决于目标平台:
SQL Server 内部跨实例:必须用 Service Broker
这是唯一原生支持、事务内可控的异步出口:
- 触发器里只能执行
BEGIN DIALOG CONVERSATION+SEND ON CONVERSATION,消息进本地队列 - 消息体建议用
FOR JSON PATH序列化,避免字段类型歧义 - 必须配齐三要素:
CREATE MASTER KEY、CREATE ROUTE(ADDRESS填对方真实 IP+端口)、CREATE REMOTE SERVICE BINDING -
SEND块必须包在TRY...CATCH里,CATCH中只记日志,绝不能THROW,否则主事务失败
MySQL 或跨平台场景:触发器完全不可用,必须走 binlog 解析
MySQL 触发器连 SYS_EXEC() 都不支持,所有“调用远程服务”的尝试都会在语法层或权限层被拦截:
- 启用
binlog_format = ROW和binlog_row_image = FULL - 用
Debezium或Maxwell捕获变更,输出到 Kafka / HTTP / 文件 - 下游消费者负责对接目标服务(如调用 REST API、写入 Elasticsearch)
- 务必加幂等键(如
db_table_pk_ts),避免网络重试导致重复事件
链接服务器 + 分布式事务是高危方案,慎用
虽然语法上允许 INSERT INTO [RemoteServer].[DB].[Schema].[Table],但它不是“事件触发”,而是阻塞式同步写:
- 依赖 MS DTC,两台服务器都要开
Distributed Transaction Coordinator服务并配置网络访问 - 任意一环超时(网络抖动、远程库慢、DTC 不可用),本地 DML 就卡住甚至回滚
- 失败时本地事务仍可能提交,造成数据不一致——
SQL Server默认不回滚源操作 - 字段类型不一致会静默截断(如
nvarchar(50)→varchar(30)),查不到错误日志

















