zoukankan      html  css  js  c++  java
  • 理解 Oracle 多租户体系中(12c,18c,19c)创建用户作用域范围

    本篇探讨以下几个问题:你可提前猜测下面6个场景语句中,哪几个可以成功创建用户?

    1. 在CDB级别中创建公共用户,不带 container 子句的效果;

    2. 在CDB级别中创建公共用户,带 container=all 子句的效果;

    3. 在CDB级别中创建公共用户,带 container=current 子句的效果;

    4. 在PDB级别中创建本地用户,不带 container 子句的效果;

    5. 在PDB级别中创建本地用户,带 container=all 子句的效果;

    6. 在PDB级别中创建本地用户,带 container=current 子句的效果;

    在理解上面问题之前,我们需要提前约定,就是需要提前知道:

    1. CDB级别创建的用户称为公共用户PDB级别创建的用户称为本地用户

    2. 公共用户和角色命名规则对应参数 common_user_prefix ,该参数值默认为 C##。所以,在CDB级别创建公共用户或角色,需要带 C##(也可以更改参数值,但不建议)。

    3. PDB$SEED 仅为种子容器,对应 CON_ID 为 2,只读模式,不参与讨论。

    演示数据库版本:18.3.0.0.0(18c)

    目录

    1. CDB 不带 container 默认

    2. CDB带 container=all

    3. CDB带 container=current

    4. PDB不带 container 默认

    5. PDB带 container=all 

    6. PDB带 container=current 

    1. CDB 不带 container 默认

    SQL> show con_id
    
    CON_ID
    ------------------------------
    1
    
    SQL> create user c##cabc1 identified by cabc1;
    
    User created.
    
    SQL> select username,con_id from cdb_users where username='C##CABC1';
    
    USERNAME   CON_ID
    ---------- ------
    C##CABC1    1
    C##CABC1    3

    所以,CDB级别创建公共用户,不带container子句,默认作用域范围:CDB和所有PDB

    2. CDB带 container=all

    SQL> show con_id
    
    CON_ID
    ------------------------------
    1
    
    SQL> create user c##cabc2 identified by cabc2 container=all;
    
    User created.
    
    SQL> select username,con_id from cdb_users where username='C##CABC2';
    
    USERNAME   CON_ID
    ---------- ------
    C##CABC2    1
    C##CABC2    3

    所以,CDB级别创建公共用户,带container=all子句,默认作用域范围:CDB和所有PDB。和不带效果一样。

    3. CDB带 container=current

    SQL> show con_id
    
    CON_ID
    ------------------------------
    1
    
    SQL> create user c##cabc3 identified by cabc3 container=current;
    create user c##cabc3 identified by cabc3 container=current
                *
    ERROR at line 1:
    ORA-65094: invalid local user or role name

    所以,CDB级别创建公共用户,不能带 container=current 。因为是公共用户,默认作用于CDB及整个PDB。

    4. PDB不带 container 默认

    SQL> alter session set container=orders;
    
    Session altered.
    
    SQL> create user pdbabc1 identified by pdbabc1;
    
    User created.
    
    SQL> select username,con_id from cdb_users where username='PDBABC1';
    
    USERNAME   CON_ID
    ---------- ------
    PDBABC1     3

    所以,PDB级别创建本地用户,不带container子句,默认作用域范围:当前PDB

    5. PDB带 container=all 

    SQL> create user pdbabc2 identified by pdbabc2 container=all;
    create user pdbabc2 identified by pdbabc2 container=all
    *
    ERROR at line 1:
    ORA-65050: Common DDLs only allowed in root.

    所以,PDB级别创建本地用户,无法使用 container=all 子句。

    6. PDB带 container=current 

    SQL> create user pdbabc3 identified by pdbabc3 container=current;
    
    User created.
    
    SQL> select username,con_id from cdb_users where username='PDBABC3';
    
    USERNAME   CON_ID
    ---------- ------
    PDBABC3     3

    所以,PDB级别创建本地用户,带 container=current,作用域范围:当前PDB。

    综上:

    1. 在CDB级别中创建公共用户,不带 container 子句的效果: 作用于当前CDB和所有PDB

    2. 在CDB级别中创建公共用户,带 container=all 子句的效果:作用于当前CDB和所有PDB

    3. 在CDB级别中创建公共用户,带 container=current 子句的效果:X错误X CDB级别不能使用 CURRENT

    4. 在PDB级别中创建本地用户,不带 container 子句的效果:作用于当前PDB

    5. 在PDB级别中创建本地用户,带 container=all 子句的效果:X错误X PDB级别不能使用 ALL

    6. 在PDB级别中创建本地用户,带 container=current 子句的效果:作用于当前PDB

  • 相关阅读:
    linux下shell显示-bash-4.1#不显示路径解决方法
    update chnroute
    An error "Host key verification failed" when you connect to other computer by OSX SSH
    使用dig查询dns解析
    DNS被污染后
    TunnelBroker for EdgeRouter 后记
    mdadm详细使用手册
    关于尼康黄的原因
    Panda3d code in github
    Python实例浅谈之三Python与C/C++相互调用
  • 原文地址:https://www.cnblogs.com/askscuti/p/11761737.html
Copyright © 2011-2022 走看看