Oracle中的自治事務(Autonomous Transaction)
Autonomous Transaction就是在Oracle允許建立一個事務中的事務,也就是說這種事務的提交或者是回滾不會影響到外層的事務的狀態,但是自治事務在應用的方面用到的不多,這裡僅僅列出最最常用的一種功能就是定製audit:
具例來說:
C:\Documents and Settings\Administrator>sqlplus /nolog
SQL*Plus: Release 10.2.0.3.0 - Production on 星期三 1月 9 22:32:17 2008
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
SQL> conn hujinpei/passw0rd@irmdb
已連線。
我們首先建立一張事務表
----------------------------------
SQL> create table mytest
2 as
3 select * from sys.treeview;
表已建立。
建立一張記錄audit資訊的表
-----------------------------------------
SQL> create table audit_tab
2 (name varchar2(20) default user,
3 timestamp date default sysdate,
4 msg varchar2(500));
表已建立。
建立一個帶有自治事務的觸發器
-----------------------------------------------
SQL> create or replace trigger mytest_audit
2 before update on mytest
3 for each row
4 declare
5 pragma autonomous_transaction;
6 l_cnt number;
7 begin
8 select count(*) into l_cnt
9 from dual
10 where exists
11 ( select null from mytest where child=:new.child
12 start with parent = 'c'
13 connect by prior child=parent );
14 if (l_cnt=0)
15 then
16 insert into audit_tab (msg) values ('Attempt to update '|| :new.child);
17 commit;
18 raise_application_error (-20001,'Access Denied');
19 end if;
20 end;
21 /
觸發器已建立
raise_application_error會導致提示插入失敗,但是我所insert的row因為在自治事務中的commit,而不會得到回滾。
如果我們現在更新一個不屬於parent='c'的child,那麼就會報錯.
SQL> update mytest set child='b3' where child='b2';
update mytest set child='b3' where child='b2'
*
第 1 行出現錯誤:
ORA-20001: Access Denied
ORA-06512: 在 "HUJINPEI.MYTEST_AUDIT", line 15
ORA-04088: 觸發器 'HUJINPEI.MYTEST_AUDIT' 執行過程中出錯
可以在audit_tab中看到詳細的資訊
SQL> select * from audit_tab;
NAME TIMESTAMP
-------------------- --------------
MSG
--------------------------------------------------------------------------------
HUJINPEI 09-1月 -08
Attempt to update b3
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12361284/viewspace-132317/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle自治事務autonomous_transaction用法Oracle
- oracle自治事務(PRAGMA AUTONOMOUS_TRANSACTION)Oracle
- 關於oracle autonomous transactionOracle
- oracle 自治事務Oracle
- 瞭解Oracle自治事務Oracle
- oracle自治事務引起的死鎖Oracle
- Oracle PL/SQL 自治事務的說明OracleSQL
- Oracle 巢狀事務 VS 自治事務Oracle巢狀
- oracle set transaction read only與dbms_transaction實現事務transaction控制Oracle
- oracle中的processes,session,transaction引數OracleSession
- DB2_自治事務DB2
- PLSQL Language Referenc-PL/SQL靜態SQL-自治事務-控制自治事務SQL
- Oracle ITL (Interested Transaction List) - 事務槽OracleREST
- oracle中的processes,session,transaction引數詳解OracleSession
- oracle產生事務transaction幾種方式或方法Oracle
- 在Oracle中使用自治事務儲存日誌表條目(轉)Oracle
- 【DDL】DDL的隱式commit和自治事務MIT
- indexedDB transaction 事務Index
- oracle資料庫事務transaction 不同的鎖lock型別Oracle資料庫型別
- 使用自治事務在觸發器中執行DDL語句示例觸發器
- Django處理事務:transactionDjango
- DAPPER 事務 TRANSACTIONAPP
- Spring中事務管理org.springframework.transactionSpringFramework
- oracle事務隔離級別transaction isolation level初識Oracle
- oracle undo segment header 事務表transaction table系列一OracleHeader
- Oracle 如何判斷一個死事務transaction的恢復進度Oracle
- PostgreSQL DBA(68) - 使用DBLink實現自治事務SQL
- oracle資料庫事務transaction鎖lock模式思考之一Oracle資料庫模式
- Check the transaction running in oracleOracle
- oracle 中的事務Oracle
- 記錄獲得ORACLE的transaction IDOracle
- 【Oracle】Oracle 11g 中的自動資料庫維護任務管理Oracle資料庫
- oracle事務transaction鎖lock一點兒小思考或總結Oracle
- oracle不同的事務transaction隔離級別isolation level進一步理解Oracle
- Overview of Autonomous Transactions (150)View
- 10g中的transaction等待事件事件
- 關於事務的英文說明 Transaction OverviewView
- oracle檢視flashback_transaction_query中列operation為unknownOracle