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

    本篇探讨以下几个问题:你可提前猜测下面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级别创建的用户或角色称为本地用户或角色。且CDB级别无法对公共用户和角色无法进行 container=current 操作,PDB级别无法对本地用户进行 container=all 操作。

    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 默认

    CDB创建测试用户

    SQL> create user c##admin identified by admin;
    
    User created.
    
    # 需要注意:CDB级别中这个语句和带 container=all 语句效果一样

    该语句创建的用户,将作用于CDB和所有PDB。详情参考《理解 Oracle 多租户体系中(12c,18c,19c)创建用户作用域范围》一文

    SQL> select username,common,con_id from cdb_users where username='C##ADMIN';
    
    USERNAME    COMMON       CON_ID
    --------------- ------ ----------
    C##ADMIN    YES        1
    C##ADMIN    YES        3

    对该用户进行授权,不带 container 子句

    SQL> grant create session to c##admin;
    
    Grant succeeded.
    
    # 授权成功后,请问 c##admin 用户能否登陆CDB?能否登陆PDB?

    验证该用户是否可以登录CDB和PDB

    SQL> conn c##admin/admin@cdb18c
    Connected.
    
    # CDB可以进行登录
    
    SQL> conn c##admin/admin@orders
    ERROR:
    ORA-01045: user C##ADMIN lacks CREATE SESSION privilege; logon denied
    
    Warning: You are no longer connected to ORACLE.
    
    # PDB无法进行登录

    结论:公共用户在进行授权不带 container 子句,默认仅作用于CDB级别

    2. CDB 授权带 container=all

    CDB创建测试用户

    SQL> conn / as sysdba
    Connected.
    SQL> create user c##admin1 identified by admin1;
    
    User created.

    该语句创建的用户,将作用于CDB和所有PDB。

    SQL> select username,common,con_id from cdb_users where username='C##ADMIN1';
    
    USERNAME    COMMON       CON_ID
    --------------- ------ ----------
    C##ADMIN1    YES        1
    C##ADMIN1    YES        3

    对该用户进行授权,带 container=all 子句

    SQL> grant create session to c##admin1 container=all;
    
    Grant succeeded.

    验证该用户是否可以登录CDB和PDB

    SQL> conn c##admin1/admin1@cdb18c
    Connected.
    
    # CDB可以进行登录
    
    SQL> conn c##admin1/admin1@orders
    Connected.
    
    # PDB可以进行登录

    结论:公共用户在进行授权带 container=all 子句,默认作用于CDB和所有PDB

    3. CDB 授权带 container=current

    CDB创建测试用户

    SQL> conn / as sysdba
    Connected.
    SQL> create user c##admin2 identified by admin2;
    
    User created.

    该语句创建的用户,将作用于CDB和所有PDB。

    SQL> select username,common,con_id from cdb_users where username='C##ADMIN2';
    
    USERNAME    COMMON       CON_ID
    --------------- ------ ----------
    C##ADMIN2    YES        1
    C##ADMIN2    YES        3

    对该用户进行授权,带 container=current 子句

    SQL> grant create session to c##admin2 container=current;
    
    Grant succeeded.

    验证该用户是否可以登录CDB和PDB

    SQL> conn c##admin2/admin2@cdb18c
    Connected.
    
    # CDB可以进行登录
    
    SQL> conn c##admin2/admin2@orders
    ERROR:
    ORA-01045: user C##ADMIN2 lacks CREATE SESSION privilege; logon denied
    
    Warning: You are no longer connected to ORACLE.
    
    # PDB无法进行登录

    结论:公共用户在进行授带 container=current 子句,默认仅作用于CDB级别,和不带container子句效果一致。

    4. PDB 授权不带 container 默认

    PDB创建测试用户

    SQL> conn sys/oracle@orders as sysdba
    Connected.
    SQL> show pdbs
    
        CON_ID CON_NAME           OPEN MODE  RESTRICTED
    ---------- ------------------- ---------- ----------
         3    ORDERS              READ WRITE NO
    SQL
    > create user padmin identified by padmin; User created.

    该语句创建的用户,将作用于当前PDB。

    SQL> select username,common,con_id from cdb_users where username='PADMIN';
    
    USERNAME    COMMON       CON_ID
    --------------- ------ ----------
    PADMIN        NO        3

    对该用户进行授权,不带 container 子句

    SQL> grant create session to padmin;
    
    Grant succeeded.

    验证该用户是否可以登录当前PDB

    SQL> conn padmin/padmin@orders
    Connected.

    # PDB可以进行登录

    结论:本地用户在进行授权不带 container 子句,默认仅作用于当前PDB级别

    5. PDB 授权带 container=all 

    PDB创建测试用户

    SQL> create user padmin1 identified by padmin1;
    
    User created.

    该语句创建的用户,将作用于当前PDB。

    SQL> select username,common,con_id from cdb_users where username='PADMIN1';
    
    USERNAME   COMMON     CON_ID
    ---------- ------ ----------
    PADMIN1    NO           3

    对该用户进行授权,带 container=all 子句

    SQL> grant create session to padmin1 container=all;
    grant create session to padmin1 container=all
    *
    ERROR at line 1:
    ORA-65030: cannot grant a privilege commonly to a local user or role
    
    # 报错,无法进行本地用户的 container=all 授权

    结论:本地用户在进行权限授权时,无法使用 container=all 子句。

    6. PDB 授权带 container=current

    针对上面PDB用户 padmin1 能否使用 container=current 子句进行授权?

    SQL> grant create session to padmin1 container=current;
    
    Grant succeeded.
    
    SQL> conn padmin1/padmin1@orders
    Connected.

    结论:本地用户在进行权限授权时,使用 container=current 子句,作用域为当前PDB

    综上:

    1. 在CDB级别中对用户进行授权,不带 container 子句的效果: 仅作用于当前CDB

    2. 在CDB级别中对用户进行授权,带 container=all 子句的效果:作用于当前CDB和所有PDB

    3. 在CDB级别中对用户进行授权,带 container=current 子句的效果:仅作用于当前CDB

    4. 在PDB级别中对用户进行授权,不带 container 子句的效果:仅作用于当前PDB

    5. 在PDB级别中对用户进行授权,带 container=all 子句的效果:X错误X PDB级别不能使用 ALL

    6. 在PDB级别中对用户进行授权,带 container=current 子句的效果:仅作用于当前PDB

  • 相关阅读:
    消除左递归
    DFA最小化
    非确定的自动机NFA确定化为DFA
    正规式到正规文法与自动机
    正规文法与正规式
    词法分析程序的设计与实现
    4.文法和语言总结与梳理
    语法树,短语,直接短语,句柄
    语法
    第一次作业 编译原理概述
  • 原文地址:https://www.cnblogs.com/askscuti/p/11769446.html
Copyright © 2011-2022 走看看