您好,登錄后才能下訂單哦!
1、這是oracle的規定,不能對執行觸發器的表進行操作。
可以對new.xxx進行操作啊,對于oracle行級觸發器(for each row),不能對本表做任何操作,包括讀取
原則:
在before insert觸發器中,可以實現對本表的訪問;
在after insert觸發器中,不能實現對本表的訪問;
在before/after update/delete觸發器中,都不能實現對本表的訪問
其實原因很簡單,就是為了防止臟讀
2、寫oracle行級觸發器時,不能操作本表,報表 *** 發生了變化,觸發器/函數不能讀"的錯誤的解決辦法
原因已經很明顯了就是行級的觸發器代碼中不能操作該表,包括select,是挺郁悶的
當然解決方法就是要根據原因了,正因為限定了行級觸發器的操作,只能選擇表級的觸發器了,但是在表級的觸發器又不能獲得:new和:old的值,那就只能采取兩種觸發器并用的方法了,并且還要包或者臨時表加以輔助.
首先在行級觸發器中將所需的,:new或者:old的值,寫到包或者臨時表中
然后在表級觸發器中處理包或者臨時表中已經寫入的數據,操作成功后可以按照需求再刪除臨時表的數據.
3、 ORACLE 觸發器
ORACLE產生數據庫觸發器的語法為:
create [or replace] trigger 觸發器名 觸發時間 觸發事件
on 表名
[for each row]
pl/sql 語句
其中:
觸發器名:觸發器對象的名稱。由于觸發器是數據庫自動執行
的,因此該名稱只是一個名稱,沒有實質的用途。
觸發時間:指明觸發器何時執行,該值可取:
before---表示在數據庫動作之前觸發器執行;
after---表示在數據庫動作之后出發器執行。
觸發事件:指明哪些數據庫動作會觸發此觸發器:
insert:數據庫插入會觸發此觸發器;
update:數據庫修改會觸發此觸發器;
delete:數據庫刪除會觸發此觸發器。
表 名:數據庫觸發器所在的表。
for each row:對表的每一行觸發器執行一次。如果沒有這一
選項,則只對整個表執行一次。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。