使用触发器维护参照完整性
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。
我正在尝试为关系 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。