PL / SQL - 创建一个触发器,阻止更新/插入具有当前日期之后的日期的值

时间:2017-11-15 16:43:53

标签: sql oracle plsql

我需要找到一种方法来创建一个触发器,以防止在事故发生时间超过当前系统日期的情况下插入或更新事故。

表格代码:

create table Accident
(Report_nr  varchar2(4),
 Accident_date  date,
 Location   varchar2(20),
 primary key (Report_nr));

我的尝试(显然不完整)与伪代码

CREATE OR REPLACE TRIGGER trigger1
    BEFORE INSERT OR UPDATE ON accident
    FOR EACH ROW
DECLARE
    cur_date DATE := SYSDATE;
    e EXCEPTION;
BEGIN
    IF :new.accident_date <= cur_date THEN
        [allow insertion/update]
    ELSE
        [dont allow]
    END IF;
END;

我可能不会近距离接触,说实话这不是我的强项。任何帮助或指导将不胜感激。我在Oracle服务器上运行它。

1 个答案:

答案 0 :(得分:1)

你使它变得比它需要的复杂一点。默认情况下,插入发生,因此您只需要确定何时不应该,并在该点抛出异常导致惰性被拒绝;类似的东西:

CREATE OR REPLACE TRIGGER trigger1
    BEFORE INSERT OR UPDATE ON accident
    FOR EACH ROW
BEGIN
    IF :new.accident_date > SYSDATE THEN
        RAISE_APPLICATION_ERROR(-20001, 'Accident date cannot be in the future');
    END IF;
END;
/

今天的日期有效:

insert into accident values ('0001', date '2017-11-15', 'X');

1 row inserted.

明天没有:

insert into accident values ('0002', date '2017-11-16', 'Y');

Error starting at line : 18 in command -
insert into accident values ('0002', date '2017-11-16', 'Y')
Error report -
ORA-20001: Accident date cannot be in the future
ORA-06512: at "MY_SCHEMA.TRIGGER1", line 3
ORA-04088: error during execution of trigger 'MY_SCHEMA.TRIGGER1'

Read more about raising exceptions