为什么我的PLSQL触发器验证没有失败?

时间:2017-06-19 22:30:23

标签: plsql triggers uppercase

我正在编写一个简单的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;

1 个答案:

答案 0 :(得分:3)

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。我必须对第二次世界大战的评论说,这应该最有可能作为一个检查约束来实现。