这是一个非常糟糕的家庭作业问题。你永远永远不会触发我们在真实系统中做这样的事情。它会破坏大多数INSERT
操作,如果有多个用户,它将失败。实际上,您将使用约束。实际上,如果由于某种原因您被迫在枪口下使用扳机,您将需要一系列三个扳机、一个包和一个集合才能正确执行此操作。
教授可能在寻找什么
只是强调一下,你永远不会考虑在真实系统中这样做
create or replace trigger same_gift_given
before insert on giving
for each row
declare
l_existing_row giving%rowtype;
begin
select *
into l_existing_row
from giving
where giftname = :new.giftname
and rownum = 1;
dbms_output.put_line( :new.giftname ||
' has already been gifted to ' ||
l_existing_row.receiver ||
' from ' ||
l_existing_row.donor );
exception
when no_data_found
then
null;
end;
这不会阻止您插入重复的行。INSERT ... VALUES
如果您尝试在giving
桌子上做任何事情,它将引发变异触发器错误。这是低效的。它不处理多个会话。简而言之,这是绝对不应该在任何实际系统中使用的残暴代码。
你在现实中会做什么
实际上,您将创建一个约束
ALTER TABLE giving
ADD CONSTRAINT unique_gift UNIQUE( giftname );
这将在多用户环境中工作。它不会抛出变异触发器异常。它效率更高。它的代码要少得多。它实际上可以防止插入重复的行。