《oracle每天一練》觸發器不能調用或間接調用COMMIT,ROLLBACK等DCL語句


觸發器不能調用或間接調用COMMIT,ROLLBACK等DCL語句  

在觸發器中不能運行 ddl語句和commit,rollback語句

ddl語句:DDL語句用語定義和管理數據庫中的對象,如Create,Alter,Drop,truncate等;DDL操作是隱性提交的!
         操作立即生效,原數據不放到rollback segment中,不能回滾. 操作不觸發trigger

DML(Data Manipulation Language)數據操縱語言命令使用戶能夠查詢數據庫以及操作已有數據庫中的數據。
如insert,delete,update,select等都是DML.

       觸發器是無需commit的,而且也不能寫commit;觸發器和觸發它的DML是同一個事務DML提交了,觸發器的操作也提交了,所以無需Commit;否則就會造成錯誤信息。當然,如果你一定要在觸發器里寫COMMIT,那也是可以的,可以用Oracle中的自治事務來處理,自治事務就相當於一個事務里的子事務。
      在正常情況下,Oracle規定在觸發器中不能運行 DDL(即Create/Alter/Drop)語句和Commit/Rollback語句的,因為DDL操作是隱性提交的,在觸發器不允許有Commit,如在觸發器中加入DDL語句,這種隱性提交就會導致錯誤信息;但有時特殊情況下需要在觸發器中使用DDL語句,這時怎么辦。 
可以采取以下的解決辦法: 
1.在可以在觸發器中加入:pragma autonomous_transaction;(在DECLARE后面) 表示是自由事務處理。
如: 
CREATE OR REPLACE TRIGGER T_create BEFORE insert ON T_Tax_INS_BD
for each row
DECLARE
pragma autonomous_transaction; 
NRDSId varchar(500):=''; 
begin 
通過以上方法即可解決觸發器中不能有DDL語句的問題!

一:  在觸發器中使用DDL語句。 如 drop table t1 ,觸發的時候會報錯,
ORA-04092: cannot COMMIT in a trigger,因為DDL語句隱含commit。

二: 觸發器的主體中使用了commit或rollback等DCL語句。ORA-04092:
cannot COMMIT in a trigger , 因為DML(delete/update/insert)觸發器中
不能使用DDL(CREATE,DROP,ALTER)語句,也不能使用事務控制語句(DCL)
(ROLLBACK, COMMIT,SAVEPOINT)。特別注意的是,在觸發器的主體中引用的
函數(function)/過程(procedure)中也不能有事物控制語句。

三: 注意: 系統級觸發器(System Triggers)中可以使用DDL語句。

四: 處理方法: 去掉事務控制語句;如果procedure中必須有commit,那么可以
將commit 拿掉,由外部控制 。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM