检查两个表的操作

时间:2013-11-17 17:25:33

标签: sql oracle oracle11g

我在使用CHECK约束时遇到问题。我有两张桌子

Users Table
userid | register_date 

Activity table
id | userid | activity_date

我需要设置一个约束,禁止插入一个小于register_date的activity_date。如果它们在同一个表中,我可以使用CHECK约束。但是,你如何为两个不同的表做到这一点? (Oracle也禁止检查约束中的子查询。)

还有其他方法可以执行此操作吗?

1 个答案:

答案 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