【发布时间】:2017-07-31 20:43:18
【问题描述】:
我正在尝试向 cust_birthdate 添加一个约束,确保客户已超过 18 岁。
这是我的创建表语句
create table customer(
cust_id char(5) NOT NULL,
cust_name varchar(30),
cust_birthdate date,
primary key(cust_id)
);
我发现不能在约束中使用 SYSDATE,但是我在网上找到了一个适合我情况的触发器。
这是我修改的触发器:
CREATE OR REPLACE TRIGGER trgCustomer
BEFORE INSERT ON customer
FOR EACH ROW
BEGIN
IF(ADD_MONTHS(:new.cust_birthdate, 18 * 12) < sysdate ) THEN
RAISE_APPLICATION_ERROR(-20001, 'Customer must be at least 18 years old.' );
END IF;
END;
/
但是,当我插入这样的东西时,触发器将不起作用:
insert into customer values('C0001', 'Chek Wei', TO_DATE('20-OCT-2016', 'dd-MON-yyyy'));
'Chek Wei' 客户未满 18 岁,但未显示错误消息。
我还没有学过触发器,但是因为我不能在约束上使用 SYSDATE,所以我别无选择。
我的触发器有什么问题?
我正在使用 Oracle Database Express Edition 11g 第 2 版
感谢任何帮助。
【问题讨论】:
-
像这样将业务逻辑放入数据库是不好的做法,不推荐。
-
这个逻辑不是倒过来的吗?只有当您将 18 年添加到该日期大于 sysdate 时才会触发错误......