今回は、少し具体的なユースケースを用いてDeep Data Securityを試してみます。
最近ではSQLだけでなくLLMを利用したNL2SQL(自然言語)によるデータベースアクセスも増えてきていますので、その両方のパターンで実際にどのような動作するのかというのを試してみます。
テストシナリオですが、例えば、血液検査などの検査結果を格納しているデータベースがあったとします。そのデータにアクセスできる人を医師、スタッフ、医学生の3種類のロールを用意し、それぞれでアクセスできるデータの範囲をDeep Data Securityによって制御させます。
使用するデータ・モデルは、HEALTHCARE_WORKERS(医療従事者), PATIENTS(患者), EXAM_RESULTS(検査結果)という以下の3つの表です。
- HEALTHCARE_WORKERS表には、医師としてDOCTOR、医事課や受付といったSTAFF、実習生としてSTUDENTのロールを持った人がいる
- PATIENTS表の患者は、EXAM_RESULTS表の検査結果のレコードを複数持ち、HEALTHCARE_WORKERSのドクターに紐づく
HEALTHCARE_WORKERSの3つのロールは、以下のように定義したアクセス範囲でPATIENTSとEXAM_RESULTS表にアクセスすることが可能です。
- エンドユーザー: nsatoは、DOCTORなのですべての表に無制限でアクセス可能
- エンドユーザー: mtanakaは、STAFFなので患者表にはアクセスできるが、検査結果はアクセスできない
- エンドユーザー: myamamotoは、STUDENTなので担当する患者と検査結果のみアクセスできる
テストデータを生成するスクリプトはこちら。23.26.2以上のADBの場合は、スクリプト内の0.User Creationの部分で4つのユーザーのパスワードを変更し、adminでSQLを実行すれば、demoスキーマにテストデータや必要な権限等が一式で作成されます。
簡単に実行させるためローカル・エンド・ユーザーを使っていますが、OCI IAMのユーザーを使いたい場合は、この手順でIAMとの連携をし、CREATE DATA ROLEの部分をCREATE OR REPLACE DATA ROLE employee_role MAPPED TO 'IAM_OAUTH_GROUP=doctor_role'のようにそれぞれマッピングして、IAMにユーザーとグループを作成します。
SQLで実行
それぞれのエンドユーザーで表にアクセスし、Deep Data Securityの動作を確認する
DOCTOR: nsatoはすべての表に制限なくアクセス可能
$ sql nsato/xxxxxx@adb
SQL> select * from demo.healthcare_workers;
WORKER_ID USERNAME FIRSTNAME LASTNAME WORKER_NAME WORKER_ROLE DEPARTMENT EMAIL CREATED_AT
____________ _____________ ____________ ____________ ______________ ______________ _____________ ___________________________________ ______________________________
1 nsato naoto sato 佐藤 直人 DOCTOR 内科 sato.naoto@hospital.example 26-06-11 05:52:37.134709000
2 rsuzuki rina suzuki 鈴木 里奈 DOCTOR 糖尿病内科 suzuki.rina@hospital.example 26-06-11 05:52:37.158024000
3 mtanaka megumi tanaka 田中 恵 STAFF 医事課 tanaka.megumi@hospital.example 26-06-11 05:52:37.178567000
4 ykondo yuki kondo 近藤 由紀 STAFF 受付 kondo.yuki@hospital.example 26-06-11 05:52:37.200133000
5 myamamoto makoto yamamoto 山本 誠 STUDENT 医学部実習 yamamoto.makoto@hospital.example 26-06-11 05:52:37.222078000
6 ytakahashi yu takahashi 高橋 悠 STUDENT 医学部実習 takahashi.yu@hospital.example 26-06-11 05:52:37.244118000
6行が選択されました。
SQL> select * from demo.patients;
PATIENT_ID HEALTHCARE_WORKER_ID PATIENT_NAME SEX BIRTH_DATE PHONE PREFECTURE CREATED_AT
_____________ _______________________ _______________ ______ _____________ ________________ _____________ ______________________________
1 1 山田 太郎 M 82-04-12 090-1111-0001 東京都 26-06-11 05:52:37.285827000
2 1 田中 花子 F 78-09-03 090-1111-0002 神奈川県 26-06-11 05:52:37.308421000
3 2 佐々木 一郎 M 90-01-21 090-1111-0003 埼玉県 26-06-11 05:52:37.328984000
4 2 小林 美咲 F 69-11-30 090-1111-0004 千葉県 26-06-11 05:52:37.348817000
5 5 中村 健 M 88-06-18 090-1111-0005 東京都 26-06-11 05:52:37.367329000
6 6 渡辺 愛 F 95-02-14 090-1111-0006 大阪府 26-06-11 05:52:37.387711000
6行が選択されました。
SQL> select * from demo.exam_results;
EXAM_ID PATIENT_ID EXAM_DATE HEIGHT_CM WEIGHT_KG SYSTOLIC_BP DIASTOLIC_BP HBA1C LDL TRIGLYCERIDE FASTING_GLUCOSE SMOKING_STATUS NOTES BMI
__________ _____________ ____________ ____________ ____________ ______________ _______________ ________ ______ _______________ __________________ _________________ ___________________ _______
1 1 25-11-10 170 84 142 90 6.1 158 220 112 Former 前回よりやや悪化。 29.1
2 1 26-02-10 170 85.5 145 92 6.3 160 230 115 Former 生活習慣改善指導。 29.6
3 1 26-05-10 170 86.5 148 94 6.5 162 245 118 Former 腹囲増加。再検査推奨。 29.9
4 2 25-11-10 158 59 132 84 5.7 142 176 99 Never 軽度高値あり。 23.6
5 2 26-05-10 158 60 136 86 5.8 148 182 102 Never 経過観察。生活習慣改善指導。 24
6 3 25-11-12 176 69 124 80 5.5 108 101 94 Never 前回も概ね正常。 22.3
7 3 26-05-11 176 68 122 78 5.4 104 98 92 Never 異常所見なし。 22
8 4 25-11-12 155 63 130 82 6.8 168 198 138 Current 高血糖傾向。 26.2
9 4 26-02-12 155 63.5 131 83 7 169 205 142 Current 糖尿病精査推奨。 26.4
10 4 26-05-11 155 64 132 84 7.2 170 210 146 Current HbA1c高値。糖尿病精査推奨。 26.6
11 5 25-11-13 172 79 126 80 5.8 134 205 101 Former 中性脂肪高め。 26.7
12 5 26-05-12 172 81 128 82 5.9 138 230 105 Former 運動・食事指導対象。 27.4
13 6 25-11-14 160 54 118 76 5.3 96 88 90 Never 概ね正常。 21.1
14 6 26-05-13 160 55 120 78 5.4 100 92 92 Never 経過観察。 21.5
14行が選択されました。
STAFF: mtanakaは、自分の情報と患者表にはアクセス可。検査結果はアクセス不可
$ sql mtanaka/xxxxxx@adb
SQL> select * from demo.healthcare_workers;
WORKER_ID USERNAME FIRSTNAME LASTNAME WORKER_NAME WORKER_ROLE DEPARTMENT EMAIL CREATED_AT
____________ ___________ ____________ ___________ ______________ ______________ _____________ _________________________________ ______________________________
3 mtanaka megumi tanaka 田中 恵 STAFF 医事課 tanaka.megumi@hospital.example 26-06-11 05:52:37.178567000
SQL> select * from demo.patients;
PATIENT_ID HEALTHCARE_WORKER_ID PATIENT_NAME SEX BIRTH_DATE PHONE PREFECTURE CREATED_AT
_____________ _______________________ _______________ ______ _____________ ________________ _____________ ______________________________
1 1 山田 太郎 M 82-04-12 090-1111-0001 東京都 26-06-11 05:52:37.285827000
2 1 田中 花子 F 78-09-03 090-1111-0002 神奈川県 26-06-11 05:52:37.308421000
3 2 佐々木 一郎 M 90-01-21 090-1111-0003 埼玉県 26-06-11 05:52:37.328984000
4 2 小林 美咲 F 69-11-30 090-1111-0004 千葉県 26-06-11 05:52:37.348817000
5 5 中村 健 M 88-06-18 090-1111-0005 東京都 26-06-11 05:52:37.367329000
6 6 渡辺 愛 F 95-02-14 090-1111-0006 大阪府 26-06-11 05:52:37.387711000
6行が選択されました。
SQL> select * from demo.exam_results;
次のコマンド行の開始中にエラーが発生しました : 1 -
select * from admin.exam_results
コマンド行 : 1 列 : 21 でのエラー
エラー・レポート -
SQLエラー: ORA-00942: 表またはビュー "ADMIN"."EXAM_RESULTS"は存在しません
STUDENT: myamamotoは、自分の情報と担当患者と検査結果だけアクセス可
$ sql myamamoto/xxxxxx@adb
SQL> select * from demo.healthcare_workers;
WORKER_ID USERNAME FIRSTNAME LASTNAME WORKER_NAME WORKER_ROLE DEPARTMENT EMAIL CREATED_AT
____________ ____________ ____________ ___________ ______________ ______________ _____________ ___________________________________ ______________________________
5 myamamoto makoto yamamoto 山本 誠 STUDENT 医学部実習 yamamoto.makoto@hospital.example 26-06-11 05:52:37.222078000
SQL> select * from demo.patients;
PATIENT_ID HEALTHCARE_WORKER_ID PATIENT_NAME SEX BIRTH_DATE PHONE PREFECTURE CREATED_AT
_____________ _______________________ _______________ ______ _____________ ________________ _____________ ______________________________
5 5 中村 健 M 88-06-18 090-1111-0005 東京都 26-06-11 05:52:37.367329000
SQL> select * from demo.exam_results;
EXAM_ID PATIENT_ID EXAM_DATE HEIGHT_CM WEIGHT_KG SYSTOLIC_BP DIASTOLIC_BP HBA1C LDL TRIGLYCERIDE FASTING_GLUCOSE SMOKING_STATUS NOTES BMI
__________ _____________ ____________ ____________ ____________ ______________ _______________ ________ ______ _______________ __________________ _________________ _____________ _______
11 5 25-11-13 172 79 126 80 5.8 134 205 101 Former 中性脂肪高め。 26.7
12 5 26-05-12 172 81 128 82 5.9 138 230 105 Former 運動・食事指導対象。 27.4
NL2SQLで実行
本来であればADBのSelect AIで実行したいのですが、Select AIのNL2SQLは、実行に必要なメタデータの読み込みがDeep Data Security内で許可されないため正しく動作しません。(※2026年7月頃対応予定)。 なのでここではOracle SQLcl MCP Serverを使います。下記実行している環境は、VSCode + Codex + SQLcl MCP Serverで実行していますが、ご自身の利用可能なSQLcl MCP Serverで実行してみて下さい。
また、SQLcl MCP Serverが接続するエンドユーザーは、通常のデータ・ディクショナリでオブジェクト情報を得られないので、LLMに表定義(DDL)などを指示書として事前に教えてあげるとスムーズにNL2SQLが実行できるかと思います。
DOCTOR: nsatoでのNL2SQLによる問い合わせ
最近の検査結果から、生活習慣病の疑いがある患者を一覧で出して -> すべての患者を対象に実行

最新の検査結果を使って、糖尿病疑いが強い患者を抽出して -> すべての患者を対象に実行

医師ごとに生活習慣病の疑いがある患者数を集計して -> すべてのドクターを対象に実行

STAFF: mtanakaでの実行結果
最近の検査結果から、生活習慣病の疑いがある患者を一覧で出して -> 検査結果にアクセスできないのでエラー

STUDENT: myamamotoでの実行
最近の検査結果から、生活習慣病の疑いがある患者を一覧で出して -> 担当患者1名から検索

最新の検査結果を使って、糖尿病疑いが強い患者を抽出して -> 担当患者1名から検索

医師ごとに生活習慣病の疑いがある患者数を集計して > 自分自身だけで検索

以上です。NL2SQLでもDeep Data Securityによるアクセス制御が効いていることが分かります。ADBのSelect AIが対応した際にその手順を追加する予定です。

