發(fā)布于:2021-02-04 14:00:20
0
343
0
Active Data Guard數(shù)據(jù)庫現(xiàn)在不再只是“只讀”數(shù)據(jù)庫—它們現(xiàn)在已成為“大部分讀取”數(shù)據(jù)庫,主要用于報(bào)告目的,但在某種程度上也允許DML活動(dòng)。
oracle18c的一個(gè)新特性是私有臨時(shí)表。
專用臨時(shí)表與全局臨時(shí)表在某些方面有所不同。它們不存儲(chǔ)在磁盤上,而僅存儲(chǔ)在內(nèi)存中,并且僅對(duì)創(chuàng)建它們的會(huì)話可見。表的名稱必須以字符串' ORA $ PTT '為前綴。
它們是臨時(shí)數(shù)據(jù)庫對(duì)象,在事務(wù)結(jié)束或會(huì)話結(jié)束時(shí)被刪除。同一用戶的不同會(huì)話可以對(duì)私有臨時(shí)表使用相同的名稱。
當(dāng)以只讀為主的應(yīng)用程序還需要執(zhí)行一些DML活動(dòng)時(shí),這些表非常有用,比如在臨時(shí)表中插入或更新一些臨時(shí)數(shù)據(jù),然后查詢幾次,然后在事務(wù)或會(huì)話結(jié)束時(shí)刪除這些臨時(shí)數(shù)據(jù)。
讓我們看看這個(gè)功能。
我們以用戶HR的身份連接到可插拔數(shù)據(jù)庫PDB1,但連接到主備只讀數(shù)據(jù)庫。
用戶HR的會(huì)話1
SQL> CREATE PRIVATE TEMPORARY TABLE ORA$PTT_ADG_SESSIONS
2 (username varchar2(20), sid number , serial# number)
3 ON COMMIT PRESERVE DEFINITION;
Table created.
SQL> insert into ORA$PTT_ADG_SESSIONS
select s.username i_username, to_char(s.sid) i_sid, to_char(s.serial#) i_serial
from
v$session s, v$process p
where
s.paddr = p.addr
and
sid = (select sid from v$mystat where rownum = 1);
1 row created.
SQL> select * from ORA$PTT_ADG_SESSIONS;
USERNAME SID SERIAL#
-------------------- ---------- ----------
HR 465 20742
用戶HR的會(huì)話2請(qǐng)注意表名相同,但數(shù)據(jù)不同。
SQL> CREATE PRIVATE TEMPORARY TABLE ORA$PTT_ADG_SESSIONS
2 (username varchar2(20), sid number , serial# number)
3 ON COMMIT PRESERVE DEFINITION;
Table created.
SQL> insert into ORA$PTT_ADG_SESSIONS
select s.username i_username, to_char(s.sid) i_sid, to_char(s.serial#) i_serial
from
v$session s, v$process p
where
s.paddr = p.addr
and
sid = (select sid from v$mystat where rownum = 1); 2 3 4 5 6 7 8
1 row created.
SQL> select * from ORA$PTT_ADG_SESSIONS;
USERNAME SID SERIAL#
-------------------- ---------- ----------
HR 472 46742
SQL>
以用戶身份重新連接HR
SQL> conn hr/hr@pdb1
Connected.
SQL> select * from ORA$PTT_ADG_SESSIONS;
select * from ORA$PTT_ADG_SESSIONS
*
ERROR at line 1:
ORA-00942: table or view does not exist
具有提交時(shí)丟棄定義的私有臨時(shí)表
SQL> CREATE PRIVATE TEMPORARY TABLE ORA$PTT_ADG_SESSIONS
2 (username varchar2(20), sid number , serial# number)
3 ON COMMIT DROP DEFINITION;
Table created.
SQL> insert into ORA$PTT_ADG_SESSIONS
select s.username i_username, to_char(s.sid) i_sid, to_char(s.serial#) i_serial
from
v$session s, v$process p
where
s.paddr = p.addr
and
sid = (select sid from v$mystat where rownum = 1);
1 row created.
SQL> select * from ORA$PTT_ADG_SESSIONS;
USERNAME SID SERIAL#
-------------------- ---------- ----------
HR 465 20742
SQL> update ORA$PTT_ADG_SESSIONS set USERNAME='NOBODY';
1 row updated.
SQL> select * from ORA$PTT_ADG_SESSIONS;
USERNAME SID SERIAL#
-------------------- ---------- ----------
NOBODY 465 20742
SQL> commit;
Commit complete.
SQL> select * from ORA$PTT_ADG_SESSIONS;
select * from ORA$PTT_ADG_SESSIONS
*
ERROR at line 1:
ORA-00942: table or view does not exist
作者介紹
熱門博客推薦