为什么我的 PLSQL 触发器验证不会因错误而失败?

Why is my PLSQL trigger validation not failing on error?

我正在编写一个简单的 PL/SQL 触发器来检查要插入或更新的值是否为 UPPER,触发器编译正常但在我插入或更新记录时不起作用。你有什么主意吗?谢谢

CREATE OR REPLACE TRIGGER check_case_trg
BEFORE
INSERT OR UPDATE
ON unidades_medidas
FOR EACH ROW
DECLARE
    e_invalid_case EXCEPTION;
BEGIN
    IF
        :NEW.unm_codigo <> UPPER(:NEW.unm_codigo) OR
        :NEW.unm_descripcion <> UPPER(:NEW.unm_descripcion)
        THEN
            RAISE e_invalid_case;
    END IF;
EXCEPTION
    WHEN e_invalid_case THEN
        DBMS_OUTPUT.PUT_LINE(
            'Nuevos datos deben estar en mayúsculas');
END check_case_trg;
/
SHOW ERRORS;

DBMS_OUTPUT 是一个调试工具 - 它不会引发错误或异常。

要确保您的触发器停止插入或更新,您必须确保引发异常。执行此操作的一个好方法是使用 RAISE_APPLICATION_ERROR,因为它使您可以控制向调用进程报告什么异常,例如:

CREATE OR REPLACE TRIGGER check_case_trg
BEFORE
INSERT OR UPDATE
ON unidades_medidas
FOR EACH ROW
BEGIN
    IF
        :NEW.unm_codigo <> UPPER(:NEW.unm_codigo) OR
        :NEW.unm_descripcion <> UPPER(:NEW.unm_descripcion)
        THEN
            RAISE_APPLICATION_ERROR(-20000, 'Nuevos datos deben estar en mayúsculas');
    END IF;
END check_case_trg;

p.s。我不得不赞同 WW 的评论,即这很可能应该作为对 table.

的检查约束来实现