0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ADBで実現するセキュアなAI Lakehouse - Iceberg × Select AI × Deep Data Security

0
Last updated at Posted at 2026-08-21

Autonomous AI Database(ADB)は、Apache Icebergなどで管理されたデータレイク上の大規模データを、外部表としてリンクし、SQLから直接参照できます。実データはクラウド・ストレージ上のIceberg側に保持したまま、ADB内の通常表と組み合わせて分析することもできます。

今回は、この構成に SELECT AI と Deep Data Security を組み合わせ、自然言語による分析とエンドユーザーごとのアクセス制御を実現する「セキュアなAI Lakehouse」を試してみます。

実際の構成案は、以下のイメージです。
東京と大阪に工場があり、各工場ではさまざまな機器が稼働しています。それぞれの機器から出力されるセンサーデータは、Apache Icebergで管理され、クラウド・ストレージ上に日々蓄積されています。
今回は、ADBからIcebergのデータを外部表として参照し、ADB内に保持する設備マスタ表と組み合わせて、SELECT AIによる自然言語でのデータ分析基盤を実現します。さらにDeep Data Securityを利用し、ユーザーの情報に応じて、参照できる工場のデータを自動的に制限します。

image.png

本内容は、実施に必要な全体の流れがわかるように記述していますが、ステップ・バイ・ステップ形式の完全なチュートリアルではない点をご了承下さい。

Apache Icebergにセンサーデータを準備

東京(TOKYO)と大阪(OSAKA)の2つの工場を想定し、それぞれの工場で稼働する設備(M001、M002、M101、M102)から収集したIoTセンサーデータを、Apache IcebergテーブルとしてOCI Object Storage上に作成する。

センサーデータは、下記のように工場・製造ライン・設備を識別する情報に加えて、温度、振動、消費電力、設備の状態、エラーコードなどを含める。

spark-sql (default)> SELECT * FROM dev.factory.iot_sensor_events ORDER BY event_time;

EVENT_ID  EVENT_TIME           FACTORY  LINE  MACHINE  TEMP(°C)  VIB(mm/s)  POWER(kW)  STATUS    ERROR
--------  -------------------  -------  ----  -------  --------  ---------  ---------  --------  ------
E00001    2026-08-20 08:00:00  TOKYO    L01   M001        71.2        1.8       12.4   NORMAL    -
E00002    2026-08-20 08:05:00  TOKYO    L01   M001        78.5        4.1       13.2   WARNING   VIB-01
E00003    2026-08-20 08:10:00  TOKYO    L01   M001        83.7        6.4       14.8   CRITICAL  VIB-03
E00004    2026-08-20 08:15:00  TOKYO    L02   M002        68.3        2.1       10.2   NORMAL    -
E00005    2026-08-20 08:20:00  TOKYO    L02   M002        91.3        7.5       18.9   CRITICAL  TMP-01
E00006    2026-08-20 08:25:00  TOKYO    L02   M002        88.7        6.8       19.4   CRITICAL  TMP-01
E00007    2026-08-20 08:30:00  OSAKA    L03   M101        68.4        1.4       11.0   NORMAL    -
E00008    2026-08-20 08:35:00  OSAKA    L03   M101        76.1        3.8       12.7   WARNING   TMP-02
E00009    2026-08-20 08:40:00  OSAKA    L03   M101        82.5        5.6       15.3   CRITICAL  VIB-02
E00010    2026-08-20 08:45:00  OSAKA    L04   M102        65.8        1.1        9.8   NORMAL    -
E00011    2026-08-20 08:50:00  OSAKA    L04   M102        69.2        1.6       10.1   NORMAL    -
E00012    2026-08-20 08:55:00  OSAKA    L04   M102        79.8        4.9       13.7   WARNING   TMP-02
Object StorageのIcebergのディレクトリ構造
oci://iceberg-demo@ネームスペース/iot/
└── factory/
    └── iot_sensor_events/
        ├── data/
        │   ├── *.parquet
        │   └── ...
        └── metadata/
            ├── *.json
            ├── *.avro
            ├── snap-*.avro
            └── version-hint.text

ADBからセンサーデータにアクセスする外部表を作成

DBMS_CLOUD.CREATE_EXTERNAL_TABLE を使用して、Object Storage上のIcebergテーブルを参照する外部表 (IOT_SENSOR_EVENTS) をADBに作成。ここではHadoop Catalog方式を使用するため、iceberg_catalog_typeにhadoopを指定する。
iceberg_warehouseにはIcebergテーブルを格納しているObject Storage上のWarehouseのパスを、iceberg_table_path には対象となるIcebergテーブルを指定する。

-- Icebergの外部表 (IOT_SENSOR_EVENTS)の作成
BEGIN
  DBMS_CLOUD.CREATE_EXTERNAL_TABLE(
    table_name       => 'IOT_SENSOR_EVENTS',
    credential_name  => 'OCI_CRED',
    file_uri_list    => NULL,
    format           => '{
      "access_protocol": {
        "protocol_type": "iceberg",
        "protocol_config": {
          "iceberg_catalog_type": "hadoop",
          "iceberg_warehouse": "https://objectstorage.ap-tokyo-1.oraclecloud.com/n/xxxxxx/b/iceberg-demo/o/iot",
          "iceberg_table_path": "factory.iot_sensor_events"
        }
      }
    }'
  );
END;

--作成後、SELECTできればOK
SQL> select * from IOT_SENSOR_EVENTS;

EVENT_ID    EVENT_TIME                         FACTORY_ID    LINE_ID    MACHINE_ID    TEMPERATURE_C    VIBRATION_MM_S    POWER_KW    STATUS      ERROR_CODE    EVENT_DATE
___________ __________________________________ _____________ __________ _____________ ________________ _________________ ___________ ___________ _____________ _____________
E00001      26-08-20 08:00:00.000000000 UTC    TOKYO         L01        M001          71.2             1.8               12.4        NORMAL                    26-08-20
E00002      26-08-20 08:05:00.000000000 UTC    TOKYO         L01        M001          78.5             4.1               13.2        WARNING     VIB-01        26-08-20
E00003      26-08-20 08:10:00.000000000 UTC    TOKYO         L01        M001          83.7             6.4               14.8        CRITICAL    VIB-03        26-08-20
E00004      26-08-20 08:15:00.000000000 UTC    TOKYO         L02        M002          68.3             2.1               10.2        NORMAL                    26-08-20
E00005      26-08-20 08:20:00.000000000 UTC    TOKYO         L02        M002          91.3             7.5               18.9        CRITICAL    TMP-01        26-08-20
E00006      26-08-20 08:25:00.000000000 UTC    TOKYO         L02        M002          88.7             6.8               19.4        CRITICAL    TMP-01        26-08-20
E00007      26-08-20 08:30:00.000000000 UTC    OSAKA         L03        M101          68.4             1.4               11.0        NORMAL                    26-08-20
E00008      26-08-20 08:35:00.000000000 UTC    OSAKA         L03        M101          76.1             3.8               12.7        WARNING     TMP-02        26-08-20
E00009      26-08-20 08:40:00.000000000 UTC    OSAKA         L03        M101          82.5             5.6               15.3        CRITICAL    VIB-02        26-08-20
E00010      26-08-20 08:45:00.000000000 UTC    OSAKA         L04        M102          65.8             1.1               9.8         NORMAL                    26-08-20
E00011      26-08-20 08:50:00.000000000 UTC    OSAKA         L04        M102          69.2             1.6               10.1        NORMAL                    26-08-20
E00012      26-08-20 08:55:00.000000000 UTC    OSAKA         L04        M102          79.8             4.9               13.7        WARNING     TMP-02        26-08-20

ADBに設備マスタ表を作成

ADBには、設備の詳細情報となる設備マスタ表 (EQUIPMENT_MASTER) を作成する。さらに、作成したIcebergの外部表 (IOT_SENSOR_EVENTS) とMACHINE_IDで結合し、センサーデータと設備情報を統合して参照できるビュー (V_IOT_EQUIPMENT) を作成する。
※ビューを作成している理由は、後ほどSELECT AIによるNL2SQLの精度を高めるため。Icebergの外部表には、SELECT AIで利用する表・列のコメントやアノテーションを直接追加できないので、ビューに付与し、各データの意味をAIが理解しやすいように整える

--EQUIPMENT_MASTER(設備マスタ表)の作成
CREATE TABLE EQUIPMENT_MASTER (
    MACHINE_ID       VARCHAR2(30)  PRIMARY KEY,
    MACHINE_NAME     VARCHAR2(100) NOT NULL,
    FACTORY_ID       VARCHAR2(30)  NOT NULL,
    LINE_ID          VARCHAR2(30)  NOT NULL,
    MACHINE_TYPE     VARCHAR2(30),
    MODEL            VARCHAR2(50),
    INSTALLED_DATE   DATE,
    OWNER_TEAM       VARCHAR2(50),
    CRITICALITY      VARCHAR2(20)
);

INSERT INTO EQUIPMENT_MASTER (MACHINE_ID, MACHINE_NAME, FACTORY_ID, LINE_ID, MACHINE_TYPE, MODEL, INSTALLED_DATE, OWNER_TEAM, CRITICALITY) VALUES ('M001', 'Press-01', 'TOKYO', 'L01', 'PRESS', 'P-2000', DATE '2023-04-01', 'TEAM_A', 'HIGH');
INSERT INTO EQUIPMENT_MASTER VALUES ('M002', 'Robot-02', 'TOKYO', 'L02', 'ROBOT', 'R-500', DATE '2022-09-01', 'TEAM_A', 'HIGH');
INSERT INTO EQUIPMENT_MASTER VALUES ('M101', 'Press-01', 'OSAKA', 'L03', 'PRESS', 'P-1800', DATE '2024-01-15', 'TEAM_B', 'MEDIUM');
INSERT INTO EQUIPMENT_MASTER VALUES ('M102', 'Robot-02', 'OSAKA', 'L04', 'ROBOT', 'R-300', DATE '2024-06-01', 'TEAM_B', 'LOW');
COMMIT;

-- 表の確認
SQL> select * from EQUIPMENT_MASTER;
MACHINE_ID    MACHINE_NAME    FACTORY_ID    LINE_ID    MACHINE_TYPE    MODEL     INSTALLED_DATE    OWNER_TEAM    CRITICALITY
_____________ _______________ _____________ __________ _______________ _________ _________________ _____________ ______________
M001          Press-01        TOKYO         L01        PRESS           P-2000    23-04-01          TEAM_A        HIGH
M002          Robot-02        TOKYO         L02        ROBOT           R-500     22-09-01          TEAM_A        HIGH
M101          Press-01        OSAKA         L03        PRESS           P-1800    24-01-15          TEAM_B        MEDIUM
M102          Robot-02        OSAKA         L04        ROBOT           R-300     24-06-01          TEAM_B        LOW

-- IOT_SENSOR_EVENTS(Iceberg表)とEQUIPMENT_MASTER(実表)をJoinしたビュー(V_IOT_EQUIPMENT)を作成
CREATE OR REPLACE VIEW V_IOT_EQUIPMENT AS
SELECT
    e.event_id,
    e.event_time,
    e.factory_id,
    e.line_id,
    e.machine_id,
    m.machine_name,
    m.machine_type,
    m.model,
    m.owner_team,
    m.criticality,
    e.temperature_c,
    e.vibration_mm_s,
    e.power_kw,
    e.status,
    e.error_code
FROM admin.IOT_SENSOR_EVENTS e
JOIN admin.EQUIPMENT_MASTER m
  ON e.machine_id = m.machine_id;

-- ビューの確認
SQL> select * from V_IOT_EQUIPMENT;

EVENT_ID    EVENT_TIME                         FACTORY_ID    LINE_ID    MACHINE_ID    MACHINE_NAME    MACHINE_TYPE    MODEL     OWNER_TEAM    CRITICALITY    TEMPERATURE_C    VIBRATION_MM_S    POWER_KW    STATUS      ERROR_CODE
___________ __________________________________ _____________ __________ _____________ _______________ _______________ _________ _____________ ______________ ________________ _________________ ___________ ___________ _____________
E00001      26-08-20 08:00:00.000000000 UTC    TOKYO         L01        M001          Press-01        PRESS           P-2000    TEAM_A        HIGH           71.2             1.8               12.4        NORMAL
E00002      26-08-20 08:05:00.000000000 UTC    TOKYO         L01        M001          Press-01        PRESS           P-2000    TEAM_A        HIGH           78.5             4.1               13.2        WARNING     VIB-01
E00003      26-08-20 08:10:00.000000000 UTC    TOKYO         L01        M001          Press-01        PRESS           P-2000    TEAM_A        HIGH           83.7             6.4               14.8        CRITICAL    VIB-03
E00004      26-08-20 08:15:00.000000000 UTC    TOKYO         L02        M002          Robot-02        ROBOT           R-500     TEAM_A        HIGH           68.3             2.1               10.2        NORMAL
E00005      26-08-20 08:20:00.000000000 UTC    TOKYO         L02        M002          Robot-02        ROBOT           R-500     TEAM_A        HIGH           91.3             7.5               18.9        CRITICAL    TMP-01
E00006      26-08-20 08:25:00.000000000 UTC    TOKYO         L02        M002          Robot-02        ROBOT           R-500     TEAM_A        HIGH           88.7             6.8               19.4        CRITICAL    TMP-01
E00007      26-08-20 08:30:00.000000000 UTC    OSAKA         L03        M101          Press-01        PRESS           P-1800    TEAM_B        MEDIUM         68.4             1.4               11.0        NORMAL
E00008      26-08-20 08:35:00.000000000 UTC    OSAKA         L03        M101          Press-01        PRESS           P-1800    TEAM_B        MEDIUM         76.1             3.8               12.7        WARNING     TMP-02
E00009      26-08-20 08:40:00.000000000 UTC    OSAKA         L03        M101          Press-01        PRESS           P-1800    TEAM_B        MEDIUM         82.5             5.6               15.3        CRITICAL    VIB-02
E00010      26-08-20 08:45:00.000000000 UTC    OSAKA         L04        M102          Robot-02        ROBOT           R-300     TEAM_B        LOW            65.8             1.1               9.8         NORMAL
E00011      26-08-20 08:50:00.000000000 UTC    OSAKA         L04        M102          Robot-02        ROBOT           R-300     TEAM_B        LOW            69.2             1.6               10.1        NORMAL
E00012      26-08-20 08:55:00.000000000 UTC    OSAKA         L04        M102          Robot-02        ROBOT           R-300     TEAM_B        LOW            79.8             4.9               13.7        WARNING     TMP-02

12行が選択されました。

まずここまでで、必要なデータが揃ったので、次にDeep Data Securityによるアクセス制御の設定をしていきます。

Deep Data Securityのための設定

ローカル・エンドユーザーとデータロールの作成

--ローカル・エンドユーザーは二つ。op_tanaka, op_suzuki
CREATE END USER op_tanaka IDENTIFIED BY password;
CREATE END USER op_suzuki IDENTIFIED BY password;

--データロールを作成し、ローカル・エンドユーザーに付与
CREATE DATA ROLE IOT_OPERATOR_ROLE;
GRANT DATA ROLE IOT_OPERATOR_ROLE TO op_tanaka;
GRANT DATA ROLE IOT_OPERATOR_ROLE TO op_suzuki;

--データロールに最低限必要なDB権限をロール経由で付与
CREATE ROLE db_role;
GRANT CREATE SESSION TO db_role;
GRANT READ ON DIRECTORY DATA_PUMP_DIR TO db_role;
grant db_role to IOT_OPERATOR_ROLE;

エンドユーザー・コンテキストの実装

ログインしたエンドユーザーに応じて、工場を識別するためのエンドユーザー・コンテキストという値を保持させるようにする。それぞれのユーザーは、コンテキストが最初に参照されたタイミングでfactory_idという変数に以下の値が自動設定される

OP_TANAKA  → factory_id = TOKYO
OP_SUZUKI  → factory_id = OSAKA

また、コンテキストを参照・更新するために必要な権限をData GrantおよびDatabase Role経由で付与する。このfactory_idをData Grantの条件として利用することで、ログインユーザーごとに参照可能な工場のデータを制御させる。

CREATE OR REPLACE PACKAGE ADMIN.IOT_CONTEXT_HANDLER AS
  PROCEDURE INIT_USER_CONTEXT;
END;
/
--単純にユーザー名で値をセットする
CREATE OR REPLACE PACKAGE BODY ADMIN.IOT_CONTEXT_HANDLER AS
  PROCEDURE INIT_USER_CONTEXT IS
    sql_stmt VARCHAR2(4000);
  BEGIN
    sql_stmt := '
      UPDATE END_USER_CONTEXT t
         SET t.CONTEXT.factory_id =
           CASE UPPER(ORA_END_USER_CONTEXT.username)
             WHEN ''OP_TANAKA'' THEN ''TOKYO''
             WHEN ''OP_SUZUKI'' THEN ''OSAKA''
           END
       WHERE owner = ''ADMIN''
         AND name  = ''IOT_CONTEXT''
    ';
    EXECUTE IMMEDIATE sql_stmt;
  END;
END;
/

--コンテキストの実体
CREATE OR REPLACE END USER CONTEXT ADMIN.IOT_CONTEXT
USING JSON SCHEMA '{
  "type":"object",
  "properties":{
    "factory_id":{
      "type":"string",
      "o:onFirstRead":"ADMIN.IOT_CONTEXT_HANDLER.INIT_USER_CONTEXT"
    }
  }
}';
/

--コンテキストは実ユーザが保有し、それをアクセスできる権限をデータロールに付与する
CREATE ROLE IOT_CONTEXT_ADMIN;
GRANT EXECUTE ON ADMIN.IOT_CONTEXT_HANDLER TO IOT_CONTEXT_ADMIN;
GRANT IOT_CONTEXT_ADMIN TO IOT_OPERATOR_ROLE, IOT_MANAGER_ROLE;

CREATE OR REPLACE DATA GRANT IOT_CONTEXT_READ_GRANT
  AS SELECT
  ON SYS.END_USER_CONTEXT
  WHERE owner = 'ADMIN'
    AND name  = 'IOT_CONTEXT'
  TO IOT_OPERATOR_ROLE, IOT_MANAGER_ROLE;

CREATE OR REPLACE DATA GRANT IOT_CONTEXT_UPDATE_GRANT
  AS UPDATE
  ON SYS.END_USER_CONTEXT
  WHERE owner = 'ADMIN'
    AND name  = 'IOT_CONTEXT'
  TO IOT_OPERATOR_ROLE, IOT_MANAGER_ROLE;

データ権限の設定

EQUIPMENT_MASTER(設備マスタ表)にSELECTする際には、エンドユーザー・コンテキストに設定された工場(TOKYO / OSAKA)が条件として適用される。
さらに、IOT_SENSOR_EVENTS(センサーデータ)とV_IOT_EQUIPMENT(設備マスタとセンサーデータの結合ビュー)には、23.26.3で追加されたCross-Table Data Grantを使用する。これにより、親表であるEQUIPMENT_MASTERに対するアクセス制御を、関連する子表・ビューにもそのまま継承させることができる。その結果、ユーザーは自身に許可された工場の設備に紐づくセンサーデータだけを参照できる。

--EQUIPMENT_MASTER(設備マスタ表)用のデータ権限
CREATE OR REPLACE DATA GRANT IOT_EQUIPMENT_ACCESS
AS SELECT
ON ADMIN.EQUIPMENT_MASTER
WHERE FACTORY_ID = ORA_END_USER_CONTEXT.ADMIN.IOT_CONTEXT.factory_id
TO IOT_OPERATOR_ROLE;

--IOT_SENSOR_EVENTS(センサーデータ)用のデータ権限
CREATE OR REPLACE DATA GRANT IOT_SENSOR_ACCESS
AS SELECT
ON ADMIN.IOT_SENSOR_EVENTS
WHEN SELECT GRANTED ON ADMIN.EQUIPMENT_MASTER
WHERE ADMIN.IOT_SENSOR_EVENTS.MACHINE_ID =
      ADMIN.EQUIPMENT_MASTER.MACHINE_ID;

--V_IOT_EQUIPMENT(設備マスタとセンサーデータの結合ビュー)用のデータ権限
CREATE OR REPLACE DATA GRANT IOT_VIEW_ACCESS
AS SELECT
ON ADMIN.V_IOT_EQUIPMENT
WHEN SELECT GRANTED ON ADMIN.EQUIPMENT_MASTER
WHERE ADMIN.V_IOT_EQUIPMENT.MACHINE_ID =
      ADMIN.EQUIPMENT_MASTER.MACHINE_ID;

Deep Data Securityの動作確認

それぞれのローカルエンド・ユーザーでIcebergの外部表、実表/ビューそれぞれを検索時に、Deep Data Securityによってアクセス制御されていることを確認

--op_takakaで実行
sql op_tanaka/xxxxxx@サービス名

--エンドユーザー・コンテキストの値を確認。op_takakaはTOKYO
SQL> SELECT ORA_END_USER_CONTEXT.ADMIN.IOT_CONTEXT.factory_id from dual;

IOT_CONTEXT
______________
"TOKYO"

--外部表のIOT_SENSOR_EVENTS(センサーデータ)。TOKYOのレコードのみ
SQL> select * from admin.IOT_SENSOR_EVENTS;

EVENT_ID    EVENT_TIME                         FACTORY_ID    LINE_ID    MACHINE_ID    TEMPERATURE_C    VIBRATION_MM_S    POWER_KW    STATUS      ERROR_CODE    EVENT_DATE
___________ __________________________________ _____________ __________ _____________ ________________ _________________ ___________ ___________ _____________ _____________
E00001      26-08-20 08:00:00.000000000 UTC    TOKYO         L01        M001          71.2             1.8               12.4        NORMAL                    26-08-20
E00002      26-08-20 08:05:00.000000000 UTC    TOKYO         L01        M001          78.5             4.1               13.2        WARNING     VIB-01        26-08-20
E00003      26-08-20 08:10:00.000000000 UTC    TOKYO         L01        M001          83.7             6.4               14.8        CRITICAL    VIB-03        26-08-20
E00004      26-08-20 08:15:00.000000000 UTC    TOKYO         L02        M002          68.3             2.1               10.2        NORMAL                    26-08-20
E00005      26-08-20 08:20:00.000000000 UTC    TOKYO         L02        M002          91.3             7.5               18.9        CRITICAL    TMP-01        26-08-20
E00006      26-08-20 08:25:00.000000000 UTC    TOKYO         L02        M002          88.7             6.8               19.4        CRITICAL    TMP-01        26-08-20

--実表のEQUIPMENT_MASTER(設備マスタ表)。TOKYOのレコードのみ
SQL> select * from ADMIN.EQUIPMENT_MASTER;

MACHINE_ID    MACHINE_NAME    FACTORY_ID    LINE_ID    MACHINE_TYPE    MODEL     INSTALLED_DATE    OWNER_TEAM    CRITICALITY
_____________ _______________ _____________ __________ _______________ _________ _________________ _____________ ______________
M001          Press-01        TOKYO         L01        PRESS           P-2000    23-04-01          TEAM_A        HIGH   
M002          Robot-02        TOKYO         L02        ROBOT           R-500     22-09-01          TEAM_A        HIGH   

--ビューのV_IOT_EQUIPMENT。TOKYOのレコードのみ
SQL> select * from ADMIN.V_IOT_EQUIPMENT;

EVENT_ID    EVENT_TIME                         FACTORY_ID    LINE_ID    MACHINE_ID    MACHINE_NAME    MACHINE_TYPE    MODEL     OWNER_TEAM    CRITICALITY    TEMPERATURE_C    VIBRATION_MM_S    POWER_KW    STATUS      ERROR_CODE
___________ __________________________________ _____________ __________ _____________ _______________ _______________ _________ _____________ ______________ ________________ _________________ ___________ ___________ _____________
E00001      26-08-20 08:00:00.000000000 UTC    TOKYO         L01        M001          Press-01        PRESS           P-2000    TEAM_A        HIGH           71.2             1.8               12.4        NORMAL
E00002      26-08-20 08:05:00.000000000 UTC    TOKYO         L01        M001          Press-01        PRESS           P-2000    TEAM_A        HIGH           78.5             4.1               13.2        WARNING     VIB-01
E00003      26-08-20 08:10:00.000000000 UTC    TOKYO         L01        M001          Press-01        PRESS           P-2000    TEAM_A        HIGH           83.7             6.4               14.8        CRITICAL    VIB-03
E00004      26-08-20 08:15:00.000000000 UTC    TOKYO         L02        M002          Robot-02        ROBOT           R-500     TEAM_A        HIGH           68.3             2.1               10.2        NORMAL
E00005      26-08-20 08:20:00.000000000 UTC    TOKYO         L02        M002          Robot-02        ROBOT           R-500     TEAM_A        HIGH           91.3             7.5               18.9        CRITICAL    TMP-01
E00006      26-08-20 08:25:00.000000000 UTC    TOKYO         L02        M002          Robot-02        ROBOT           R-500     TEAM_A        HIGH           88.7             6.8               19.4        CRITICAL    TMP-01


--op_suzukiで実行
sql op_suzuki/xxxxxx@サービス名

--エンドユーザー・コンテキストの値を確認
SQL> SELECT ORA_END_USER_CONTEXT.ADMIN.IOT_CONTEXT.factory_id from dual;

IOT_CONTEXT
______________
"OSAKA"

--外部表のIOT_SENSOR_EVENTS(センサーデータ)。OSAKAのレコードのみ
SQL> select * from admin.IOT_SENSOR_EVENTS;

EVENT_ID    EVENT_TIME                         FACTORY_ID    LINE_ID    MACHINE_ID    TEMPERATURE_C    VIBRATION_MM_S    POWER_KW    STATUS      ERROR_CODE    EVENT_DATE
___________ __________________________________ _____________ __________ _____________ ________________ _________________ ___________ ___________ _____________ _____________
E00007      26-08-20 08:30:00.000000000 UTC    OSAKA         L03        M101          68.4             1.4               11.0        NORMAL                    26-08-20
E00008      26-08-20 08:35:00.000000000 UTC    OSAKA         L03        M101          76.1             3.8               12.7        WARNING     TMP-02        26-08-20
E00009      26-08-20 08:40:00.000000000 UTC    OSAKA         L03        M101          82.5             5.6               15.3        CRITICAL    VIB-02        26-08-20
E00010      26-08-20 08:45:00.000000000 UTC    OSAKA         L04        M102          65.8             1.1               9.8         NORMAL                    26-08-20
E00011      26-08-20 08:50:00.000000000 UTC    OSAKA         L04        M102          69.2             1.6               10.1        NORMAL                    26-08-20
E00012      26-08-20 08:55:00.000000000 UTC    OSAKA         L04        M102          79.8             4.9               13.7        WARNING     TMP-02        26-08-20

--実表のEQUIPMENT_MASTER(設備マスタ表)。OSAKAのレコードのみ
SQL> select * from ADMIN.EQUIPMENT_MASTER;

MACHINE_ID    MACHINE_NAME    FACTORY_ID    LINE_ID    MACHINE_TYPE    MODEL     INSTALLED_DATE    OWNER_TEAM    CRITICALITY
_____________ _______________ _____________ __________ _______________ _________ _________________ _____________ ______________
M101          Press-01        OSAKA         L03        PRESS           P-1800    24-01-15          TEAM_B        MEDIUM 
M102          Robot-02        OSAKA         L04        ROBOT           R-300     24-06-01          TEAM_B        LOW   

--ビューのV_IOT_EQUIPMENT。TOKYOのレコードのみ
SQL> select * from ADMIN.V_IOT_EQUIPMENT;

EVENT_ID    EVENT_TIME                         FACTORY_ID    LINE_ID    MACHINE_ID    MACHINE_NAME    MACHINE_TYPE    MODEL     OWNER_TEAM    CRITICALITY    TEMPERATURE_C    VIBRATION_MM_S    POWER_KW    STATUS      ERROR_CODE
___________ __________________________________ _____________ __________ _____________ _______________ _______________ _________ _____________ ______________ ________________ _________________ ___________ ___________ _____________
E00007      26-08-20 08:30:00.000000000 UTC    OSAKA         L03        M101          Press-01        PRESS           P-1800    TEAM_B        MEDIUM         68.4             1.4               11.0        NORMAL
E00008      26-08-20 08:35:00.000000000 UTC    OSAKA         L03        M101          Press-01        PRESS           P-1800    TEAM_B        MEDIUM         76.1             3.8               12.7        WARNING     TMP-02
E00009      26-08-20 08:40:00.000000000 UTC    OSAKA         L03        M101          Press-01        PRESS           P-1800    TEAM_B        MEDIUM         82.5             5.6               15.3        CRITICAL    VIB-02
E00010      26-08-20 08:45:00.000000000 UTC    OSAKA         L04        M102          Robot-02        ROBOT           R-300     TEAM_B        LOW            65.8             1.1               9.8         NORMAL
E00011      26-08-20 08:50:00.000000000 UTC    OSAKA         L04        M102          Robot-02        ROBOT           R-300     TEAM_B        LOW            69.2             1.6               10.1        NORMAL
E00012      26-08-20 08:55:00.000000000 UTC    OSAKA         L04        M102          Robot-02        ROBOT           R-300     TEAM_B        LOW            79.8             4.9               13.7        WARNING     TMP-02

このようにそれぞれのエンドユーザーは、エンドユーザー・コンテキストの値によってアクセスできる行を制限されていることがわかります。次にSelect AIによる問い合わせも試してみます。

Select AIによる自然言語の問い合わせ

Select AIの回答精度を向上させるために、V_IOT_EQUIPMENTビューに対して、コメントとアノテーションを定義する

COMMENT ON TABLE ADMIN.V_IOT_EQUIPMENT IS 'スマートファクトリーの設備監視データ。設備マスタ情報とIcebergデータレイクに蓄積されたIoTセンサーイベントを統合したビュー。設備の稼働状態、異常、温度、振動、消費電力、工場、製造ラインの分析に使用する。';

COMMENT ON COLUMN ADMIN.V_IOT_EQUIPMENT.EVENT_ID IS 'IoTセンサーイベントを一意に識別するID。';
COMMENT ON COLUMN ADMIN.V_IOT_EQUIPMENT.EVENT_TIME IS 'IoTセンサーイベントが発生した日時。';
COMMENT ON COLUMN ADMIN.V_IOT_EQUIPMENT.FACTORY_ID IS '設備が設置されている工場。TOKYOまたはOSAKA。';
COMMENT ON COLUMN ADMIN.V_IOT_EQUIPMENT.LINE_ID IS '工場内の製造ライン。L01、L02、L03、L04など。';
COMMENT ON COLUMN ADMIN.V_IOT_EQUIPMENT.MACHINE_ID IS '設備を一意に識別する設備ID。';
COMMENT ON COLUMN ADMIN.V_IOT_EQUIPMENT.MACHINE_NAME IS '設備の名称。';
COMMENT ON COLUMN ADMIN.V_IOT_EQUIPMENT.MACHINE_TYPE IS '設備の種類。PRESSやROBOTなど。';
COMMENT ON COLUMN ADMIN.V_IOT_EQUIPMENT.MODEL IS '設備のモデル・型式。';
COMMENT ON COLUMN ADMIN.V_IOT_EQUIPMENT.OWNER_TEAM IS '設備を管理・担当するチーム。';
COMMENT ON COLUMN ADMIN.V_IOT_EQUIPMENT.CRITICALITY IS '設備の業務上の重要度。HIGH、MEDIUM、LOW。';
COMMENT ON COLUMN ADMIN.V_IOT_EQUIPMENT.TEMPERATURE_C IS '設備の温度。単位は摂氏(℃)。';
COMMENT ON COLUMN ADMIN.V_IOT_EQUIPMENT.VIBRATION_MM_S IS '設備の振動レベル。単位はmm/s。';
COMMENT ON COLUMN ADMIN.V_IOT_EQUIPMENT.POWER_KW IS '設備の消費電力。単位はkW。';
COMMENT ON COLUMN ADMIN.V_IOT_EQUIPMENT.STATUS IS '設備イベントの状態。NORMALは正常、WARNINGは警告、CRITICALは重大な異常を示す。';
COMMENT ON COLUMN ADMIN.V_IOT_EQUIPMENT.ERROR_CODE IS '設備またはセンサーで発生したエラーコード。';


ALTER VIEW ADMIN.V_IOT_EQUIPMENT MODIFY
(
  MACHINE_ID ANNOTATIONS (
    display '設備ID'
  ),
  FACTORY_ID ANNOTATIONS (
    display '工場'
  ),
  LINE_ID ANNOTATIONS (
    display '製造ライン'
  ),
  MACHINE_NAME ANNOTATIONS (
    display '設備名'
  ),
  MACHINE_TYPE ANNOTATIONS (
    display '設備種別'
  ),
  TEMPERATURE_C ANNOTATIONS (
    display '設備温度',
    unit '摂氏'
  ),
  VIBRATION_MM_S ANNOTATIONS (
    display '振動レベル',
    unit 'mm/s'
  ),
  POWER_KW ANNOTATIONS (
    display '消費電力',
    unit 'kW'
  ),
  STATUS ANNOTATIONS (
    display '設備状態'
  ),
  CRITICALITY ANNOTATIONS (
    display '設備重要度'
  )
);
--op_tanakaで実行
sql op_tanaka/xxxxxx@サービス名
SQL> EXEC DBMS_CLOUD_AI.SET_PROFILE('admin.NL2SQL_PROFILE');

SQL> SELECT AI 担当している工場と設備について、設備ごとの最大温度と最大振動を表示し、異常が発生している設備を優先して表示;

工場ID  設備ID  設備名     最大温度  最大振動
------  ------  ---------  --------  --------
TOKYO   M001    Press-01       83.7       6.4
TOKYO   M002    Robot-02       91.3       7.5


--op_suzukiで実行。OSAKAのレコードから結果を生成
sql op_suzuki/xxxxxx@サービス名
SQL> EXEC DBMS_CLOUD_AI.SET_PROFILE('admin.NL2SQL_PROFILE');

SQL> SELECT AI 担当している工場と設備について、設備ごとの最大温度と最大振動を表示し、異常が発生している設備を優先して表示;

工場ID  設備ID  設備名     最大温度  最大振動
------  ------  ---------  --------  --------
OSAKA   M101    Press-01       82.5       5.6
OSAKA   M102    Robot-02       79.8       4.9

SELECT AIを利用した場合でも、通常のSQLと同様に、Deep Data Securityのアクセスポリシーに基づいて制御されたデータから回答が生成されることを確認できました。
このように、ADBからさまざまな外部データソースへアクセスする際にも、Deep Data Securityによる一貫したアクセスポリシーを適用できます。これにより、ADBをAI Lakehouseにおけるセキュアなデータアクセス・ゲートウェイとして活用することができます。

今回は、ADBからApache Icebergのデータを直接参照する構成を紹介しました。次回は、Oracle AI Data Catalogなどのカタログを経由してデータへアクセスする構成と、その場合におけるDeep Data Securityのアクセス制御について紹介したいと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?