• 理解 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 默认

    首先,CDB创建公共角色,如果没有带前缀,将报错

    SQL> create role crole1;
    create role crole1
                *
    ERROR at line 1:
    ORA-65096: invalid common user or role name

    创建不带任何子句的公共角色

    SQL> create role c##crole1;
    
    Role created.
    
    SQL> set linesize 200
    SQL> col role for a20
    SQL> select role,common,con_id from cdb_roles where role='C##CROLE1';
    
    ROLE             COMMON    CON_ID
    -------------------- ------ ----------
    C##CROLE1         YES         1
    C##CROLE1         YES         3

    结果作用域范围是:当前CDB和所有PDB生效。

    2. CDB带 container=all

    SQL> create role c##crole2 container=all;
    
    Role created.
    
    SQL> select role,common,con_id from cdb_roles where role='C##CROLE2';
    
    ROLE             COMMON    CON_ID
    -------------------- ------ ----------
    C##CROLE2         YES         1
    C##CROLE2         YES         3

    结果作用域范围是:当前CDB和所有PDB生效。和不带子句效果一致。

    3. CDB带 container=current

    SQL> create role c##crole3 container=current;
    create role c##crole3 container=current
                *
    ERROR at line 1:
    ORA-65094: invalid local user or role name

    结果作用域范围是:报错,公共角色无法进行本地创建

    4. PDB不带 container 默认

    首先,PDB级别在本地能否创建以c##前缀开头的公共角色?

    SQL> alter session set container=orders;
    
    Session altered.
    
    SQL> create role c##crole4;
    create role c##crole4
                *
    ERROR at line 1:
    ORA-65094: invalid local user or role name

    结果作用域范围是:报错,PDB级别是无法创建公共角色的

    SQL> create role prole1;
    
    Role created.
    
    SQL> select role,common,con_id from cdb_roles where role='PROLE1';
    
    ROLE             COMMON    CON_ID
    -------------------- ------ ----------
    PROLE1             NO          3

    结果作用域范围是:仅当前PDB级别生效。

    5. PDB带 container=all 

    SQL> create role prole2 container=all;
    create role prole2 container=all
    *
    ERROR at line 1:
    ORA-65050: Common DDLs only allowed in root.

    结果作用域范围是:报错,PDB本地数据库中是无法通过 container=all 创建角色的。

    6. PDB带 container=current 

    SQL> create role prole2 container=current;
    
    Role created.
    
    SQL> select role,common,con_id from cdb_roles where role='PROLE2';
    
    ROLE             COMMON    CON_ID
    -------------------- ------ ----------
    PROLE2             NO          3

    结果作用域范围是:仅当前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

  • 相关阅读:
    【代码笔记】iOS-判断是否是模拟机
    【代码笔记】iOS-拍照动画
    【代码笔记】iOS-轮询弹出框
    【代码笔记】iOS-iCarouselDemo
    【代码笔记】iOS-UIScrollerView里有两个tableView
    【代码笔记】iOS-两个时间字符串的比较
    【代码笔记】iOS-利用图片序列创建动态图片效果
    【代码笔记】iOS-离线地图
    【代码笔记】iOS-看图听声音
    【代码笔记】iOS-看图听故事
  • 原文地址:https://www.cnblogs.com/askscuti/p/11769199.html
Copyright © 2020-2023  润新知