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を利用し、ユーザーの情報に応じて、参照できる工場のデータを自動的に制限します。
本内容は、実施に必要な全体の流れがわかるように記述していますが、ステップ・バイ・ステップ形式の完全なチュートリアルではない点をご了承下さい。
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のアクセス制御について紹介したいと思います。
