Oracle触发器中NOT IN匹配部分字符串失效,求正确用法
Oracle触发器中处理前缀字符串排除的正确写法
你原来的触发器逻辑失效,核心原因是IN操作符仅支持精确值匹配,'AAA%'里的%会被当作普通字符而非通配符。比如当PRINCIPAL为AAA123时,'AAA123' NOT IN ('AAA%', 'BBB%')的结果是true,所以触发器仍会执行插入操作。
要实现“排除以AAA或BBB开头的PRINCIPAL”,可以用以下两种方式:
方式一:使用NOT LIKE组合判断
LIKE是Oracle中用于模糊匹配的操作符,%在这里才会被识别为通配符。需要分别对每个前缀进行排除:
CREATE OR REPLACE TRIGGER ACT_SESSION_AUDIT_TRIGGER AFTER INSERT OR UPDATE ON ACT_SESSION FOR EACH ROW BEGIN -- 修正后的条件判断 IF (:NEW.PROTOCOL IN ('HTTP', 'SFTP')) AND (:NEW.PRINCIPAL NOT LIKE 'AAA%' AND :NEW.PRINCIPAL NOT LIKE 'BBB%') THEN INSERT INTO ACT_SESSION_AUDIT (PRINCIPAL, CON_START_TIME, DIS_END_TIME, ADAPTER_NAME, ADAPTER_TYPE, PROTOCOL) VALUES(:NEW.PRINCIPAL, :NEW.CON_START_TIME, :NEW.DIS_END_TIME, :NEW.ADAPTER_NAME, :NEW.ADAPTER_TYPE, :NEW.PROTOCOL); END IF; END;
方式二:使用正则表达式REGEXP_LIKE
如果需要匹配的前缀较多,用正则表达式会更简洁:
CREATE OR REPLACE TRIGGER ACT_SESSION_AUDIT_TRIGGER AFTER INSERT OR UPDATE ON ACT_SESSION FOR EACH ROW BEGIN -- 正则表达式匹配以AAA或BBB开头的字符串,取反后作为判断条件 IF (:NEW.PROTOCOL IN ('HTTP', 'SFTP')) AND NOT REGEXP_LIKE(:NEW.PRINCIPAL, '^(AAA|BBB)') THEN INSERT INTO ACT_SESSION_AUDIT (PRINCIPAL, CON_START_TIME, DIS_END_TIME, ADAPTER_NAME, ADAPTER_TYPE, PROTOCOL) VALUES(:NEW.PRINCIPAL, :NEW.CON_START_TIME, :NEW.DIS_END_TIME, :NEW.ADAPTER_NAME, :NEW.ADAPTER_TYPE, :NEW.PROTOCOL); END IF; END;
内容的提问来源于stack exchange,提问作者user3478415
相关产品推荐
相关产品推荐

