Sybase ASE与SQL Server触发器差异及兼容改造方案咨询
Sybase ASE到SQL Server触发器兼容改造方案
问题背景
- Sybase ASE 12.5中,触发器内的
IF UPDATE(Colname)仅在字段被更新时返回true - SQL Server中,该语句在插入或更新字段时都会返回true
- 需求:不拆分插入/更新触发器,让SQL Server触发器行为与ASE一致
可行改造方案
基础兼容方案
用deleted表的存在性判断区分更新/插入操作,替换原有的IF UPDATE(Colname):
IF UPDATE(Colname) AND EXISTS(SELECT 1 FROM deleted) <do stuff>
逻辑说明:
UPDATE(Colname):确保字段被赋值(插入或更新场景都会触发)EXISTS(SELECT 1 FROM deleted):仅当是更新操作时成立(插入场景下deleted表为空)
严谨版方案(检测字段值实际变化)
如果需要确保仅当字段值真正发生改变时才执行逻辑(避免字段被赋值但值未变化的场景),可以结合主键对比inserted和deleted表的字段值:
IF UPDATE(Colname) AND EXISTS( SELECT 1 FROM inserted i JOIN deleted d ON i.你的主键字段 = d.你的主键字段 WHERE i.Colname <> d.Colname ) <do stuff>
注意:将你的主键字段替换为目标表的实际主键字段。
内容的提问来源于stack exchange,提问作者Eric Brown - Cal
相关产品推荐
相关产品推荐

