2017-04-06 33 views
0

我創建了這個觸發器來防止重複acct#被添加。但是,當我通過插入一個重複的ACCT#測試的觸發,我得到了錯誤PLSQL_trigger重複一個#有錯誤

唯一約束(JL.PK.ACCOUNT)違反

請幫助。

create or replace trigger update_acct# 
    before insert or update on ACCOUNT 
    for each row 
    declare 
     v_cta# NUMBER; 

    begin 
     select count(A#) into v_cta# from account where A#=:new.A#; 
     if v_cta#>1 then 
      raise_application_error (-20105, 'DUPLICATE ACCOUNT NUMBER'); 
     end if; 
    end; 

回答

1

您應該如果條件:

--old code 
if v_cta#>1 then 
      raise_application_error (-20105, 'DUPLICATE ACCOUNT NUMBER'); 
end if; 

--new code 
if v_cta#>0 then 
    raise_application_error (-20105, 'DUPLICATE ACCOUNT NUMBER'); 
end if; 

當v_cta#等於1,那麼你的病情將無法正常工作

+0

非常感謝!它工作時,我從1改爲0計數。 – user7770852

2

,您的觸發沒有拋出的錯誤。它甚至沒有開火。

您沒有從提供的錯誤中發佈表定義,但它看起來像定義爲主鍵的A#列。當您嘗試插入重複行時,在驗證PK時拋出錯誤。您不必檢查重複項的主鍵:Oracle保證它是唯一的。

進一步你觸發你會得到一個「ORA-04091表名正在變異......」的錯誤。您無法在行級觸發器中引用觸發表。

+0

謝謝您的意見!我不明白「你不能在行級觸發器中引用觸發表。」 – user7770852

+0

觸發插入或更新ACCOUNT表的觸發器。因此,在該觸發器中,您無法從ACCOUNT中進行選擇,插入表(列)值(...)時存在例外情況,並且Oracle可以保證它爲單行。 – Belayer