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

    本篇探讨以下几个问题:你可提前猜测下面6个场景语句中,哪几个回收可以成功执行?

    1. 在CDB级别中对用户进行权限回收,不带 container 子句的效果;

    2. 在CDB级别中对用户进行权限回收,带 container=all 子句的效果;

    3. 在CDB级别中对用户进行权限回收,带 container=current 子句的效果;

    4. 在PDB级别中对用户进行权限回收,不带 container 子句的效果;

    5. 在PDB级别中对用户进行权限回收,带 container=all 子句的效果;

    6. 在PDB级别中对用户进行权限回收,带 container=current 子句的效果;

    请熟悉创建用户作用域创建角色作用域授权作用域。本篇将在以上理论基础上进行演示。

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

    权限回收,针对的是授权,我们回顾下授权的作用域范围:需要注意的是,在考试中,经常考到在CDB级别授权及回收权限的作用域。

    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

    对于授权作用域,我们总结成三句话:也就是授权一共3种情况仅作用于CDB作用于全局仅作用于PDB

    仅作用于CDB:CDB级别不带子句或带了 current 都只作用于当前CDB

    作用于全局:CDB级别如果带了 ALL,将作用于CDB和所有PDB全局

    仅作用于PDB:PDB级别不带子句或带了 current 都只作用于当前PDB,无法带 ALL

    注意:以上3种情况的授权,分别又对应3种回收选项(不带子句,带 all,带 current),所以共计9种情况,逐个讨论。

    情况一:CDB授权作用于当前CDB,回收不带子句

    创建用户 c##r1 并授权。符号 '<>' 代表默认值可省略

    SQL> create user c##r1 identified by r1 <container=all>; ---用户默认作用于全局容器
    
    User created.
    
    SQL> grant create session to c##r1 <container=current>; ---授权默认作用于当前容器CDB
    
    Grant succeeded.

    所有容器均存在用户 c##r1 ,但只有CDB级别可以登录,PDB无法登陆。

    回收权限,不带子句

    SQL> revoke create session from c##r1;
    
    Revoke succeeded.
    
    SQL> conn c##r1/r1@cdb18c;
    ERROR:
    ORA-01045: user C##R1 lacks CREATE SESSION privilege; logon denied

    不带子句,回收成功,默认作用于当前CDB,回收后,无法登陆。

    情况二:CDB授权作用于当前CDB,回收带 ALL

    创建用户 c##r2 并授权。

    SQL> create user c##r2 identified by r2;
    
    User created.
    
    SQL> grant create session to c##r2;
    
    Grant succeeded.

    所有容器均存在用户 c##r2 ,但只有CDB级别可以登录,PDB无法登陆。

    回收权限,子句带 ALL

    SQL> revoke create session from c##r2 container=all;
    revoke create session from c##r2 container=all
    *
    ERROR at line 1:
    ORA-65092: system privilege granted with a different scope to 'C##R2'

    子句带 ALL,将报错。因授权只针对当前CDB生效,所以回收无法针对所有容器回收。

    情况三:CDB授权作用于当前CDB,回收带 CURRENT

    创建用户 c##r3 并授权。

    SQL> create user c##r3 identified by r3;
    
    User created.
    
    SQL> grant create session to c##r3;
    
    Grant succeeded.

    所有容器均存在用户 c##r3 ,但只有CDB级别可以登录,PDB无法登陆。

    回收权限,子句带 CURRENT

    SQL> revoke create session from c##r3 container=current;
    
    Revoke succeeded.
    
    SQL> conn c##r3/r3@cdb18c;
    ERROR:
    ORA-01045: user C##R3 lacks CREATE SESSION privilege; logon denied

    子句带 CURRENT,回收成功,作用于当前CDB,回收后,无法登陆。

    情况四:CDB授权作用于全局容器,回收不带子句

    创建用户 c##r4 并授权。

    SQL> create user c##r4 identified by r4;
    
    User created.
    
    SQL> grant create session to c##r4 container=all;
    
    Grant succeeded.

    所有容器均存在用户 c##r4 ,且CDB和所有PDB均可登录。

    回收权限,不带子句

    SQL> revoke create session from c##r4;
    revoke create session from c##r4
    *
    ERROR at line 1:
    ORA-65092: system privilege granted with a different scope to 'C##R4'

    不带子句,回收失败。因授权针对的是全局容器生效,所以回收无法针对当前CDB容器进行回收。---OCP考试内容

    情况五:CDB授权作用于全局容器,回收带 ALL

    创建用户 c##r5 并授权。

    SQL> create user c##r5 identified by r5;
    
    User created.
    
    SQL> grant create session to c##r5 container=all;
    
    Grant succeeded.

    所有容器均存在用户 c##r5 ,且CDB和所有PDB均可登录。

    回收权限,子句带 ALL

    SQL> revoke create session from c##r5 container=all;
    
    Revoke succeeded.
    
    SQL> conn c##r5/r5@cdb18c; ---CDB无法登陆
    ERROR:
    ORA-01045: user C##R5 lacks CREATE SESSION privilege; logon denied
    
    Warning: You are no longer connected to ORACLE.
    
    SQL> conn c##r5/r5@orders; ---PDB无法登陆
    ERROR:
    ORA-01045: user C##R5 lacks CREATE SESSION privilege; logon denied

    子句带 ALL,回收成功。针对所有容器,CDB及PDB将无法登陆。

     情况六:CDB授权作用于全局容器,回收带 CURRENT

     创建用户 c##r6 并授权。

    SQL> create user c##r6 identified by r6;
    
    User created.
    
    SQL> grant create session to c##r6 container=all;
    
    Grant succeeded.

    所有容器均存在用户 c##r6 ,且CDB和所有PDB均可登录。

    回收权限,子句带 CURRENT

    SQL> revoke create session from c##r6 container=current;
    revoke create session from c##r6 container=current
    *
    ERROR at line 1:
    ORA-65092: system privilege granted with a different scope to 'C##R6'

    带 current 回收失败。因授权针对的是全局容器生效,所以回收无法针对当前CDB容器进行回收。

    情况七:PDB自己授权,回收不带子句

    CDB创建用户 c##r7

    SQL> create user c##r7 identified by r7;
    
    User created.

    所有容器均存在用户 c##r7 ,且CDB和所有PDB现在都不可以登陆。

    PDB单独对 c##r7 用户进行授权。

    SQL> alter session set container=orders;
    
    Session altered.
    
    SQL> grant create session to c##r7; ---PDB级别默认授权为 CURRENT,无法进行 ALL 授权
    
    Grant succeeded.

    结果为PDB可登录了,CDB无法登陆

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

    CDB尝试回收

    SQL> conn / as sysdba
    Connected.
    SQL> revoke create session from c##r7;
    revoke create session from c##r7
    *
    ERROR at line 1:
    ORA-01952: system privileges not granted to 'C##R7'

    报错,原因是CDB级别根本没有进行授权。

    PDB自己尝试回收

    SQL> conn sys/oracle@orders as sysdba
    Connected.
    SQL> revoke create session from c##r7;
    
    Revoke succeeded.

    也就是说:PDB级别自己针对公共用户的授权,只能由PDB级别自己管理,CDB无法进行权限回收。

    情况八:PDB自己授权,回收带 ALL

    CDB创建用户 c##r8,PDB级别自己授权

    SQL> conn / as sysdba
    Connected.
    SQL> create user c##r8 identified by r8;
    
    User created.
    
    SQL> alter session set container=orders;
    
    Session altered.
    
    SQL> grant create session to c##r8;
    
    Grant succeeded.

    结果为PDB可登录,CDB无法登陆

    PDB 带子句 ALL 进行回收

    SQL> revoke create session from c##r8 container=all;
    revoke create session from c##r8 container=all
    *
    ERROR at line 1:
    ORA-65040: operation not allowed from within a pluggable database

    报错,在PDB级别操作不被允许,无法使用子句 container=all

    情况九:PDB自己授权,回收带 CURRENT

    CDB创建用户 c##r9,PDB级别自己授权

    SQL> conn / as sysdba
    Connected.
    SQL> create user c##r9 identified by r9;
    
    User created.
    
    SQL> alter session set container=orders;
    
    Session altered.
    
    SQL> grant create session to c##r9;
    
    Grant succeeded.

    结果为PDB可登录,CDB无法登陆

    PDB 带子句 CURRENT 进行回收

    SQL> revoke create session from c##r9 container=current;
    
    Revoke succeeded.

    回收成功,PDB级别默认和CURRENT情况一致。

    综上:

    情况一:CDB授权作用于当前CDB,回收不带子句     回收当前CDB权限

    情况二:CDB授权作用于当前CDB,回收带 ALL        X错误X

    情况三:CDB授权作用于当前CDB,回收带 CURRENT   回收当前CDB权限

    -----------------------------------------------------------------------------------------------------------

    情况四:CDB授权作用于全局容器,回收不带子句      X错误X

    情况五:CDB授权作用于全局容器,回收带 ALL      回收全局容器权限

    情况六:CDB授权作用于全局容器,回收带 CURRENT   X错误X

    -----------------------------------------------------------------------------------------------------------

    情况七:PDB自己授权,回收不带子句           回收当前PDB权限

    情况八:PDB自己授权,回收带 ALL           X错误X

    情况九:PDB自己授权,回收带 CURRENT        回收当前PDB权限

  • 相关阅读:
    2981 大整数加法
    1160 矩阵的最大值(指针专题)
    1159 最大的两个数(指针专题)
    1127 矩阵乘积
    1126 布尔矩阵的奇偶性
    1125 上三角矩阵的判断
    1124 两个有序数组合并
    1123 最佳校友
    1122 小明的调查作业
    1121 电梯
  • 原文地址:https://www.cnblogs.com/askscuti/p/11807052.html
Copyright © 2011-2022 走看看