今天做了一個需要用到觸發器實現的功能中間去到了各種問題,還好最後都解決了; 整個過程中真是遇到了不少錯誤: ORA-04091: 表 KPGO.T_ISSUER 發生了變化, 觸發器/函數不能讀它 ORA-04092: COMMIT 不能在觸發器中 ORA-04098:觸發器“xx.xxx”無效且未 ...
今天做了一個需要用到觸發器實現的功能中間去到了各種問題,還好最後都解決了;
整個過程中真是遇到了不少錯誤:
ORA-04091: 表 KPGO.T_ISSUER 發生了變化, 觸發器/函數不能讀它
ORA-04092: COMMIT 不能在觸發器中
ORA-04098:觸發器“xx.xxx”無效且未通過重新定義
首先說第一個錯是因為這樣的代碼:
原因是
觸發器和存儲過程中中用:再次去查目標表(就是你觸發器服務的那張表),這一動作被oracle認為是不合法的。
目標表的記錄行如果做了更新,無需再通過ID去查詢目標記錄行。這一動作被oracle認為是不合法的。
那咋整!!!咱也不知道,咱也不知道問誰,拉倒吧自己百度
嗯!!!就在那麼一瞬間我看到了一個似乎可以拯救我得答案,它得變數賦值方式我很喜歡,必須咱也得弄(neng四聲)一下
嗯整挺好 不在報那個錯了
但是啊 人啊不能太囂張 緊接著給我整了個第二個錯 ORA-04092: COMMIT 不能在觸發器中
當時腦瓜帶 嗡一下子 我努力讓自己清醒 磕了一袋瓜子喝了杯茶水 我又意識到
觸發器裡面是不能執行ddl語句和commit操作的 原因就在調用得那個函數裡面
既然問題找到了 乾他
DDL語句用語定義和管理資料庫中的對象,如Create,Alter,Drop,truncate等;
DDL操作是隱性提交的!操作立即生效,原數據不放到rollback segment中,不能回滾. 操作不觸發trigger
DML(Data Manipulation Language)數據操縱語言命令使用戶能夠查詢資料庫以及操作已有資料庫中的數據。
如insert,delete,update,select等都是DML.
雖然在觸發器里沒有寫ddl語句但是tm這個函數里有,wc我這小脾氣就上來了,又是一頓小百度
為觸發器添加自治事務,完美解決
至於ORA-04098:觸發器“xx.xxx”無效且未通過重新定義這個錯,一般就是沒仔細有寫錯得地方,好好看看
還有就是如果你的資料庫鏈接工具是navicat 那你得看看你的觸發器是不是完整的,有的時候他可能只給你編譯了一半
到這裡就OK了,工作以來第一次寫觸發器,記錄一下方便學習
重點:
1.oracle觸發器中定義變數得賦值方式要註意下,選擇適合自己需求的
2.觸發器中每一句語句都要有分號,別懶
3.觸發器不能執行ddl語句和commit操作,如果想用加自治事務(但是我好像見過專門的ddl觸發器但是真的得是表什麼得。。想瞭解得自己查吧)