使用触发器维护参照完整性

Using Trigger to maintain referential integrity

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

The Section relation

提前致谢!

让我们首先说明使用触发器而不是外键约束来强制执行关系完整性是最糟糕的做法。 RI 触发器很慢,它们不能很好地扩展,它们不能在多用户环境中工作,它们会在必须维护代码的可怜的 blighters 中引起不必要的挠头。

所以,这就是功能最差的触发器的样子:

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_IDs。