使用触发器维护引用完整性

时间:2018-12-11 10:55:42

标签: oracle plsql database-trigger referential-integrity

我正在尝试为关系Section上的任何插入编写SQL触发器,并且应该确保所插入的时隙ID值有效。

The Section relation

谢谢!

1 个答案:

答案 0 :(得分:1)

让我们开始说,使用触发器来强制关系完整性而不是外键约束是最糟糕的做法。 RI触发器很慢,它们不能很好地扩展,它们不能在多用户环境中工作,它们在必须维护代码的可怜的折磨者之间引起了不必要的麻烦。

因此,这是正常运行的最坏做法触发器的外观:

create or replace trigger section_timeslot_trg 
before insert or update on section
for each row
declare
    l_id timeslot.timeslot_id%type;
begin
    select ts.timeslot_id
    into l_id
    from timeslot ts
    where ts.timeslot_id = :new.timeslot_id;
exception
    when no_data_found then
        raise_application_error(-20999, 'Not a valid TIMESLOT_ID: '||:new.timeslot_id);
end;

请记住,在没有外键约束的情况下,需要在TIMESLOT上有一个相互触发,以防止更新和删除SECTION中使用的TIMESLOT_ID。