我写了一个触发器,不允许超过两个' 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.
请帮助,我只是为了确保我可以插入数据。
谢谢
答案 0 :(得分:0)
查询应该引发变异表错误,因此触发器根本不应该执行。您无法在该表上写入的触发器中查询表。您必须在其他地方保留完整教授职位的数量,或者在发出插入或更新之前在您的应用程序代码中执行测试。这是任何数据完整性检查的问题,该检查依赖于同一个表的其他行中的数据,当然,除了UNIQUE约束之外。它根本无法在该表的触发器内完成。
但即使你可以,你也有一个重大的逻辑错误。如果你的表已经包含两位完整的教授,那么这个触发器会阻止所有插入和更新表,即使它们不涉及完整的教授。
但并非一切都没有丢失。如果您修复了逻辑缺陷,请将触发器转换为每行的before
触发器,检查:new.F_RANK
的内容并采取相应措施,您可以在此处找到一个您可能想要查看的解决方案:{{ 3}}。 (物化视图的第二个答案,而不是第一个答案。)