管理ユーザーRASADMINの作成と各種権限の付与
% export TNS_ADMIN=~/Documents/mcp-salesadb-entraid
% sql admin@salesadb_low
SQLcl: 木 2月 12 16:00:54 2026のリリース25.4 Production
Copyright (c) 1982, 2026, Oracle. All rights reserved.
パスワード (**********?) ****************
Last Successful login time: 木 2月 12 2026 16:01:18 +09:00
接続先:
Oracle AI Database 26ai Enterprise Edition Release 23.26.1.1.0 - for Oracle Cloud and Engineered Systems
Version 23.26.1.1.0
SQL>
create user rasadmin identified by <パスワード>;
grant create session to rasadmin;
SQL> create user rasadmin identified by **********;
User RASADMINは作成されました。
SQL> grant create session to rasadmin;
Grantが正常に実行されました。
SQL>
begin
sys.xs_admin_cloud_util.grant_system_privilege('PROVISION','RASADMIN');
sys.xs_admin_cloud_util.grant_system_privilege('ADMIN_ANY_SEC_POLICY','RASADMIN');
end;
/
SQL> begin
2 sys.xs_admin_cloud_util.grant_system_privilege('PROVISION','RASADMIN');
3 sys.xs_admin_cloud_util.grant_system_privilege('ADMIN_ANY_SEC_POLICY','RASADMIN');
4 end;
5* /
PL/SQLプロシージャが正常に完了しました。
SQL>
create role hr_role;
-- 26ai
grant select all table on schema hr to hr_role;
-- 19c
grant select on hr.departments to hr_role;
grant select on hr.employees to hr_role;
grant select on hr.jobs to hr_role;
grant select on hr.job_history to hr_role;
grant select on hr.locations to hr_role;
grant select on hr.regions to hr_role;
grant select on hr.countries to hr_role;
grant select on hr.emp_details_view to hr_role;
-- hr_role configured.
grant hr_role to rasadmin with admin option;SQL> create role hr_role;
Role HR_ROLEは作成されました。
SQL> grant select any table on schema hr to hr_role;
Grantが正常に実行されました。
SQL> grant hr_role to rasadmin with admin option;
Grantが正常に実行されました。
SQL>
MCPサーバーの接続ユーザーMCPUSERに、RASセッションを操作する権限ADMINISTER_SESSIONを与えます。
begin
sys.xs_admin_cloud_util.grant_system_privilege('ADMINISTER_SESSION','MCPUSER');
end;
/SQL> begin
2 sys.xs_admin_cloud_util.grant_system_privilege('ADMINISTER_SESSION','MCPUSER');
3 end;
4* /
PL/SQLプロシージャが正常に完了しました。
SQL>
スキーマMCPUSERの構成
create table mcpuser.auth_users(
employee_id number not null,
department_id number not null,
email varchar2(25),
authenticated_identity varchar2(128) not null
);
SQL> create table mcpuser.auth_users(
2 employee_id number not null,
3 department_id number not null,
4 email varchar2(25),
5 authenticated_identity varchar2(128) not null
6* );
Table MCPUSER.AUTH_USERSは作成されました。
SQL>
commit;
SQL> insert into mcpuser.auth_users(employee_id, department_id, email, authenticated_identity) values(105,60,'DWILLIAMS','yuji._____________EXT_@yuji______________.onmicrosoft.com');
1行挿入しました。
SQL> commit;
コミットが完了しました。
SQL>
SQL> set verify off
SQL> @ emp_dept_ctx_pkg.sql
OWNERの値の入力: MCPUSER
Package MCPUSER.EMP_DEPT_CTX_PKGがコンパイルされました
Package Body MCPUSER.EMP_DEPT_CTX_PKGがコンパイルされました
SQL>
create role mcp_role;
grant select on mcpuser.auth_users to mcp_role;
grant execute on mcpuser.emp_dept_ctx_pkg to mcp_role;
grant mcp_role to rasadmin with admin option;
SQL> create role mcp_role;
Role MCP_ROLEは作成されました。
SQL> grant select on mcpuser.auth_users to mcp_role;
Grantが正常に実行されました。
SQL> grant execute on mcpuser.emp_dept_ctx_pkg to mcp_role;
Grantが正常に実行されました。
SQL> grant mcp_role to rasadmin with admin option;
Grantが正常に実行されました。
SQL>
Real Application Securityの構成
sql rasadmin@salesadb_low
azure % sql rasadmin@salesadb_low
SQLcl: 火 8月 19 10:18:53 2025のリリース25.2 Production
Copyright (c) 1982, 2025, Oracle. All rights reserved.
パスワード (**********?) **************
接続先:
Oracle Database 23ai Enterprise Edition Release 23.0.0.0.0 - for Oracle Cloud and Engineered Systems
Version 23.9.0.25.08
SQL>
begin
sys.xs_principal.create_dynamic_role(
name => 'EMPLOYEE',
scope => XS_PRINCIPAL.SESSION_SCOPE
);
end;
/
SQL> begin
2 sys.xs_principal.create_dynamic_role(
3 name => 'EMPLOYEE',
4 scope => XS_PRINCIPAL.SESSION_SCOPE
5 );
6 end;
7* /
PL/SQLプロシージャが正常に完了しました。
SQL>
grant hr_role to employee;
SQL> grant hr_role to employee;
Grantが正常に実行されました。
SQL>
begin
sys.xs_principal.create_dynamic_role(
name => 'MCPRUNTIME',
scope => XS_PRINCIPAL.SESSION_SCOPE
);
end;
/
grant mcp_role to mcpruntime;
SQL> begin
2 sys.xs_principal.create_dynamic_role(
3 name => 'MCPRUNTIME',
4 scope => XS_PRINCIPAL.SESSION_SCOPE
5 );
6 end;
7* /
PL/SQLプロシージャが正常に完了しました。
SQL> grant mcp_role to mcpruntime;
Grantが正常に実行されました。
SQL>
このアプリケーション・コンテキストに表AUTH_USERSから検索された、Entra IDのユーザーに対応した従業員のEMPLOYEE_IDとDEPARTMENT_IDを保持します。
declare
attrlist XS$NS_ATTRIBUTE_LIST;
begin
attrlist := XS$NS_ATTRIBUTE_LIST();
attrlist.extend(2);
attrlist(1) := XS$NS_ATTRIBUTE('employee_id','0');
attrlist(2) := XS$NS_ATTRIBUTE('department_id','0');
sys.xs_namespace.create_template(
name => 'HREMP',
attr_list => attrlist,
acl => 'SYS.NS_UNRESTRICTED_ACL'
);
end;
/
SQL> declare
2 attrlist XS$NS_ATTRIBUTE_LIST;
3 begin
4 attrlist := XS$NS_ATTRIBUTE_LIST();
5 attrlist.extend(2);
6 attrlist(1) := XS$NS_ATTRIBUTE('employee_id','0');
7 attrlist(2) := XS$NS_ATTRIBUTE('department_id','0');
8 sys.xs_namespace.create_template(
9 name => 'HREMP',
10 attr_list => attrlist,
11 acl => 'SYS.NS_UNRESTRICTED_ACL'
12 );
13 end;
14* /
PL/SQLプロシージャが正常に完了しました。
SQL>
begin
sys.xs_security_class.create_security_class(
name => 'emp_priv',
parent_list => xs$name_list('sys.dml'),
priv_list => xs$privilege_list(xs$privilege('view_sal'))
);
end;
/
SQL> begin
2 sys.xs_security_class.create_security_class(
3 name => 'emp_priv',
4 parent_list => xs$name_list('sys.dml'),
5 priv_list => xs$privilege_list(xs$privilege('view_sal'))
6 );
7 end;
8* /
PL/SQLプロシージャが正常に完了しました。
SQL>
declare
aces xs$ace_list := xs$ace_list();
begin
aces.extend(1);
aces(1) := xs$ace_type(
privilege_list => xs$name_list('select','insert','update','delete'),
principal_name => 'employee' -- application role
);
sys.xs_acl.create_acl(
name => 'emp_acl',
ace_list => aces,
sec_class => 'emp_priv' -- security class
);
end;
/
SQL> declare
2 aces xs$ace_list := xs$ace_list();
3 begin
4 aces.extend(1);
5 aces(1) := xs$ace_type(
6 privilege_list => xs$name_list('select','insert','update','delete'),
7 principal_name => 'employee' -- application role
8 );
9 sys.xs_acl.create_acl(
10 name => 'emp_acl',
11 ace_list => aces,
12 sec_class => 'emp_priv' -- security class
13 );
14 end;
15* /
PL/SQLプロシージャが正常に完了しました。
SQL>
declare
aces xs$ace_list := xs$ace_list();
begin
aces.extend(1);
aces(1) := xs$ace_type(
privilege_list => xs$name_list('select','insert','update','delete','view_sal'),
principal_name => 'employee' -- application role
);
sys.xs_acl.create_acl(
name => 'mgr_acl',
ace_list => aces,
sec_class => 'emp_priv'
);
end;
/
SQL> declare
2 aces xs$ace_list := xs$ace_list();
3 begin
4 aces.extend(1);
5 aces(1) := xs$ace_type(
6 privilege_list => xs$name_list('select','insert','update','delete','view_sal'),
7 principal_name => 'employee' -- application role
8 );
9 sys.xs_acl.create_acl(
10 name => 'mgr_acl',
11 ace_list => aces,
12 sec_class => 'emp_priv'
13 );
14 end;
15* /
PL/SQLプロシージャが正常に完了しました。
SQL>
declare
realms xs$realm_constraint_list := xs$realm_constraint_list();
cols xs$column_constraint_list := xs$column_constraint_list();
begin
realms.extend(2);
realms(1) := xs$realm_constraint_type(
realm => q'~department_id = xs_sys_context('HREMP','department_id')~',
acl_list => xs$name_list('emp_acl')
);
realms(2) := xs$realm_constraint_type(
realm => q'~manager_id = xs_sys_context('HREMP','employee_id')~',
acl_list => xs$name_list('mgr_acl')
);
cols.extend(1);
cols(1) := xs$column_constraint_type(
column_list => xs$list('SALARY','COMMISSION_PCT'),
privilege => 'view_sal'
);
sys.xs_data_security.create_policy(
name => 'employee_ds',
realm_constraint_list => realms,
column_constraint_list => cols
);
end;
/
SQL> declare
2 realms xs$realm_constraint_list := xs$realm_constraint_list();
3 cols xs$column_constraint_list := xs$column_constraint_list();
4 begin
5 realms.extend(2);
6 realms(1) := xs$realm_constraint_type(
7 realm => q'~department_id = xs_sys_context('HREMP','department_id')~',
8 acl_list => xs$name_list('emp_acl')
9 );
10 realms(2) := xs$realm_constraint_type(
11 realm => q'~manager_id = xs_sys_context('HREMP','employee_id')~',
12 acl_list => xs$name_list('mgr_acl')
13 );
14 cols.extend(1);
15 cols(1) := xs$column_constraint_type(
16 column_list => xs$list('SALARY','COMMISSION_PCT'),
17 privilege => 'view_sal'
18 );
19 sys.xs_data_security.create_policy(
20 name => 'employee_ds',
21 realm_constraint_list => realms,
22 column_constraint_list => cols
23 );
24 end;
25* /
PL/SQLプロシージャが正常に完了しました。
SQL>
begin
sys.xs_data_security.apply_object_policy(
policy => 'employee_ds',
schema => 'hr',
object => 'employees'
);
end;
/
SQL> begin
2 sys.xs_data_security.apply_object_policy(
3 policy => 'employee_ds',
4 schema => 'hr',
5 object => 'employees'
6 );
7 end;
8* /
PL/SQLプロシージャが正常に完了しました。
SQL>
設定を検証します。XS_DIAG.VAIDATE_WORKSPACE()を実行します。
set serveroutput on
begin
if (sys.xs_diag.validate_workspace()) then
dbms_output.put_line('All Configurations are correct.');
else
dbms_output.put_line('Some configurations are incorrect.');
end if;
end;
/
SQL> set serveroutput on
SQL> begin
2 if (sys.xs_diag.validate_workspace()) then
3 dbms_output.put_line('All Configurations are correct.');
4 else
5 dbms_output.put_line('Some configurations are incorrect.');
6 end if;
7 end;
8* /
All Configurations are correct.
PL/SQLプロシージャが正常に完了しました。
SQL>
動作確認
ORA-46207: グローバル・コールバックの実行中は、セッション操作ATTACH_SESSIONは許可されません。
結論としては、仮想プライベート・データベースとは異なり、Real Application Securityのセッションはログイン・トリガーで初期化することはできません。
begin
if sys_context('USERENV','AUTHENTICATION_METHOD') = 'TOKEN_GLOBAL' then
emp_dept_ctx_pkg.init;
end if;
end;
/
% export SQLPATH=$TNS_ADMIN
%
SALESADB_AZCODE(TOKEN_AUTH=AZURE_DEVICE_CODE)でデータベースに接続して表HR.EMPLOYEESを検索します。
sql /@salesadb_azcode
select employee_id, first_name, last_name, email, salary, commission_pct, manager_id, department_id from hr.employees;
EMPLOYEE_IDが105のDavid Williamsが所属している部署はIT - DEPARTMENT_IDが60 -です。また、David Willamsは誰のマネージャでもありません。
検索結果は以下のようになります。DEPARTMENT_IDが60の行だけが検索されています。また、MANAGER_IDが105の行は無いので、列SALARYおよびCOMMISSIOIN_PCTが表示されている行はありません。
Real Application Securityのポリシーが適用されていることが確認できます。
% sql /@salesadb_azcode
SQLcl: 水 8月 20 12:39:51 2025のリリース25.2 Production
Copyright (c) 1982, 2025, Oracle. All rights reserved.
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code O8Q4LG3JG to authenticate.
PL/SQLプロシージャが正常に完了しました。
接続先:
Oracle Database 23ai Enterprise Edition Release 23.0.0.0.0 - for Oracle Cloud and Engineered Systems
Version 23.9.0.25.08
SQL> select employee_id, first_name, last_name, email, salary, commission_pct, manager_id, department_id from hr.employees;
EMPLOYEE_ID FIRST_NAME LAST_NAME EMAIL SALARY COMMISSION_PCT MANAGER_ID DEPARTMENT_ID
______________ _____________ ____________ ____________ _________ _________________ _____________ ________________
103 Alexander James AJAMES 102 60
104 Bruce Miller BMILLER 103 60
105 David Williams DWILLIAMS 103 60
106 Valli Jackson VJACKSON 103 60
107 Diana Nguyen DNGUYEN 103 60
SQL> exit
Oracle Database 23ai Enterprise Edition Release 23.0.0.0.0 - for Oracle Cloud and Engineered Systems
Version 23.9.0.25.08から切断されました
%
EMPLOYEE_IDが103のAlexander Jamesは、IT部門のマネージャです。マネージャーがサインインしたときは、列SALARYとCOMMISION_PCTが表示されることを確認します。
ユーザーADMINで接続し、表AUTH_USERSに設定したEMPLOYEE_IDを103、EMAILをAJAMESに変更します。
% sql admin@salesadb_low
SQLcl: 水 8月 20 12:44:20 2025のリリース25.2 Production
Copyright (c) 1982, 2025, Oracle. All rights reserved.
パスワード (**********?) **************
PL/SQLプロシージャが正常に完了しました。
接続先:
Oracle Database 23ai Enterprise Edition Release 23.0.0.0.0 - for Oracle Cloud and Engineered Systems
Version 23.9.0.25.08
SQL> update mcpuser.auth_users set employee_id = 103, email = 'AJAMES';
1行更新しました。
SQL> commit;
コミットが完了しました。
SQL> exit
Oracle Database 23ai Enterprise Edition Release 23.0.0.0.0 - for Oracle Cloud and Engineered Systems
Version 23.9.0.25.08から切断されました
azure %
SALESADBへの接続をやり直し、同じ検索を実行します。
MANANGER_IDが103の従業員については、列SALARYの値が表示されています。
% sql /@salesadb_azcode
SQLcl: 水 8月 20 12:46:47 2025のリリース25.2 Production
Copyright (c) 1982, 2025, Oracle. All rights reserved.
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code NQRSUWAXP to authenticate.
PL/SQLプロシージャが正常に完了しました。
接続先:
Oracle Database 23ai Enterprise Edition Release 23.0.0.0.0 - for Oracle Cloud and Engineered Systems
Version 23.9.0.25.08
SQL> select employee_id, first_name, last_name, email, salary, commission_pct, manager_id, department_id from hr.employees;
EMPLOYEE_ID FIRST_NAME LAST_NAME EMAIL SALARY COMMISSION_PCT MANAGER_ID DEPARTMENT_ID
______________ _____________ ____________ ____________ _________ _________________ _____________ ________________
103 Alexander James AJAMES 102 60
104 Bruce Miller BMILLER 6000 103 60
105 David Williams DWILLIAMS 4800 103 60
106 Valli Jackson VJACKSON 4800 103 60
107 Diana Nguyen DNGUYEN 4200 103 60
SQL> exit
Oracle Database 23ai Enterprise Edition Release 23.0.0.0.0 - for Oracle Cloud and Engineered Systems
Version 23.9.0.25.08から切断されました
azure %
SQLclのMCPサーバーの設定にSQLPATHを追加します。
{
"mcpServers": {
"sqlcl": {
"command": "/Users/_________/sqlcl/bin/sql",
"args": [
"-home",
"/Users/_________/Documents/mcp-salesadb-entraid",
"-R",
"0",
"-mcp"
],
"env": {
"TNS_ADMIN": "/Users/________/Documents/mcp-salesadb-entraid",
"SQLPATH": "/Users/________/Documents/mcp-salesadb-entraid"
}
}
},
"preferences": {
"coworkScheduledTasksEnabled": false,
"sidebarMode": "chat"
}
}
「Real Application Securityのポリシーを有効にするために、emp_dept_ctx_pkg.initを実行してください。」
設定の削除
drop user rasadmin cascade;
drop role hr_role;
drop role mcp_role;
begin
sys.xs_admin_cloud_util.revoke_system_privilege('ADMINISTER_SESSION','MCPUSER');
end;
/
drop package mcpuser.emp_dept_ctx_pkg;
drop table mcpuser.auth_users;

