オラクる。

oracle専門ブログにしてみようかな~っと

2016年07月

12cの新機能、Data Redactionはデータをリアルタイムに変換する機能です。
変換すると言ってもデータを直接書き換えるのではなく、クライアントに見えるところだけを書き換える形になります。
また、データを直接書き換えるわけではないので、負荷は低いようです。

まずは準備から

[oracle@DB01 ~]$ sqlplus sys/password@localhost/pdb1.test.local as sysdba


SQL> GRANT EXECUTE ON sys.dbms_redact TO test;

権限付与が成功しました。


testというユーザーを作り、パッケージdbms_redactを実行できる権限を与えます。

[oracle@DB01 ~]$ sqlplus test/password@localhost/pdb1.test.local

SQL> DROP TABLE payment_details PURGE;
DROP TABLE payment_details PURGE
           *
行1でエラーが発生しました。:
ORA-00942: 表またはビューが存在しません。

CREATE TABLE payment_details (
  id          NUMBER       NOT NULL,
  customer_id NUMBER       NOT NULL,
  card_no     NUMBER       NOT NULL,
  card_string VARCHAR2(19) NOT NULL,
  expiry_date DATE         NOT NULL,
  sec_code    NUMBER       NOT NULL,
  valid_date  DATE,
  CONSTRAINT payment_details_pk PRIMARY KEY (id)
  );

INSERT INTO payment_details VALUES (1, 4000, 1234123412341234, '1234-1234-1234-1234', TRUNC(ADD_MONTHS(SYSDATE,12)), 123, NULL);
INSERT INTO payment_details VALUES (2, 4001, 2345234523452345, '2345-2345-2345-2345', TRUNC(ADD_MONTHS(SYSDATE,12)), 234, NULL);
INSERT INTO payment_details VALUES (3, 4002, 3456345634563456, '3456-3456-3456-3456', TRUNC(ADD_MONTHS(SYSDATE,12)), 345, NULL);
INSERT INTO payment_details VALUES (4, 4003, 4567456745674567, '4567-4567-4567-4567', TRUNC(ADD_MONTHS(SYSDATE,12)), 456, NULL);
INSERT INTO payment_details VALUES (5, 4004, 5678567856785678, '5678-5678-5678-5678', TRUNC(ADD_MONTHS(SYSDATE,12)), 567, NULL);
COMMIT;


ALTER SESSION SET nls_date_format='DD-MON-YYYY';
COLUMN card_no FORMAT 9999999999999999
set linesize 200
SELECT *
FROM   payment_details
ORDER BY id;

        ID CUSTOMER_ID           CARD_NO CARD_STRING         EXPIRY_DATE        SEC_CODE VALID_DATE
---------- ----------- ----------------- ------------------- ---------------- ---------- ----------------
         1        4000  1234123412341234 1234-1234-1234-1234 06-7月 -2017            123
         2        4001  2345234523452345 2345-2345-2345-2345 06-7月 -2017            234
         3        4002  3456345634563456 3456-3456-3456-3456 06-7月 -2017            345
         4        4003  4567456745674567 4567-4567-4567-4567 06-7月 -2017            456
         5        4004  5678567856785678 5678-5678-5678-5678 06-7月 -2017            567


testスキーマにpayment_detailsという表を作成し、データを挿入します。

BEGIN
    DBMS_REDACT.add_policy(
        object_schema => 'test',
        object_name   => 'payment_details',
        column_name   => 'card_no',
        policy_name   => 'redact_card_info',
        function_type => DBMS_REDACT.full,
        expression    => '1=1'
    );
END;
/


データが準備出来たので、redactionを体験してみます。
パッケージDBMS_REDACTのadd_policyプロシージャを実行し、置き換えのポリシーを作成します。
上記では、特定の列(card_no)全データ(expression    => '1=1')を型ごとに決められているデフォルト値に置き換える(function_type => DBMS_REDACT.full,)ポリシーを作成します。
number値の置き換えデフォルト値は「0(ゼロ)」です。

ALTER SESSION SET nls_date_format='DD-MON-YYYY';
COLUMN card_no FORMAT 9999999999999999
set linesize 200
SELECT *
FROM   payment_details
ORDER BY id;

        ID CUSTOMER_ID           CARD_NO CARD_STRING         EXPIRY_DATE        SEC_CODE VALID_DATE
---------- ----------- ----------------- ------------------- ---------------- ---------- ----------------
         1        4000                 0 1234-1234-1234-1234 06-7月 -2017            123
         2        4001                 0 2345-2345-2345-2345 06-7月 -2017            234
         3        4002                 0 3456-3456-3456-3456 06-7月 -2017            345
         4        4003                 0 4567-4567-4567-4567 06-7月 -2017            456
         5        4004                 0 5678-5678-5678-5678 06-7月 -2017            567


置き換え後、再度SQLを実行してみると・・・
card_no列が全て0になっていました。
しかし、データは実際には書き換えられていないことに注意してください。

前回、unpluggedしたpdbを今回はpluggedしてみます。

[oracle@DB01 templates]$ pwd
/u01/app/oracle/product/12.1.0/dbhome_1/assistants/dbca/templates
[oracle@DB01 templates]$ ls
Data_Warehouse.dbc   Seed_Database.dfb  example01.dfb     sampleschema.xml
General_Purpose.dbc  cdb1_PDB1.dfb      pdbseed.dfb
New_Database.dbt     cdb1_PDB1.xml      pdbseed.xml
Seed_Database.ctl    example.dmp        sampleschema.dfb


前回、保存したメタデータとデータファイルのRMANバックアップを利用します。

000035

切断時と同じように、dbcaを起動し、実行する動作として「プラガブルデータベースの管理」を選択します。

000036

pluggedの場合はプラガブルデータベースの作成を選択します。
次の画面でpdbを接続するcdbを選択してください。

000037

「pdbファイルを使用してプラガブルデータベースの作成」を選択して、先ほどのメタデータとデータファイルのRMANバックアップを指定します。

000039

作成するpdb名、配置先、管理者のパスワードを指定します。

000040

サマリーを確認し、pdbの作成を開始します。

000041

作成中・・・

000042

pdbの接続が完了しました。
やはり、0から作成するより断然早いようです。

[oracle@DB01 ~]$ sqlplus / as sysdba

SQL> show parameter instance_name

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
instance_name                        string      cdb2

SQL> show PDBS

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB1                           READ WRITE NO


ちゃんと、cdb2にpdb1が接続されています。

今回は作成したpdbをunpluged(切断)して、他のコンテナにpluged(接続)するマルチテナントらしいことをやってみます。

SQL> show parameter instance_name

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
instance_name                        string      cdb1
SQL> show PDBS

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB1                           READ WRITE NO


cdb1、cdb2という2つのコンテナがあって、cdb1にpdb1というプラガブルDBが存在している構成です。

000027

まずは、cdb1のpdb1を切断します。
dbcaを起動し、プラガブル・データベースの管理を選択します。

000028

プラガブルデータベースの切断を選択します。

000029

pdb1の存在するコンテナcdb1を選択し、管理者ユーザーとパスワードを入力します。

000031

プラガブルデータベースの選択で、pdb1が選択されていることを確認します。
また、プラガブルデータベースのファイルセットの生成を選択します。
指定の場所にpdb1のメタデータとデータのRMANバックアップが作成されます。

000032

サマリーを確認し、終了ボタンをクリックするとunplugedが開始します。

000033

unpluged中・・・データ量にもよりますが、結構短い時間です。

000034

unpluged完了!

SQL> show PDBS

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO

[oracle@DB01 templates]$ pwd
/u01/app/oracle/product/12.1.0/dbhome_1/assistants/dbca/templates
[oracle@DB01 templates]$ ls
Data_Warehouse.dbc   Seed_Database.dfb  example01.dfb     sampleschema.xml
General_Purpose.dbc  cdb1_PDB1.dfb      pdbseed.dfb
New_Database.dbt     cdb1_PDB1.xml      pdbseed.xml
Seed_Database.ctl    example.dmp        sampleschema.dfb

pdbは無くなり、メタデータとデータファイルのrmanバックアップが指定の場所に吐き出されました。

次回はそれをplugedしてみましょう。

dbcaを使ってpdbを新規に作成する方法を確認します。
今回は既存のcdbに新しくpdbを追加するイメージです。

000001

dbcaを起動し、プラガブル・データベースの管理を選択し、次へをクリックします。

000002

今回の場合、プラガブル・データベースの作成を選択します。

000003

pdbをどこのcdbに接続するのかを、選択します。
今回は1つしか作っていないので、1つしか表示されていません。

000004

「新規プラガブル・データベースの作成」を選択します。

000006

pdbの名前、場所、pdb用に新規に管理者ユーザーが必要な場合はここにユーザー名とパスワードを指定します。

000007

サマリーを確認し、終了ボタンをクリックすると、pdbの作成が開始します。

000009

作成が完了しました。

[oracle@DB01 ~]$ sqlplus admin/password@localhost/pdb4.test.local

SQL*Plus: Release 12.1.0.2.0 Production on 月 7月 4 00:44:16 2016

Copyright (c) 1982, 2014, Oracle.  All rights reserved.



Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics
and Real Application Testing options
に接続されました。
SQL> show con_name

CON_NAME
------------------------------
PDB4


新しく作成した管理者ユーザーで接続できるかを確認しています。



マルチテナント環境のデータベースには共通ユーザーと個別ユーザーの2種類があります。
共通ユーザーとは全てのPDBに対して共通して存在するユーザーのことです。
個別ユーザーとは特定のPDBに対して存在するユーザーのことです。

まずは共通ユーザーを作ってみます。

[oracle@DB01 ~]$ sqlplus / as sysdba

SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT


まずは、コンテナデータベースに接続します。

SQL> CREATE USER c##test_user1 IDENTIFIED BY password CONTAINER=ALL;

ユーザーが作成されました。

SQL> GRANT CREATE SESSION TO c##test_user1 CONTAINER=ALL;

権限付与が成功しました。


共通ユーザーを作成し、権限も付与しました。
共通ユーザーを作成する場合、ユーザー名に必ず「c##」を付けなければなりません。
なお、「CONTAINER=ALL」句は省略可能です。

SQL> column USERNAME format a30
SQL> SELECT username,common FROM cdb_users WHERE username='C##TEST_USER1';

USERNAME                       COM
------------------------------ ---
C##TEST_USER1                  YES


ユーザーが共通ユーザーかどうか、cdb_usersビューのcommon列がyesになっているかで判別できます。

[oracle@DB01 ~]$ sqlplus c##test_user1/password

SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT


共通ユーザーでコンテナDBに接続できることを確認しています。

続いて個別ユーザーを作成してみます。

[oracle@DB01 ~]$ sqlplus / as sysdba

SQL> ALTER SESSION SET CONTAINER = pdb1;

セッションが変更されました。

SQL> show CON_NAME

CON_NAME
------------------------------
PDB1


まずは、PDBに接続します。

SQL> CREATE USER test_user2 IDENTIFIED BY password CONTAINER=CURRENT;

ユーザーが作成されました。

SQL> GRANT CREATE SESSION TO test_user2 CONTAINER=CURRENT;

権限付与が成功しました。


個別ユーザーを作成します。
個別ユーザーの場合はユーザー名の先頭に何もつけなくても大丈夫です。

[oracle@DB01 ~]$ sqlplus test_user2/password@localhost/pdb1.test.local

SQL> show CON_NAME

CON_NAME
------------------------------
PDB1


個別ユーザーでPDBに接続できることを確認しています。

[oracle@DB01 ~]$ sqlplus test_user2/password@localhost/pdb2.test.local

SQL*Plus: Release 12.1.0.2.0 Production on 日 7月 3 00:59:36 2016

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

ERROR:
ORA-01017: ユーザー名/パスワードが無効です。ログオンは拒否されました。


対象外のPDBには接続できません。

このページのトップヘ