发布于:2021-02-04 14:00:20
0
282
0
Active Data Guard数据库现在不再只是“只读”数据库—它们现在已成为“大部分读取”数据库,主要用于报告目的,但在某种程度上也允许DML活动。
oracle18c的一个新特性是私有临时表。
专用临时表与全局临时表在某些方面有所不同。它们不存储在磁盘上,而仅存储在内存中,并且仅对创建它们的会话可见。表的名称必须以字符串' ORA $ PTT '为前缀。
它们是临时数据库对象,在事务结束或会话结束时被删除。同一用户的不同会话可以对私有临时表使用相同的名称。
当以只读为主的应用程序还需要执行一些DML活动时,这些表非常有用,比如在临时表中插入或更新一些临时数据,然后查询几次,然后在事务或会话结束时删除这些临时数据。
让我们看看这个功能。
我们以用户HR的身份连接到可插拔数据库PDB1,但连接到主备只读数据库。
用户HR的会话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的会话2请注意表名相同,但数据不同。
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
具有提交时丢弃定义的私有临时表
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
作者介绍