《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.spa

       觸發器是無需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 拿掉,由外部控制 。
相關文章
相關標籤/搜索