触发器不允许任何插入

时间:2014-05-22 13:55:05

标签: sql oracle plsql triggers

我写了一个触发器,不允许超过两个' Full'将教授列为教师的一部分(例如,如果增加一名新的(第三位)正教授,或者将现任副教授的职位更新为Full,则触发器应该触发。)

它确实编译但不让我知道将任何数据添加到我的表中。它只需要使用一次。我是否使用语句级别触发器? 此外,目前它不允许我更新或插入Rank教授,无论是Full还是Associate。我该如何解决这个问题?

我也被告知在之前/之后,我的比较逻辑是错误的。请帮忙!

这是触发器:

CREATE OR REPLACE TRIGGER TRG_PROF_RANK
after insert or update of F_RANK
on FACULTY

DECLARE
FULL_RANK_COUNT integer;
MAX_FULL_RANK_COUNT number :=2;

begin 
select count(*) into FULL_RANK_COUNT
from FACULTY 
where F_RANK ='Full';

if FULL_RANK_COUNT < MAX_FULL_RANK_COUNT
then 
return;
else 

if (FULL_RANK_COUNT >= MAX_FULL_RANK_COUNT) then
RAISE_APPLICATION_ERROR (-20000, 'Can only have 2 professors with ranking "Full".');
end if;
end if;
end;
/

我用以下语句测试它:

insert into FACULTY values(6, 'John', 'Bonny', 'M', 13, '4079347153', 'Associate', 80000, 2, 6034, Null);

但它不允许我在表格中插入任何记录。这是我得到的错误:

Error starting at line : 240 in command -
insert into FACULTY values(6, 'John', 'Bonny', 'M', 13, '4079347153', 'Associate', 80000, 2, 6034, Null)
Error report -
SQL Error: ORA-20000: Can only have 2 professors with ranking "Full".
ORA-06512: at "IT337104.TRG_PROF_RANK", line 16
ORA-04088: error during execution of trigger 'IT337104.TRG_PROF_RANK'
20000. 00000 -  "%s"
*Cause:    The stored procedure 'raise_application_error'
           was called which causes this error to be generated.
*Action:   Correct the problem as described in the error message or contact
           the application administrator or DBA for more information.

请帮助,我只是为了确保我可以插入数据。

谢谢

1 个答案:

答案 0 :(得分:0)

查询应该引发变异表错误,因此触发器根本不应该执行。您无法在该表上写入的触发器中查询表。您必须在其他地方保留完整教授职位的数量,或者在发出插入或更新之前在您的应用程序代码中执行测试。这是任何数据完整性检查的问题,该检查依赖于同一个表的其他行中的数据,当然,除了UNIQUE约束之外。它根本无法在该表的触发器内完成。

但即使你可以,你也有一个重大的逻辑错误。如果你的表已经包含两位完整的教授,那么这个触发器会阻止所有插入和更新表,即使它们不涉及完整的教授。

但并非一切都没有丢失。如果您修复了逻辑缺陷,请将触发器转换为每行的before触发器,检查:new.F_RANK的内容并采取相应措施,您可以在此处找到一个您可能想要查看的解决方案:{{ 3}}。 (物化视图的第二个答案,而不是第一个答案。)