# 1.管理CDB和PDB中角色的创建。 # a.列出CDB中的所有预定义角色。 connect/as sysdba col role format a30 select ROLE, COMMON, CON_ID from cdb_roles orderby role;
# b.在根目录中列出所有预定义的角色。 select ROLE, COMMON from dba_roles orderby role;
# c.Create a common C##_ROLE in root. create role c##_role container=ALL;
# d. Create a local LOCAL_ROLE in root. create role local_role container=CURRENT; # CDB$ROOT中不允许创建本地用户或角色
# e.列出PDB PDB2中的所有预定义角色。 connectsystem/ oracle_4U@PDB2 col role format a30 select ROLE, COMMON, CON_ID from cdb_roles; # 您只能查看PDB的所有公共角色和本地角色。 select ROLE,COMMON from dba_roles orderby role; # f.在PDB2中创建通用角色。 create role c##_role_PDB2 container=ALL; # 您收到一条错误消息,因为无法从PDB创建通用角色。 # g.在PDB2中创建本地角色。 create role local_role_PDB2 container=CURRENT; select ROLE, COMMON from dba_roles orderby role;
# 2.授予公共或本地角色为公共或本地角色。 # a.从根向普通用户授予普通角色。 connect/as sysdba grant c##_role to c##_user; col grantee format A16 col GRANTED_ROLE format A16 select GRANTEE, GRANTED_ROLE, COMMON, CON_ID from cdb_role_privs where grantee='C##_USER'; # 请注意,公共角色是在本地授予公共用户的。授予的角色仅适用于根。 connect c##_user/x select*from session_roles; connect c##_user/x@PDB2 select*from session_roles; # b.现在,从根目录将通用角色授予通用用户,以适用于所有容器。 connect/as sysdba grant c##_role to c##_user container=all; select GRANTEE, GRANTED_ROLE, COMMON, CON_ID from cdb_role_privs where grantee='C##_USER'; connect c##_user/x select*from session_roles; connect c##_user/x@PDB2 select*from session_roles; # c.撤消公共用户的公共角色,以便该角色不能在任何容器中使用。 connect/as sysdba revoke c##_role from c##_user container=all; connect c##_user/x select*from session_roles; connect c##_user/x@PDB2 select*from session_roles;
# d.从根目录向本地用户授予通用角色。 connect/as sysdba grant c##_role to local_user_pdb2; # 请注意,该用户的根目录未知。它是PDB2中的本地用户。 # e.从PDB2向本地用户授予通用角色。 connectsystem/oracle_4U@PDB2 grant c##_role to local_user_PDB2; select GRANTEE, GRANTED_ROLE, COMMON, CON_ID from cdb_role_privs where grantee='LOCAL_USER_PDB2'; # 请注意,仅在PDB PDB2中向用户授予本地公共角色(公共列=NO)。 # f.以本地用户身份测试连接。 connect local_user_pdb2/x@PDB2 select*from session_roles; # g.从适用于所有容器的PDB2向本地用户授予公共角色。 connectsystem/oracle_4U@PDB2 grant c##_role to local_user_pdb2 container=all; # 注意,不能从PDB全局授予公共角色。 # h.从PDB2向本地用户授予本地角色。 grant local_role_pdb2 to local_user_pdb2; select GRANTEE, GRANTED_ROLE, COMMON, CON_ID from cdb_role_privs where grantee='LOCAL_USER_PDB2'; # i.以本地用户身份测试连接。 connect local_user_pdb2/x@PDB2 select*from session_roles;
# 2.检查如何将CREATE SESSION系统特权授予C##_USER和LOCAL_USER_PDB2 connectsystem/oracle_4U col grantee format a18 col privilege format a14 select GRANTEE, PRIVILEGE, COMMON, CON_ID from cdb_sys_privs where grantee in ('C##_USER', 'LOCAL_USER_PDB2');
connectsystem/oracle_4U@PDB2 select GRANTEE, PRIVILEGE, COMMON from dba_sys_privs where grantee in ('C##_USER', 'LOCAL_USER_PDB2');
# 3.向普通用户C##_USER授予系统特权CREATETABLE和UNLIMITED TABLESPACE,以适用于任何容器。这将是一项普通特权。 connectsystem/oracle_4U grantCREATETABLE, UNLIMITED TABLESPACE to C##_USER CONTAINER=ALL;
# 4.向普通用户C##_USER授予系统特权CREATE SEQUENCE,使其仅适用于root用户。这将是本地特权。 col grantee format a12 grantCREATE SEQUENCE to C##_USER CONTAINER=CURRENT; Grant succeeded. select GRANTEE, PRIVILEGE, COMMON, CON_ID 2from cdb_sys_privs where grantee ='C##_USER';
# 5.向普通用户C##_USER授予系统特权CREATE SYNONYM,使其仅适用于PDB2。这将是本地特权。 connectsystem/oracle_4U@PDB2 col grantee format a18 grantCREATE SYNONYM to C##_USER CONTAINER=CURRENT; select GRANTEE, PRIVILEGE, COMMON, CON_ID from cdb_sys_privs where grantee ='C##_USER';
# 6.向普通用户C##_USER授予系统特权CREATEVIEW,使其仅适用于root 用户,但已连接到PDB2中。 col grantee format a18 grantCREATEVIEWto C##_USER CONTAINER=ALL; # 请注意,您不能从PDB授予通用特权。
# 7.向本地用户LOCAL_USER_PDB2授予系统特权CREATEANYTABLE,以适用于任何容器。 connectsystem/oracle_4U col grantee format a18 grantCREATEANYTABLEto LOCAL_USER_PDB2 CONTAINER=ALL; # 请注意,该用户的root用户身份未知。它是PDB2中的本地用户。
# 8.向本地用户LOCAL_USER_PDB2授予系统特权CREATEANY SEQUENCE,以仅在root 用户中适用。 grantCREATEANY SEQUENCE to LOCAL_USER_PDB2 CONTAINER=CURRENT;
# 9.向本地用户LOCAL_USER_PDB2授予系统特权UNLIMITED TABLESPACE,使其仅适用于PDB2。这将是本地特权。 connectsystem/oracle_4U@PDB2 col grantee format a18 grant UNLIMITED TABLESPACE to LOCAL_USER_PDB2; select GRANTEE, PRIVILEGE, COMMON, CON_ID from cdb_sys_privs where grantee ='LOCAL_USER_PDB2';
# 1.查找有关默认(用户级别)和特定于对象的CONTAINER_DATA属性的信息,这些属性在DBA_CONTAINER_DATA数据字典视图中明确设置为DEFAULT以外的值。 CONNECT/as sysdba COLUMN USERNAME FORMAT A10 COLUMN DEFAULT_ATTR FORMAT A7 COLUMN OWNER FORMAT A8 COLUMN OBJECT_NAME FORMAT A10 COLUMN ALL_CONTAINERS FORMAT A3 COLUMN CONTAINER_NAME FORMAT A10 COLUMN CON_ID FORMAT 999 set pages 100 set line 200 SELECT USERNAME, DEFAULT_ATTR, OWNER, OBJECT_NAME, ALL_CONTAINERS, CONTAINER_NAME, CON_ID FROM CDB_CONTAINER_DATA WHERE username NOTIN ('GSMADMIN_INTERNAL', 'APPQOSSYS', 'DBSNMP') ORDERBY OBJECT_NAME; # 2.创建普通用户 c##jfv 并授予c##jfv 的系统权限CREATE SESSION和SET CONTAINER 。 CREATEUSER c##jfv IDENTIFIED BY oracle_4U CONTAINER=ALL; GRANTCREATE SESSION, SET CONTAINER TO c##jfv CONTAINER=ALL;
# 3.然后在V_$SESSION视图上授予c##jfv对象特权SELECT 。 GRANTSELECTON sys.v_$session TO c##jfv CONTAINER=ALL;
# 4.创建另一个以SYS用户身份连接到pdb1_1的会话,并保持连接状态。 ORACLE_SID = cdb2 sqlplus sys/oracle_4U@pdb1_1 as sysdba SHOW CON_NAME ALTER SESSION SET CONTAINER=pdb1_1; SHOW CON_NAME
# 5.在第一个会话中,您应该看到pdb1_1的一行。 SELECT username, con_id FROM v_$session WHERE username ISNOTNULLAND username <>'DBSNMP';
# 6.仍然在第一个会话中,以普通用户c##jfv身份连接。普通用户看不到V_$SESSION中与pdb1_1相关的任何信息。 CONNECT c##jfv/oracle_4U SELECT username, con_id FROM sys.v_$session WHERE username ISNOTNULLAND username <>'DBSNMP';
# 7.启用普通用户c##jfv来查看V_$SESSION中与pdb1_1相关的信息。 CONNECT/AS SYSDBA ALTERUSER c##jfv SET CONTAINER_DATA = (CDB$ROOT, PDB1_1, PDB2_2) FOR V_$SESSION CONTAINER=CURRENT;
# 8.以普通用户c##jfv的身份连接pdb1_1以查看V$SESSION中与以下内容有关的信息: CONNECT c##jfv/oracle_4U SELECT username, con_id FROM sys.v_$session WHERE username ISNOTNULLAND username <>'DBSNMP';
# 9.查看对象上公共用户C##JFV的CONTAINER_DATA属性集 CONNECT/AS SYSDBA Connected. COLUMN USERNAME FORMAT A25 COLUMN DEFAULT_ATTR FORMAT A7 COLUMN OWNER FORMAT A15 COLUMN OBJECT_NAME FORMAT A15 COLUMN ALL_CONTAINERS FORMAT A3 COLUMN CONTAINER_NAME FORMAT A10 COLUMN CON_ID FORMAT 999 set pages 100 set line 200 SELECT USERNAME, DEFAULT_ATTR, OWNER, OBJECT_NAME, ALL_CONTAINERS, CONTAINER_NAME, CON_ID FROM CDB_CONTAINER_DATA WHERE username NOTIN ('GSMADMIN_INTERNAL', 'APPQOSSYS', 'DBSNMP') ORDERBY OBJECT_NAME;