2015-12-08 35 views
2

我要丟失ORACLE中的現有觸發器。只有在DROP觸發器存在的情況下(ORACLE)

我知道drop查詢觸發器oracle。但想知道如何檢查該觸發器是否已存在於Oracle DB中。

DROP查詢:

DROP TRIGGER **TRIGGER_NAME** 
+0

這是什麼原因?您不能執行查詢,如果它不存在則會拋出一個錯誤。如果它存在,它將被丟棄。 – brenners1302

+0

您可以根據您的特權查詢'[user | all | dba] _triggers',無論您是否以觸發器的所有者身份登錄等。或者您可以簡單地刪除觸發器並捕獲異常。 –

+0

我是一個** delphi **開發人員,我從代碼創建了這個** DROP **查詢。所以這是我用** oracle query **來檢查它的原因。 –

回答

-1

你有兩個選擇:

1)檢查觸發存在

SELECT * 
    FROM user_triggers 
WHERE trigger_name = '...' 

2)跌落觸發和檢查異常

+0

我的機器上沒有安裝ORACLE DB。所以原諒我這個蹩腳的問題。我想知道,如果從代碼端執行查詢{DROP TRIGGER TRIGGER_NAME},它會拋出錯誤而不處理任何異常?所有我需要做的就是放棄扳機。我需要爲此添加例外嗎? –

+0

如果觸發器不存在並且您放棄它,則會出現異常。因此,您只需要混淆異常,導致'無論如何丟棄觸發':創建或替換觸發器my_trg 之前爲每行插入tmp 開始 null; 結束; BEGIN - 觸發器仍然存在 立即執行'DROP TRIGGER my_trg'; - 不再觸發,異常提出 立即執行'DROP TRIGGER my_trg'; EXCEPTION 何時其他 NULL; END; – hinotf

2

您需要一個具有動態SQL的PL/SQL塊:

-- drop the trigger if it exists 
declare 
    l_count integer; 
begin 

    select count(*) 
    into l_count 
    from user_triggers 
    where trigger_name = 'TRIGGER_NAME'; 

    if l_count > 0 then 
    execute immediate 'drop trigger trigger_name'; 
    end if; 

end; 
/


-- now create the trigger  
create trigger trigger_name 
    .. 
begin 
end; 
/

注意(無引號)標識符被存儲在上殼體在Oracle系統目錄。因此,請確保在PL/SQL檢查中使用trigger_name = 'TRIGGER_NAME'而不是trigger_name = 'trigger_name'

相關問題