我在使用CHECK约束时遇到问题。我有两张桌子
Users Table
userid | register_date
Activity table
id | userid | activity_date
我需要设置一个约束,禁止插入一个小于register_date的activity_date。如果它们在同一个表中,我可以使用CHECK约束。但是,你如何为两个不同的表做到这一点? (Oracle也禁止检查约束中的子查询。)
还有其他方法可以执行此操作吗?
答案 0 :(得分:0)
最简单的方法是触发:
create or replace trigger tr_activity
before update or insert of activity_date on activity
for each row
declare
l_register_date users.register_date%type;
begin
select register_date into l_register_date
from users
where id = :new.userid
;
if :new.activity_date < l_register_date then
raise_application_error(-20000, 'Stop attempting the impossible');
end if;
end tr_activity;
/
但是,这似乎有点奇怪;我假设您只是将当前日期插入活动日期,这意味着注册日期将始终在活动日期之前,除非之前已更新。我只是确保活动日期永远不会更新或插入您的应用程序代码中,并使用表中的默认值:
alter table activity modify activity_date default sysdate not null