2014-05-22 60 views
0

我已經寫了一個觸發器,它不允許超過兩個'完整'排名的教授作爲教師的一部分(例如,如果添加新的(第三)完整教授或觸發器,觸發器應該觸發已更新爲全職副教授之一)觸發器不允許任何插入

它確實編譯,但不讓我知道添加任何數據到我的表中。它只需要使用一次。我爲此使用語句級觸發器嗎? 此外,目前它不允許我更新或插入Professor 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

你有'> ='我認爲你需要'>'。另外,你可能已經有兩位或更多的全職教授,即使插入的教授沒有完整排列,情況也會發生。您可能需要「引用新的as」子句(或Oracle SQL中的等價物)並檢查新插入的記錄是否是「完整」教授。從Full到Associate的變化應該總是OK(根據這個觸發器 - 另一個觸發器可能會堅持始終有至少一個完整的教授,儘管這可能過於熱心)。 –

回答

0

查詢應使觸發器不應該在所有的執行提出一個變異表錯誤。您無法從在該表上寫入的觸發器中查詢表。在發佈插入或更新之前,您必須保持其他地方的完整教授的數量或在您的應用程序代碼中執行測試。這是任何依賴於同一表的其他行中的數據的數據完整性檢查的問題,當然,除了UNIQUE約束之外。它不能從該表的觸發器內完成。

但即使你可以,你也有一個主要的邏輯錯誤。如果您的表格已經包含兩位正式教授,則即使這些觸發器不涉及正式教授,該觸發器也會阻止全部表格上的插入和更新。

但一切都不會丟失。如果您修復了邏輯缺陷,請將觸發器變爲每行觸發器before,檢查:new.F_RANK的內容並採取相應措施,您可能想要查看的一個解決方案可以在此處找到:Oracle; limit rows per column value。 (物化視圖的第二個答案,而不是第一個)