2013-05-05 64 views
2

發現在其上的獨特的varchar主鍵Oracle:自動增量觸發器。

CREATE OR REPLACE TRIGGER "BI_PRIVILEGE" 
    before insert on "PRIVILEGE"    
    for each row 
begin 
    if :NEW."PRIVILEGE-ID" is null then 
    select "PRIVILEGE_SEQ".nextval into :NEW."PRIVILEGE-ID" from dual; 
    end if; 
end; 

這是一個自動號碼發生器阻擋插入數據庫以下觸發器?我可以很容易地禁用它來解決我的問題,但是會不會出現主鍵的負面分歧?

我實際上一直在尋找代碼來設置主鍵的自動增量觸發器,如果​​這是它正在做的事情,可以使用它作爲模板。如果是這樣,它可能做得不對,因爲主鍵特別是PRIVILEGE_ID而不是PRIVILEGE-ID,並且在衝突等情況下不應該出現某種類型的application_error

+0

你已經發現的問題,列名不正確。你爲什麼想禁用觸發器(這是一個自動增量)?你爲什麼不糾正錯誤的代碼? – Ben 2013-05-05 20:18:30

+0

@Ben因爲在這種情況下,主鍵是唯一的字符串。我無法想象在這種情況下自動增量可能是完全有用的。 – Stumbler 2013-05-05 20:24:12

+1

如果這個觸發器阻塞插入,那麼它肯定會被使用,所以禁用它可能不是最好的計劃。無論哪種方式,如果此觸發器可以阻止應用程序代碼,那麼值得考慮一下數據庫中是否存在任何事務問題。 – Ben 2013-05-05 22:37:11

回答

3

好吧,我想我知道發生了什麼。你的問題的答案是一個絕對巨大的是的。如果禁用此觸發器,可能會產生很大的影響。

這個觸發器似乎存在的原因是爲了處理主鍵值爲而不是在插入到表中時提供的情況。如果在您的代碼中出現任意位置,那麼刪除觸發器將會破壞這些插入。

你必須做兩件事。

  1. 修正觸發器,顯然是壞了;如果您正在使用Oracle 11g或

    CREATE OR REPLACE TRIGGER BI_PRIVILEGE 
        before insert on PRIVILEGE    
        for each row 
    begin 
        if :NEW.PRIVILEGE_ID is null then 
        select PRIVILEGE_SEQ.nextval into :NEW.PRIVILEGE_ID from dual; 
        end if; 
    end; 
    

    大於你可以使用它代替:修復它

    if :NEW.PRIVILEGE_ID is null then 
        :NEW.PRIVILEGE_ID := PRIVILEGE_SEQ.nextval; 
        end if; 
    
  2. 出這是否實際發生。如果你插入沒有主鍵的記錄,你需要找出原因以及行爲是否正確。如果這是你堅持觸發器,否則解決這個問題。如果你永遠不會插入沒有主鍵的記錄,那麼你可以禁用觸發器。

    找出最快的方法可能是禁用觸發器,但它會打破您的插入。如果這是一個生產數據庫,只有你可以告訴它是否值得。我不會親自。

+0

「不可空」足以保證主鍵始終與其他數據一起填充嗎? – Stumbler 2013-05-05 20:38:42

+0

主鍵總是被聲明爲NOT NULL @Duncan。這不是問題;是的,你保證了主鍵總是洋溢在但觸發器處理這些情況下,它的_not_填寫並完成自動爲您NOT NULL約束之前進行測試。您可以檢查列中是否有單個號碼。如果有,那麼之前可能已經使用過觸發器。 – Ben 2013-05-05 20:40:53

1

該腳本將從序列中獲取一個值,並將其放入表中新插入的行中。它的行爲非常類似於自動編號。我假設應用程序代碼依賴於此觸發器來填充插入行的主鍵,我不建議在評估應用程序的源代碼之前將其刪除。

除非有人忘記了這個實驗,否則應用程序代碼很可能取決於此觸發器/序列。

這是一個可接受的自動增量功能解決方案。請參閱:How to create id with AUTO_INCREMENT on Oracle?

1

「在這種情況下,主鍵是爲唯一的字符串。我不能 想象自動增量可能是在這方面 完全有用。「

如果你的意思是‘特權-ID’是一個VARCHAR2列那麼你的排序是正確的。在一方面,一些也可以是一個字符串,所以它會作爲重點工作。但如果密鑰應該具有特定格式的字母和數字,單調遞增的數字將不適合模式。

對於我來說,擔心的是IF語句,它暗示有時候密鑰會被填充該應用程序,並在其他時間由數據庫默認,這是凌亂。二話不說,有鑰匙的兩個來源指序列不再保證是唯一的。你現在有序列生成nextval可能性會與...碰撞先前手動分配的號碼。

怎麼辦?

如果您有與自動化單元或集成測試的良好覆蓋,開發環境,答案很簡單:禁用觸發器,運行測試套件,看看有什麼失敗。如果沒有描述您的設置(和我有沒有感覺),然後禁用該觸發器是高風險的,因爲你不能有你已經測試了所有可能填充表的路徑信心。