演習: ローカル・ユーザーによる共通操作のブロックの防止 - レルム

この演習では、共通ユーザーがPDB内の自分のスキーマのローカル・データにアクセスするのを妨げるOracle Database Vaultコントロールを、ローカル・ユーザーが共通ユーザー・オブジェクトに作成できないようにする方法を示します。PDBのローカルDatabase Vault所有者は、DVSYSCTXSYSなどの共通Oracleスキーマの周囲にレルムを作成し、正しく機能しないようにできます。この演習の目的として、この機能を示すためにC##TEST1カスタム・スキーマがCDBルートに作成されます。

  1. 新しい演習を開始する前に、演習の環境の推奨事項を参照してください。
  2. 演習を開始する前に、/home/oracle/labs/M104781GC10/setup_DV.shシェル・スクリプトを実行します。このシェル・スクリプトでは、CDBルート・レベルでDatabase Vaultを構成して有効にし、ルート・コンテナにHR.G_EMP表を作成し、PDBレベルでDatabase Vaultを構成して有効にし、PDB20HR.L_EMP表を作成します。
    $ cd /home/oracle/labs/M104781GC10
    $ /home/oracle/labs/M104781GC10/setup_DV.sh
    $ ./setup_DV_CDB.sh
    
    SQL*Plus: Release 20.0.0.0.0 - Production on Wed Feb 19 05:38:54 2020
    Version 20.2.0.0.0
    
    Copyright (c) 1982, 2020, Oracle.  All rights reserved.
    
    
    Connected to:
    Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
    Version 20.2.0.0.0
    
    SQL> drop user c##sec_admin cascade;
    drop user c##sec_admin cascade
              *
    ERROR at line 1:
    ORA-01918: user 'C##SEC_ADMIN' does not exist
    
    
    SQL> create user c##sec_admin identified by password container=ALL;
    
    User created.
    
    SQL> grant create session, set container, restricted session, DV_OWNER to c##sec_admin container=ALL;
    
    Grant succeeded.
    
    SQL> drop user c##accts_admin cascade;
    drop user c##accts_admin cascade
              *
    ERROR at line 1:
    ORA-01918: user 'C##ACCTS_ADMIN' does not exist
    
    
    SQL> create user c##accts_admin identified by password container=ALL;
    
    User created.
    
    SQL> grant create session, set container, DV_ACCTMGR to c##accts_admin container=ALL;
    
    Grant succeeded.
    
    SQL> grant select on sys.dba_dv_status to c##accts_admin container=ALL;
    
    Grant succeeded.
    
    SQL> EXIT
    Disconnected from Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
    Version 20.2.0.0.0
    ...
    Copyright (c) 1982, 2020, Oracle.  All rights reserved.
    
    Last Successful login time: Tue Feb 18 2020 08:26:21 +00:00
    
    SQL> DROP TABLE g_emp;
    
    Table dropped.
    
    SQL> CREATE TABLE g_emp(name CHAR(10), salary NUMBER) ;
    
    Table created.
    
    SQL> INSERT INTO g_emp values('EMP_GLOBAL',1000);
    
    1 row created.
    
    SQL> COMMIT;
    
    Commit complete.
    
    SQL> EXIT
    Disconnected from Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
    Version 20.2.0.0.0
    
    SQL*Plus: Release 20.0.0.0.0 - Production on Tue Feb 18 08:27:58 2020
    Version 20.2.0.0.0
    
    Copyright (c) 1982, 2020, Oracle.  All rights reserved.
    
    Last Successful login time: Tue Feb 18 2020 08:27:54 +00:00
    
    Connected to:
    Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
    Version 20.2.0.0.0
    
    SQL> DROP TABLE l_emp;
    
    Table dropped.
    
    SQL> CREATE TABLE l_emp(name CHAR(10), salary NUMBER);
    
    Table created.
    
    SQL> INSERT INTO l_emp values('EMP_LOCAL',2000);
    
    1 row created.
    
    SQL> COMMIT;
    
    Commit complete.
    
    SQL> EXIT
    Disconnected from Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
    Version 20.2.0.0.0
    
    SQL*Plus: Release 20.0.0.0.0 - Production on Tue Feb 18 08:27:58 2020
    Version 20.2.0.0.0
    
    Copyright (c) 1982, 2020, Oracle.  All rights reserved.
    
    Last Successful login time: Tue Feb 18 2020 08:27:54 +00:00
    
    Connected to:
    Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
    Version 20.2.0.0.0
    
    SQL> DROP TABLE l_tab;
    
    Table dropped.
    
    SQL> CREATE TABLE l_tab(code NUMBER);
    
    Table created.
    
    SQL> INSERT INTO l_tab values(1);
    
    1 row created.
    
    SQL> INSERT INTO l_tab values(2);
    
    1 row created.
    
    SQL> COMMIT;
    
    Commit complete.
    
    SQL> EXIT
    Disconnected from Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
    Version 20.2.0.0.0
    $
  3. C##SEC_ADMINとしてCDBルートに接続し、DV_ALLOW_COMMON_OPERATIONのステータスを確認します。これはデフォルトの動作で、ローカル・ユーザーは共通ユーザー・オブジェクトにDatabase Vaultコントロールを作成できます。
    $ sqlplus c##sec_admin
    Enter password: password
    
    SQL> SELECT * FROM DVSYS.DBA_DV_COMMON_OPERATION_STATUS;
    
    NAME                      STATU
    ------------------------- -----
    DV_ALLOW_COMMON_OPERATION FALSE
    
    SQL>
  4. C##TEST1オブジェクトにレルムが適用されていない場合に、CDBルートの表C##TEST1.G_EMPPDB20の表C##TEST1.L_EMPの両方でデータにアクセスできるかどうかをテストします。
    1. 表の共通所有者であるC##TEST1としてCDBルートに接続します。
      SQL> CONNECT c##test1
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.g_emp;
      
      NAME           SALARY
      ---------- ----------
      EMP_GLOBAL       1000
      
      SQL>
    2. 別の共通ユーザーであるC##TEST2としてCDBルートに接続します。
      SQL> CONNECT c##test2
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.g_emp;
      
      NAME           SALARY
      ---------- ----------
      EMP_GLOBAL       1000
      
      SQL>
    3. 表の共通所有者であるC##TEST1としてPDB20に接続します。
      SQL> CONNECT c##test1@PDB20
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.l_emp;
      
      NAME           SALARY
      ---------- ----------
      EMP_LOCAL        2000
      
      SQL>
    4. 別の共通ユーザーであるC##TEST2としてPDB20に接続します。
      SQL> CONNECT c##test2@PDB20
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.l_emp;
      
      NAME           SALARY
      ---------- ----------
      EMP_LOCAL        2000
      
      SQL>
  5. CDBルートのC##TEST1オブジェクトに標準レルムが適用されている場合に、CDBルートの表HR.G_EMPPDB20の表C##TEST1.L_EMPの両方でデータにアクセスできるかどうかをテストします。
    1. CDBルートのC##TEST1表に共通標準レルムを作成します。
      SQL> CONNECT c##sec_admin
      Enter password: password
      Connected.
      SQL> BEGIN
       DBMS_MACADM.CREATE_REALM(
        realm_name    => 'Root Test Realm',
        description   => 'Test Realm description',
        enabled       => DBMS_MACUTL.G_YES,
        audit_options => DBMS_MACUTL.G_REALM_AUDIT_FAIL,
        realm_type    => 0);
      END;
      /  2    3    4    5    6    7    8    9
      
      PL/SQL procedure successfully completed.
      
      SQL> BEGIN
       DBMS_MACADM.ADD_OBJECT_TO_REALM(
        realm_name   => 'Root Test Realm',
        object_owner => 'C##TEST1',
        object_name  => '%',
        object_type  => '%');
      END;
      /  2    3    4    5    6    7    8
      
      PL/SQL procedure successfully completed.
      
      SQL>
    2. 表の共通所有者であるC##TEST1としてCDBルートに接続します。
      SQL> CONNECT c##test1
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.g_emp;
      
      NAME           SALARY
      ---------- ----------
      EMP_GLOBAL       1000
      
      SQL>
    3. 別の共通ユーザーであるC##TEST2としてCDBルートに接続します。
      SQL> CONNECT c##test2
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.g_emp;
      SELECT * FROM c##test1.g_emp
                             *
      ERROR at line 1:
      ORA-01031: insufficient privileges
      
      SQL>
    4. 表の共通所有者であるC##TEST1としてPDB20に接続します。
      SQL> CONNECT c##test1@PDB20
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.l_emp;
      
      NAME           SALARY
      ---------- ----------
      EMP_LOCAL        2000
      
      SQL>
    5. 別の共通ユーザーであるC##TEST2としてPDB20に接続します。
      SQL> CONNECT c##test2@PDB20
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.l_emp;
      
      NAME           SALARY
      ---------- ----------
      EMP_LOCAL        2000
      
      SQL>
    6. レルムを削除します。
      SQL> CONNECT c##sec_admin
      Enter password: password
      Connected.
      SQL> EXEC DBMS_MACADM.DELETE_REALM_CASCADE('Root Test Realm')
      
      PL/SQL procedure successfully completed.
      
      SQL>
  6. CDBルートのC##TEST1オブジェクトに必須レルムが適用されている場合に、CDBルートの表C##TEST1.G_EMPPDB20の表C##TEST1.L_EMPの両方でデータにアクセスできるかどうかをテストします。
    1. CDBルートのC##TEST1表に共通必須レルムを作成します。
      SQL> BEGIN
       DBMS_MACADM.CREATE_REALM(
        realm_name    => 'Root Test Realm',
        description   => 'Test Realm description',
        enabled       => DBMS_MACUTL.G_YES,
        audit_options => DBMS_MACUTL.G_REALM_AUDIT_FAIL,
        realm_type    => 1);
      END;
      /  2    3    4    5    6    7    8    9
      
      PL/SQL procedure successfully completed.
      
      SQL> BEGIN
       DBMS_MACADM.ADD_OBJECT_TO_REALM(
        realm_name   => 'Root Test Realm',
        object_owner => 'C##TEST1',
        object_name  => '%',
        object_type  => '%');
      END;
      /  2    3    4    5    6    7    8
      
      PL/SQL procedure successfully completed.
      
      SQL>
    2. 表の共通所有者であるC##TEST1としてCDBルートに接続します。
      SQL> CONNECT c##test1
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.g_emp;
      SELECT * FROM c##test1.g_emp
                             *
      ERROR at line 1:
      ORA-01031: insufficient privileges
      
      SQL>
    3. 別の共通ユーザーであるC##TEST2としてCDBルートに接続します。
      SQL> CONNECT c##test2
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.g_emp;
      SELECT * FROM c##test1.g_emp
                             *
      ERROR at line 1:
      ORA-01031: insufficient privileges
      
      SQL>
    4. 表の共通所有者であるC##TEST1としてPDB20に接続します。
      SQL> CONNECT c##test1@PDB20
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.l_emp;
      
      NAME           SALARY
      ---------- ----------
      EMP_LOCAL        2000
      
      SQL>
    5. 別の共通ユーザーであるC##TEST2としてPDB20に接続します。
      SQL> CONNECT c##test2@PDB20
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.l_emp;
      
      NAME           SALARY
      ---------- ----------
      EMP_LOCAL        2000
      
      SQL>
    6. レルムを削除します。
      SQL> CONNECT c##sec_admin
      Enter password: password
      Connected.
      SQL> EXEC DBMS_MACADM.DELETE_REALM_CASCADE('Root Test Realm')
      
      PL/SQL procedure successfully completed.
      
      SQL>
  7. PDB20C##TEST1オブジェクトにPDB標準レルムが適用されている場合に、CDBルートの表C##TEST1.G_EMPPDB20の表C##TEST1.L_EMPの両方でデータにアクセスできるかどうかをテストします。
    1. PDB20C##TEST1表にPDB標準レルムを作成します。
      SQL> CONNECT sec_admin@PDB20
      Enter password: password
      Connected.
      SQL> BEGIN
       DBMS_MACADM.CREATE_REALM(
        realm_name    => 'Test Realm',
        description   => 'Test Realm description',
        enabled       => DBMS_MACUTL.G_YES,
        audit_options => DBMS_MACUTL.G_REALM_AUDIT_FAIL,
        realm_type    => 0);
      END;
      /  2    3    4    5    6    7    8    9
      
      PL/SQL procedure successfully completed.
      
      SQL> BEGIN
       DBMS_MACADM.ADD_OBJECT_TO_REALM(
        realm_name   => 'Test Realm',
        object_owner => 'C##TEST1',
        object_name  => '%',
        object_type  => '%');
      END;
      /  2    3    4    5    6    7    8
      
      PL/SQL procedure successfully completed.
      
      SQL>
    2. 表の共通所有者であるC##TEST1としてCDBルートに接続します。
      SQL> CONNECT c##test1
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.g_emp;
      
      NAME           SALARY
      ---------- ----------
      EMP_GLOBAL       1000
      
      SQL>
    3. 別の共通ユーザーであるC##TEST2としてCDBルートに接続します。
      SQL> CONNECT c##test2
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.g_emp;
      
      NAME           SALARY
      ---------- ----------
      EMP_GLOBAL       1000
      
      SQL>
    4. 表の共通所有者であるC##TEST1としてPDB20に接続します。
      SQL> CONNECT c##test1@PDB20
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.l_emp;
      
      NAME           SALARY
      ---------- ----------
      EMP_LOCAL        2000
      
      SQL>
    5. 別の共通ユーザーであるC##TEST2としてPDB20に接続します。
      SQL> CONNECT c##test2@PDB20
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.l_emp;
      SELECT * FROM c##test1.l_emp
                             *
      ERROR at line 1:
      ORA-01031: insufficient privileges
      
      SQL>
    6. レルムを削除します。
      SQL> CONNECT sec_admin@PDB20
      Enter password: password
      Connected.
      SQL> EXEC DBMS_MACADM.DELETE_REALM_CASCADE('Test Realm')
      
      PL/SQL procedure successfully completed.
      
      SQL>
  8. PDB20C##TEST1オブジェクトにPDB必須レルムが適用されている場合に、CDBルートの表C##TEST1.G_EMPPDB20の表C##TEST1.L_EMPの両方でデータにアクセスできるかどうかをテストします。
    1. PDB20C##TEST1表にPDB必須レルムを作成します。
      SQL> CONNECT sec_admin@PDB20
      Enter password: password
      Connected.
      SQL> BEGIN
       DBMS_MACADM.CREATE_REALM(
        realm_name    => 'Test Realm',
        description   => 'Test Realm description',
        enabled       => DBMS_MACUTL.G_YES,
        audit_options => DBMS_MACUTL.G_REALM_AUDIT_FAIL,
        realm_type    => 1);
      END;
      /  2    3    4    5    6    7    8    9
      
      PL/SQL procedure successfully completed.
      
      SQL> BEGIN
       DBMS_MACADM.ADD_OBJECT_TO_REALM(
        realm_name   => 'Test Realm',
        object_owner => 'C##TEST1',
        object_name  => '%',
        object_type  => '%');
      END;
      /  2    3    4    5    6    7    8
      
      PL/SQL procedure successfully completed.
      
      SQL>
    2. 表の共通所有者であるC##TEST1としてCDBルートに接続します。
      SQL> CONNECT c##test1
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.g_emp;
      
      NAME           SALARY
      ---------- ----------
      EMP_GLOBAL       1000
      
      SQL>
    3. 別の共通ユーザーであるC##TEST2としてCDBルートに接続します。
      SQL> CONNECT c##test2
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.g_emp;
      
      NAME           SALARY
      ---------- ----------
      EMP_GLOBAL       1000
      
      SQL>
    4. 表の共通所有者であるC##TEST1としてPDB20に接続します。
      SQL> CONNECT c##test1@PDB20
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.l_emp;
      SELECT * FROM c##test1.l_emp
                             *
      ERROR at line 1:
      ORA-01031: insufficient privileges
      
      SQL>
    5. 別の共通ユーザーであるC##TEST2としてPDB20に接続します。
      SQL> CONNECT c##test2@PDB20
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.l_emp;
      SELECT * FROM c##test1.l_emp
                             *
      ERROR at line 1:
      ORA-01031: insufficient privileges
      
      SQL>
    6. レルムを削除します。
      SQL> CONNECT sec_admin@PDB20
      Enter password: password
      Connected.
      SQL> EXEC DBMS_MACADM.DELETE_REALM_CASCADE('Test Realm')
      
      PL/SQL procedure successfully completed.
      
      SQL>
  9. CDBルートにC##SEC_ADMINとして接続し、ローカル・ユーザーが共通ユーザーC##TEST1オブジェクトにOracle Database Vaultコントロールを作成できないように制限します。DV_ALLOW_COMMON_OPERATIONTRUEに設定します。
    SQL CONNECT c##sec_admin
    Enter password: password
    Connected.
    SQL> SELECT * FROM DVSYS.DBA_DV_COMMON_OPERATION_STATUS;
    
    NAME                      STATU
    ------------------------- -----
    DV_ALLOW_COMMON_OPERATION FALSE
    
    SQL> EXEC DBMS_MACADM.ALLOW_COMMON_OPERATION
    
    PL/SQL procedure successfully completed.
    
    SQL> SELECT * FROM DVSYS.DBA_DV_COMMON_OPERATION_STATUS;
    
    NAME                      STATU
    ------------------------- -----
    DV_ALLOW_COMMON_OPERATION TRUE
    
    SQL>
  10. CDBルートのC##TEST1オブジェクトに標準レルムが適用されている場合に、CDBルートの表C##TEST1.G_EMPPDB20の表C##TEST1.L_EMPの両方でデータにアクセスできるかどうかをテストします。
    1. CDBルートのC##TEST1表に共通標準レルムを作成します。
      SQL CONNECT c##sec_admin
      Enter password: password
      Connected.
      SQL> BEGIN
       DBMS_MACADM.CREATE_REALM(
        realm_name    => 'Root Test Realm',
        description   => 'Test Realm description',
        enabled       => DBMS_MACUTL.G_YES,
        audit_options => DBMS_MACUTL.G_REALM_AUDIT_FAIL,
        realm_type    => 0);
      END;
      /  2    3    4    5    6    7    8    9
      
      PL/SQL procedure successfully completed.
      
      SQL> BEGIN
       DBMS_MACADM.ADD_OBJECT_TO_REALM(
        realm_name   => 'Root Test Realm',
        object_owner => 'C##TEST1',
        object_name  => '%',
        object_type  => '%');
      END;
      /  2    3    4    5    6    7    8
      
      PL/SQL procedure successfully completed.
      
      SQL>
    2. 表の共通所有者であるC##TEST1としてCDBルートに接続します。
      SQL> CONNECT c##test1
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.g_emp;
      
      NAME           SALARY
      ---------- ----------
      EMP_GLOBAL       1000
      
      SQL>
    3. 別の共通ユーザーであるC##TEST2としてCDBルートに接続します。
      SQL> CONNECT c##test2
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.g_emp;
      SELECT * FROM c##test1.g_emp
                             *
      ERROR at line 1:
      ORA-01031: insufficient privileges
      
      SQL>
    4. 表の共通所有者であるC##TEST1としてPDB20に接続します。
      SQL> CONNECT c##test1@PDB20
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.l_emp;
      
      NAME           SALARY
      ---------- ----------
      EMP_LOCAL        2000
      
      SQL>
    5. 別の共通ユーザーであるC##TEST2としてPDB20に接続します。
      SQL> CONNECT c##test2@PDB20
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.l_emp;
      
      NAME           SALARY
      ---------- ----------
      EMP_LOCAL        2000
      
      SQL>
    6. レルムを削除します。
      SQL> CONNECT c##sec_admin
      Enter password: password
      Connected.
      SQL> EXEC DBMS_MACADM.DELETE_REALM_CASCADE('Root Test Realm')
      
      PL/SQL procedure successfully completed.
      
      SQL>
  11. CDBルートのC##TEST1オブジェクトに必須レルムが適用されている場合に、CDBルートの表C##TEST1.G_EMPPDB20の表C##TEST1.L_EMPの両方でデータにアクセスできるかどうかをテストします。
    1. CDBルートのC##TEST1表に共通必須レルムを作成します。
      SQL> BEGIN
       DBMS_MACADM.CREATE_REALM(
        realm_name    => 'Root Test Realm',
        description   => 'Test Realm description',
        enabled       => DBMS_MACUTL.G_YES,
        audit_options => DBMS_MACUTL.G_REALM_AUDIT_FAIL,
        realm_type    => 1);
      END;
      /  2    3    4    5    6    7    8    9
      
      PL/SQL procedure successfully completed.
      
      SQL> BEGIN
       DBMS_MACADM.ADD_OBJECT_TO_REALM(
        realm_name   => 'Root Test Realm',
        object_owner => 'C##TEST1',
        object_name  => '%',
        object_type  => '%');
      END;
      /  2    3    4    5    6    7    8
      
      PL/SQL procedure successfully completed.
      
      SQL>
    2. 表の共通所有者であるC##TEST1としてCDBルートに接続します。
      SQL> CONNECT c##test1
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.g_emp;
      SELECT * FROM c##test1.g_emp
                             *
      ERROR at line 1:
      ORA-01031: insufficient privileges
      
      SQL>
    3. 別の共通ユーザーであるC##TEST2としてCDBルートに接続します。
      SQL> CONNECT c##test2
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.g_emp;
      SELECT * FROM c##test1.g_emp
                             *
      ERROR at line 1:
      ORA-01031: insufficient privileges
      
      SQL>
    4. 表の共通所有者であるC##TEST1としてPDB20に接続します。
      SQL> CONNECT c##test1@PDB20
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.l_emp;
      
      NAME           SALARY
      ---------- ----------
      EMP_LOCAL        2000
      
      SQL>
    5. 別の共通ユーザーであるC##TEST2としてPDB20に接続します。
      SQL> CONNECT c##test2@PDB20
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.l_emp;
      
      NAME           SALARY
      ---------- ----------
      EMP_LOCAL        2000
      
      SQL>
    6. レルムを削除します。
      SQL> CONNECT c##sec_admin
      Enter password: password
      Connected.
      SQL> EXEC DBMS_MACADM.DELETE_REALM_CASCADE('Root Test Realm')
      
      PL/SQL procedure successfully completed.
      
      SQL>
  12. PDB20C##TEST1オブジェクトにPDB標準レルムが適用されている場合に、CDBルートの表C##TEST1.G_EMPPDB20の表C##TEST1.L_EMPの両方でデータにアクセスできるかどうかをテストします。
    1. PDB20C##TEST1表にPDB標準レルムを作成します。
      SQL> CONNECT sec_admin@PDB20
      Enter password: password
      Connected.
      SQL> BEGIN
       DBMS_MACADM.CREATE_REALM(
        realm_name    => 'Test Realm1',
        description   => 'Test Realm description',
        enabled       => DBMS_MACUTL.G_YES,
        audit_options => DBMS_MACUTL.G_REALM_AUDIT_FAIL,
        realm_type    => 0);
      END;
      /  2    3    4    5    6    7    8    9
      
      PL/SQL procedure successfully completed.
      
      SQL> BEGIN
       DBMS_MACADM.ADD_OBJECT_TO_REALM(
        realm_name   => 'Test Realm1',
        object_owner => 'C##TEST1',
        object_name  => '%',
        object_type  => '%');
      END;
      /  2    3    4    5    6    7    8
      BEGIN
      *
      ERROR at line 1:
      ORA-47286: cannot add %, C##TEST1.%  to a realm
      ORA-06512: at "DVSYS.DBMS_MACADM", line 1059
      ORA-06512: at line 2
      
      
      SQL> !oerr ora 47286
      47286, 00000, "cannot add %s, %s.%s  to a realm"
      // *Cause: When ALLOW COMMON OPERATION was set to TRUE, a smaller scope user was not allowed to add a larger scope user's object or a larger scope role to a realm.
      // *Action: When ALLOW COMMON OPERATION is TRUE, do not add a larger scope user's object or a larger scope role to a realm.
      
      SQL>
    2. 表の共通所有者であるC##TEST1としてCDBルートに接続します。
      SQL> CONNECT c##test1
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.g_emp;
      
      NAME           SALARY
      ---------- ----------
      EMP_GLOBAL       1000
      
      SQL>
    3. 別の共通ユーザーであるC##TEST2としてCDBルートに接続します。
      SQL> CONNECT c##test2
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.g_emp;
      
      NAME           SALARY
      ---------- ----------
      EMP_GLOBAL       1000
      
      SQL>
    4. 表の共通所有者であるC##TEST1としてPDB20に接続します。
      SQL> CONNECT c##test1@PDB20
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.l_emp;
      
      NAME           SALARY
      ---------- ----------
      EMP_LOCAL        2000
      
      SQL>
    5. 別の共通ユーザーであるC##TEST2としてPDB20に接続します。
      SQL> CONNECT c##test2@PDB20
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.l_emp;
      
      NAME           SALARY
      ---------- ----------
      EMP_LOCAL        2000
      
      SQL>
    6. レルムを削除します。
      SQL> CONNECT sec_admin@PDB20
      Enter password: password
      Connected.
      SQL> EXEC DBMS_MACADM.DELETE_REALM_CASCADE('Test Realm1')
      
      PL/SQL procedure successfully completed.
      
      SQL>
  13. PDB20C##TEST1オブジェクトにPDB必須レルムが適用されている場合に、CDBルートの表C##TEST1.G_EMPPDB20の表C##TEST1.L_EMPの両方でデータにアクセスできるかどうかをテストします。
    1. PDB20C##TEST1表にPDB必須レルムを作成します。
      SQL> BEGIN
       DBMS_MACADM.CREATE_REALM(
        realm_name    => 'Test Realm1',
        description   => 'Test Realm description',
        enabled       => DBMS_MACUTL.G_YES,
        audit_options => DBMS_MACUTL.G_REALM_AUDIT_FAIL,
        realm_type    => 1);
      END;
      /  2    3    4    5    6    7    8    9
      
      PL/SQL procedure successfully completed.
      
      SQL> BEGIN
       DBMS_MACADM.ADD_OBJECT_TO_REALM(
        realm_name   => 'Test Realm1',
        object_owner => 'C##TEST1',
        object_name  => '%',
        object_type  => '%');
      END;
      /  2    3    4    5    6    7    8
      BEGIN
      *
      ERROR at line 1:
      ORA-47286: cannot add %, C##TEST1.%  to a realm
      ORA-06512: at "DVSYS.DBMS_MACADM", line 1059
      ORA-06512: at line 2
      
      SQL>
    2. 表の共通所有者であるC##TEST1としてCDBルートに接続します。
      SQL> CONNECT c##test1
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.g_emp;
      
      NAME           SALARY
      ---------- ----------
      EMP_GLOBAL       1000
      
      SQL>
    3. 別の共通ユーザーであるC##TEST2としてCDBルートに接続します。
      SQL> CONNECT c##test2
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.g_emp;
      
      NAME           SALARY
      ---------- ----------
      EMP_GLOBAL       1000
      
      SQL>
    4. 表の共通所有者であるC##TEST1としてPDB20に接続します。
      SQL> CONNECT c##test1@PDB20
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.l_emp;
      
      NAME           SALARY
      ---------- ----------
      EMP_LOCAL        2000
      
      SQL>
    5. 別の共通ユーザーであるC##TEST2としてPDB20に接続します。
      SQL> CONNECT c##test2@PDB20
      Enter password: password
      Connected.
      SQL> SELECT * FROM c##test1.l_emp;
      
      NAME           SALARY
      ---------- ----------
      EMP_LOCAL        2000
      
      SQL>
    6. レルムを削除します。
      SQL> CONNECT sec_admin@PDB20
      Enter password: password
      Connected.
      SQL> EXEC DBMS_MACADM.DELETE_REALM_CASCADE('Test Realm1')
      
      PL/SQL procedure successfully completed.
      
      SQL>
  14. PDBとCDBルートの両方でDatabase Vaultを無効にします。
    $ /home/oracle/labs/M104781GC10/disable_DV.sh
    SQL*Plus: Release 20.0.0.0.0 - Production on Mon Apr 6 15:25:59 2020
    Version 20.2.0.0.0
    
    Copyright (c) 1982, 2019, Oracle.  All rights reserved.
    
    Last Successful login time: Mon Apr 06 2020 15:23:56 +00:00
    
    Connected to:
    Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
    Version 20.2.0.0.0
    
    SQL> exec DVSYS.DBMS_MACADM.DISABLE_DV
    
    PL/SQL procedure successfully completed.
    
    SQL> exit
    Disconnected from Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
    Version 20.2.0.0.0
    
    SQL*Plus: Release 20.0.0.0.0 - Production on Mon Apr 6 15:26:00 2020
    Version 20.2.0.0.0
    
    Copyright (c) 1982, 2019, Oracle.  All rights reserved.
    
    Last Successful login time: Mon Apr 06 2020 15:23:58 +00:00
    
    Connected to:
    Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
    Version 20.2.0.0.0
    
    SQL> exec DVSYS.DBMS_MACADM.DISABLE_DV
    
    PL/SQL procedure successfully completed.
    
    SQL> exit
    Disconnected from Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
    Version 20.2.0.0.0
    
    SQL*Plus: Release 20.0.0.0.0 - Production on Mon Apr 6 15:26:02 2020
    Version 20.2.0.0.0
    
    Copyright (c) 1982, 2019, Oracle.  All rights reserved.
    
    
    Connected to:
    Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
    Version 20.2.0.0.0
    
    SQL> shutdown immediate
    Database closed.
    Database dismounted.
    ORACLE instance shut down.
    SQL> exit
    Disconnected from Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
    Version 20.2.0.0.0
    
    SQL*Plus: Release 20.0.0.0.0 - Production on Mon Apr 6 15:26:23 2020
    Version 20.2.0.0.0
    
    Copyright (c) 1982, 2019, Oracle.  All rights reserved.
    
    Connected to an idle instance.
    
    SQL> STARTUP
    ORACLE instance started.
    
    Total System Global Area 6442447392 bytes
    Fixed Size                  9581088 bytes
    Variable Size            1090519040 bytes
    Database Buffers         5318377472 bytes
    Redo Buffers               23969792 bytes
    Database mounted.
    Database opened.
    SQL> ALTER PLUGGABLE DATABASE all OPEN;
    
    Pluggable database altered.
    
    SQL> exit
    Disconnected from Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
    Version 20.2.0.0.0
    $
DV_ALLOW_COMMON_OPERATION値を切り替えたときのPDBの共通ユーザー・オブジェクトに対するデータ・アクセスの動作をまとめてみましょう。
  FALSE     TRUE    
    C##TEST1 C##TEST2   C##TEST1 C##TEST2
CDBルートの共通標準レルムまたは共通必須レルム   変化なし 変化なし   変化なし 変化なし
PDB通常レルム   アクセス ブロック   アクセス アクセス
PDB必須レルム   ブロック ブロック   アクセス アクセス

通常または必須のレルムをCDBルートに作成し、通常または必須のPDBレルムを作成した場合かつDV_ALLOW_COMMON_OPERATIONTRUEの場合は、共通ユーザー・オブジェクトのデータにアクセスできます。

DV_ALLOW_COMMON_OPERATIONFALSEに設定されたときにローカル・レルムが作成されていた場合は、新しいコントロール後もローカル・レルムは存在しますが、強制は無視されます。