2010-11-28 98 views
1

我爲一個簡單的視圖創建了一個「而不是」觸發器,該視圖只對表和觸發器執行任何操作(我想盡量減少問題):爲視圖創建「而不是」觸發器時編譯時出錯

create or replace view tmp(id, nazwa, nip, adres, zalega, punkty) as 
select * from klient 

create or replace trigger tmp_trg 
instead of insert 
on tmp 
for each row 
begin 

end; 

該視圖已創建。 然後,當我想要聲明這個觸發器SQL開發人員返回錯誤:

錯誤(8,1):PLS-00103:當期待以下某項時遇到符號「END」:begin case如果循環mod null pragma raise返回選擇更新,同時帶'一個標識符''雙引號分隔標識符''綁定變量'< <關閉當前刪除讀取鎖定插入打開回滾保存點集合sql執行提交forall合併管道

+0

注意:如果您只是想阻止人們插入您的視圖,只需從視圖中撤消INSERT權限即可。 – 2010-11-29 06:10:25

回答

5

只是添加「null」;在開始和結束之間。

+0

它沒有幫助。當我在觸發器中有真正的東西時(在最小化問題之前),錯誤代碼是相同的。所以觸發器什麼都不做不是問題。 – ZdenekSmetana 2010-11-29 21:58:07

1

a trigger that does nothing (I wanted to minimize the problem):

我不知道我明白你爲什麼需要一個觸發器,如果​​它什麼都不做?

要回答,您的觸發代碼塊中沒有有效的PL/SQL語句,請添加NULL以使其成爲有效的塊並且不執行任何操作。

create or replace trigger tmp_trg 
instead of insert 
on tmp 
for each row 
begin 
NULL; 
end; 
+0

當我創建真正的觸發器時,它造成了同樣的問題。 所以我試圖聲明一個沒有任何內容的觸發器來檢查它是否會導致同樣的問題,它確實如此。它有助於查找問題的原因,因爲我們不必檢查觸發器內部的語法是否導致問題。如果你不知道,最小化問題的方式就是這樣。我認爲這是顯而易見的。 – ZdenekSmetana 2010-11-29 21:49:29