zoukankan      html  css  js  c++  java
  • Oracle12c多租户管理用户、角色、权限

    Oracle 数据库 12 c 多租户选项允许单个容器数据库 (CDB) 来承载多个单独的可插拔数据库 (PDB)。
    那么我们如何在容器数据库 (CDB) 和可插拔数据库 (PDB)管理用户权限。


    背景:
    当连接到多租户的数据库中,用户权限的管理相对传统的 Oracle 单数据库环境稍有不同。在多租户环境中有两种类型的用户。
    共同用户(Common User): 该用户存在所有容器 (根和所有的 Pdb) 中。
    本地用户(Local User): 用户只有在特定的 PDB 中存在。同样的用户名中可以存在多个Pdb中创建,但它们之间没有关系。
    同样,有两种类型的角色。
    共同角色(Common Role): 该角色在所有容器 (根和所有的 Pdb) 中。
    本地角色(Local Role): 该角色只存在于特定的 PDB。可以在多个 Pdb中创建相同的角色名称,但它们之间没有关系。
    一些 DDL 语句有扩充,以使他们能够定向到当前容器还是所有容器的CONTAINER子句。它的使用将在以下各节中进行演示。


    一、创建和共同用户
    条件:
    1.必须连接到具有CREATE USER特权的共同用户。
    2.在当前的数据库必须是根容器数据库。
    3.常见的用户的用户名必须与"C##"或"c##"作为前缀,并包含唯一的 ASCII 或 EBCDIC 字符。
    4.在所有容器该共同用户名必须是唯一的。
    5.DEFAULT TABLESPACE、TEMPORARY TABLESPACE、QUOTA和PROFILE必须存在于所有容器中的所有引用对象。
    您可以指定CONTAINER=ALL子句,或者忽略它,因为这是默认设置时,当前的容器是根。
    6.公共用户可以在不同的CDB、PDB数据库中有不同的权限。
    操作:
    在 cdb 中创建公共用户的时候, pdbs 中也会创建相同用户。若CDB 下 GRANT 命令赋权,如果赋权时未指定container=all,则赋权只在CDB中生效,并不会在PDB中生效,这个用户要能够访问PDB,需要切换到 pdb 再赋权。。若赋权时指定 container=all,则赋权在CDB中生效,也在PDB中生效。


    赋权时未指定container=all:
    SQL> show con_name
    CON_NAME
    ------------------------------
    CDB$ROOT
    SQL> create user c##andy02 identified by andy;
    SQL> grant create session to c##andy02;
    C:Usersandy>sqlplus c##andy02/andy@10.100.25.16:1521/andycdb
    Connected to:
    Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
    C:Usersandy>sqlplus c##andy02/andy@10.100.25.16:1521/pdb01
    ERROR:
    ORA-01045: user C##ANDY02 lacks CREATE SESSION privilege; logon denied
    SQL> alter session set container=pdb01;
    SQL> grant create session to c##andy02;
    C:Usersandy>sqlplus c##andy02/andy@10.100.25.16:1521/pdb01
    Connected to:
    Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production


    赋权时指定container=all:
    SQL> show con_name
    CON_NAME
    ------------------------------
    CDB$ROOT
    SQL> create user c##andy identified by andy;
    SQL> grant create session to c##andy container=all;
    C:Usersandy>sqlplus c##andy/andy@10.100.25.16:1521/andycdb
    Connected to:
    Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
    C:Usersandy>sqlplus c##andy/andy@10.100.25.16:1521/pdb01
    Connected to:
    Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production


    二、创建本地用户
    条件:
    1.必须连接到具有CREATE USER特权的用户。
    2.本地用户的用户名不必须与"C##"或"c##"作为前缀。
    3.用户名必须是在 PDB 内是唯一的。
    4.当前的容器是 PDB 的时候,您可以指定CONTAINER=CURRENT子句,或者忽略它,因为这是默认设置。
    操作:
    SQL> show con_name
    CON_NAME
    ------------------------------
    PDB01
    SQL> create user andy identified by andy;
    SQL> grant create session to andy;
    C:Usersandy>sqlplus andy/andy@10.100.25.16:1521/pdb01
    Connected to:
    Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
    -- 去 CDB 中查看 本地用户 ANDY 存在否,果真不存在。
    SQL> show con_name


    CON_NAME
    ------------------------------
    CDB$ROOT
    SQL> select username,created from dba_users where username='ANDY';
    no rows selected


    三、创建共同角色
    类似于前面所述的用户,角色可以是共同的或本地的   。
    Oracle 提供的所有角色在根容器中和所有的 Pdb可见。创建共同角色需要满足以下条件。
    条件
    1.必须连接到共同用户CREATE ROLE与通常授予的SET CONTAINER权限。
    2.当前的容器必须是根容器。
    3.常见角色的角色名称必须与"C##"或"c##"为前缀,并且包含唯一 ASCII 或 EBCDIC 字符。
    4.在所有容器的角色名称必须是唯一的。
    5.角色创建与CONTAINER=ALL子句
    6.公共角色可以赋予公共用户或者本地用户
    操作:
    注意:在 CDB 赋予角色权限的时候,需要指定 container=all ,否则 PDB 中不可见。
    SQL> show con_name
    CON_NAME
    -------------------
    CDB$ROOT
    SQL> create role c##role_andy;
    公共角色赋权 To a common user:
    SQL> grant select on dba_objects to c##role_andy container=all;
    SQL> grant c##role_andy to c##andy container=all;


    C:Usersandy>sqlplus c##andy/andy@10.100.25.16:1521/andycdb
    SQL> 
    set lin 300;
    set pagesize 300;
    col username for a30;
    col granted_role for a30;
    select * from  USER_ROLE_PRIVS;


    USERNAME                       GRANTED_ROLE                   ADM DEL DEF OS_ COM INH
    ------------------------------ ------------------------------ --- --- --- --- --- ---
    C##ANDY                        C##ROLE_ANDY                   NO  NO  YES NO  YES NO
    SQL> select count(*) from dba_objects;


      COUNT(*)
    ----------
         72635


    C:Usersandy>sqlplus c##andy/andy@10.100.25.16:1521/pdb01
    set lin 300;
    set pagesize 300;
    col username for a30;
    col granted_role for a30;
    select * from  USER_ROLE_PRIVS;


    USERNAME                       GRANTED_ROLE                   ADM DEL DEF OS_ COM INH
    ------------------------------ ------------------------------ --- --- --- --- --- ---
    C##ANDY                        C##ROLE_ANDY                   NO  NO  YES NO  YES YES
    SQL>  select count(*) from dba_objects;
      COUNT(*)
    ----------
         72629


    公共角色赋权 To a local  user:
    SQL> alter session set container=pdb01;
    SQL> grant c##role_andy to andy;
    C:Usersandy>sqlplus andy/andy@10.100.25.16:1521/pdb01
    SQL> select count(*) from dba_objects;
      COUNT(*)
    ----------
         72629


    四、创建本地角色
    本地角色是以类似的方式到 pre-12 c 数据库创建的。每个 PDB 可以具有与匹配的名称,因为当地的作用范围仅限于当前 PDB 的角色。
    必须满足以下条件。
    条件:
    1.必须连接到具有CREATE ROLE权限的用户。
    2.如果您连接到公共用户,容器必须设置为本地 PDB。
    3.角色名称为本地角色不必须与"C##"或"c##"作为前缀。
    4.角色名称必须是唯一在 PDB 内。
    5.本地角色可以赋权给公共用户(作用范围局限于pdb内操作,不影响CDB权限)或者本地用户。
    操作:
    SQL> alter session set container=pdb01;
    create role pdb_role;
    grant select on dba_tables to pdb_role; 


    本地角色赋权 To a common user:
    grant pdb_role to c##andy;
    C:Usersandy>sqlplus c##andy/andy@10.100.25.16:1521/pdb01
    SQL> select count(*) from dba_tables;
      COUNT(*)
    ----------
          2106
    C:Usersandy>sqlplus c##andy/andy@10.100.25.16:1521/andycdb
    SQL> select count(*) from dba_tables;
    select count(*) from dba_tables
                         *
    ERROR at line 1:
    ORA-00942: table or view does not exist


    本地角色赋权 To a local user:
    grant pdb_role to andy;
    C:Usersandy>sqlplus andy/andy@10.100.25.16:1521/pdb01
    SQL> select count(*) from dba_tables;
      COUNT(*)
    ----------
          2106

    补充:

    容器数据库创建新用户并分配表空间时必须在没有PDB的情况下进行或PDB与CDB有相同的表空间的时候进行,否则会报错。如果是在PDB与CDB 有相同表空间的情况下给CDB用户分配表空间,则分配CDB的表空间给用户PDB的表空间并不受影响。而且,CDB用户必须以‘C##’为开头,否则创 建不了。

    SQL> create user c##test identified by c##test default tablespace cdb_users temporary tablespace temp01;
    create user c##test identified by c##test default tablespace cdb_users temporary tablespace temp01
    *
    ERROR at line 1:
    ORA-65048: error encountered when processing the current DDL statement in
    pluggable database PDB01
    ORA-00959: tablespace 'CDB_USERS' does not exist

  • 相关阅读:
    表单生成器(Form Builder)之伪造表单数据番外篇——随机车辆牌照
    javascript随机数发现的一个parseInt函数的问题
    在Docker中体验数据库之Microsoft SQL Server
    fab 菜单实现—圆形、半圆、扇形、直线、射线
    fab 菜单实现之前传-钟表表盘
    MySQL安装配置(解压版)
    Django创建App并简单实现登录模块
    Django简单应用的实现
    Django环境搭建
    手写Python中列表和字符串的反转
  • 原文地址:https://www.cnblogs.com/andy6/p/6817274.html
Copyright © 2011-2022 走看看