当前位置: 首页 > Oracle, Oracle 12c > 正文

oracle 12c切换容器及查询当前容器

刚开始学习12C,很多地方用着都不是很顺手,特别是PDB,感觉特别扭,可能是刚开始学还没学到PDB带来的好处吧,这里总结下怎么查看当前在哪个容器、怎么切换容器的一些基础命令。

在12C的CONNECT角色里,多出一个SET CONTAINER权限,这个权限用来控制是否可以通过SET CONTAINER来切换容器。

SQL> select GRANTEE,PRIVILEGE  from dba_sys_privs where GRANTEE='CONNECT';

GRANTEE              PRIVILEGE
-------------------- --------------------
CONNECT              SET CONTAINER
CONNECT              CREATE SESSION

在知道可以通过SET CONTAINER来切换容器之前,我都是通过TNS的方法来切换容器。

[oracle@dbdream ~]$ sqlplus / as sysdba

SQL*Plus: Release 12.1.0.1.0 Production on Fri Aug 16 02:28:46 2013

Copyright (c) 1982, 2013, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT
SQL> select con_id,dbid,NAME,OPEN_MODE from v$pdbs;

    CON_ID       DBID NAME       OPEN_MODE
---------- ---------- ---------- --------------------
         2 4063594514 PDB$SEED   READ ONLY
         3 1587020587 STREAM     READ WRITE
         4  676818932 WIND       READ WRITE
SQL> conn dbdream/dbdream@localhost/stream
Connected.
SQL> show con_name

CON_NAME
------------------------------
STREAM

下面在看下用SET CONTAINER来切换容器。

[oracle@dbdream ~]$ sqlplus / as sysdba

SQL*Plus: Release 12.1.0.1.0 Production on Fri Aug 16 02:35:57 2013

Copyright (c) 1982, 2013, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT
SQL> alter session set container=wind;

Session altered.

SQL> show con_name

CON_NAME
------------------------------
WIND

这样就切换过去了,而且用的是切换前登录数据库的用户(sys)。

SQL> show user
USER is "SYS"

PDB和PDB之间是不可以用SET CONTAINER的方式切换的。我的wind、stream两个PDB中都存在wind用户,密码也一样,下面测试下用wind用户从wind容器切换到stream容器。

SQL> conn wind/wind@localhost/wind
Connected.
SQL> alter session set container=stream;
ERROR:
ORA-01031: insufficient privileges

PDB和PDB之间切换我只知道可以用TNS的方式,SET CONTAINER的方式只能是PDB和CDB之间切换,而且要求切换的用户在PDB和CDB都存在,这也就是说只有在CDB中创建的用户(COMM USER)才可以用SET CONTAINER方式切换容器(系统用户除外),因为在CDB中创建的用户以C##开头,并且在每个PDB中都可以看到CDB中创建的用户(COMM USER),而PDB中创建的用户(LOCAL USER)只能在当前PDB中看到,还不能以C##开头,那就只有COMM USER才可以用SET CONTAINER的方式切换容器了(系统用户除外),太局限了。

上文总结了怎样切换容器,在记录下怎么查看当前在哪个容器,从上文可以看到可以用show con_name的方式很方便的看到当前在哪个容器里,还可以用SYS_CONTEXT函数来查看。

SQL> SELECT SYS_CONTEXT ('USERENV', 'CON_NAME') FROM DUAL;

SYS_CONTEXT('USERENV','CON_NAME')
--------------------------------------------------------------------------------
WIND
SQL> conn sys/oracle@localhost/dbdream as sysdba
Connected.
SQL> SELECT SYS_CONTEXT ('USERENV', 'CON_NAME') FROM DUAL;

SYS_CONTEXT('USERENV','CON_NAME')
--------------------------------------------------------------------------------
CDB$ROOT

这两种方法功能相同,但是show con_name的方式要少敲好几个单词,我比较喜欢。

小结:

切换容器:

TNS的方式比较实用,不但可以实现CDB和PDB之间的切换,还可以实现PDB与PDB之间的切换,并且可以在切换时直接切换用户。

SET CONTAINER方式切换容器只能是CDB与PDB之间切换,而且只能使用COMM USER(系统用户除外),范围比较局限。

查看当前容器:

show con_name相对简单,单次比较好记,不容易忘记。SYS_CONTEXT函数相对麻烦些,时间长不用可能会忘记。

本文固定链接: https://www.dbdream.com.cn/2013/10/oracle-12c%e5%88%87%e6%8d%a2%e5%ae%b9%e5%99%a8%e5%8f%8a%e6%9f%a5%e8%af%a2%e5%bd%93%e5%89%8d%e5%ae%b9%e5%99%a8/ | 信春哥,系统稳,闭眼上线不回滚!

该日志由 dbdream 于2013年10月22日发表在 Oracle, Oracle 12c 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: oracle 12c切换容器及查询当前容器 | 信春哥,系统稳,闭眼上线不回滚!
关键字: , , , ,

oracle 12c切换容器及查询当前容器:等您坐沙发呢!

发表评论

快捷键:Ctrl+Enter