Oracle觸發器學習記錄

一、這是oracle的規定,不能對執行觸發器的表進行操做。
能夠對new.xxx進行操做啊,對於oracle行級觸發器(for each row),不能對本表作任何操做,包括讀取
原則:
在before insert觸發器中,能夠實現對本表的訪問;
在after insert觸發器中,不能實現對本表的訪問;
在before/after update/delete觸發器中,都不能實現對本表的訪問sql

其實緣由很簡單,就是爲了防止髒讀
二、寫oracle行級觸發器時,不能操做本表,報表 *** 發生了變化,觸發器/函數不能讀"的錯誤的解決辦法
緣由已經很明顯了就是行級的觸發器代碼中不能操做該表,包括select,是挺鬱悶的
固然解決方法就是要根據緣由了,正由於限定了行級觸發器的操做,只能選擇表級的觸發器了,可是在表級的觸發器又不能得到:new和:old的值,那就只能採起兩種觸發器並用的方法了,而且還要包或者臨時表加以輔助.
首先在行級觸發器中將所需的,:new或者:old的值,寫到包或者臨時表中
而後在表級觸發器中處理包或者臨時表中已經寫入的數據,操做成功後能夠按照需求再刪除臨時表的數據.
三、 ORACLE 觸發器
ORACLE產生數據庫觸發器的語法爲:
create [or replace] trigger 觸發器名 觸發時間 觸發事件
on 表名
[for each row]
pl/sql 語句
其中:
觸發器名:觸發器對象的名稱。因爲觸發器是數據庫自動執行
的,所以該名稱只是一個名稱,沒有實質的用途。
觸發時間:指明觸發器什麼時候執行,該值可取:
before---表示在數據庫動做以前觸發器執行;
after---表示在數據庫動做以後出發器執行。
觸發事件:指明哪些數據庫動做會觸發此觸發器:
insert:數據庫插入會觸發此觸發器;
update:數據庫修改會觸發此觸發器;
delete:數據庫刪除會觸發此觸發器。
表 名:數據庫觸發器所在的表。
for each row:對錶的每一行觸發器執行一次。若是沒有這一
選項,則只對整個表執行一次。數據庫

相關文章
相關標籤/搜索