프린트 하기

OS 환경 : Oracle Linux 8.4 (64bit)

 

DB 환경 : Oracle Database 23.7.0.25.01 ai for Oracle Cloud and Engineered Systems, Free

 

방법 : 오라클 23ai dbms_cloud 설치(non-adb)

오라클 23.7 버전부터 adb가 아닌 일반 온프레미스db에도 dbms_cloud 패키지를 설치할 수 있음
(2025년 04월 기준 아직까지 23.7 일반 버전은 나오지 않았지만 Oracle Cloud and Engineered Systems 버전과 Free 버전으로 테스트함)

아래 글 작성시에는 free 버전 설치시 23.4버전이 설치되었지만 지금은 23.7 버전으로 설치됨

참고 : Oracle Linux 8.4에 Oracle 23ai Free RPM 설치 및 삭제 가이드 ( https://positivemh.tistory.com/1095 )

하지만 dbms_cloud가 23.7에 기본적으로 탑재되어있지 않고 수동으로 설치해주어야함
23.7 new feature 참고 :

https://docs.oracle.com/en/database/oracle/oracle-database/23/nfcoa/ru_23_7.html#GUID-104803-1

 

 

DBMS_CLOUD 패키지는 아래와 같이 구성됨
DBMS_CLOUD
DBMS_CLOUD_AI
DBMS_CLOUD_NOTIFICATION
DBMS_CLOUD_PIPELINE
DBMS_CLOUD_REPO

 

 

DBMS_CLOUD를 사용하기 위해서는 크게 6개 단계를 수행해야함
단계명 뒤에 적혀있는 20.n 숫자는 메뉴얼에 나와있는 번호임
1. DBMS_CLOUD 설치(20.2)
2. 인증서가 포함된 SSL 지갑(Wallet) 생성(20.3)
3. 새로 생성한 SSL 지갑을 사용할 수 있도록 환경 설정(20.4)
4. DBMS_CLOUD 사용을 위한 데이터베이스 ACE(Access Control Entries) 구성(20.5)
5. DBMS_CLOUD 설정 검증(20.6)
6. DBMS_CLOUD를 사용할 사용자 또는 롤 구성(20.7)
6_1. DBMS_CLOUD를 위한 최소 권한 부여(20.7.1)
6_2. 사용자 또는 롤에 대한 ACE(Access Control Entries) 구성(20.7.2)
6_3. 사용자 및 롤 설정 검증(20.7.3)

 

 

1. DBMS_CLOUD 설치(20.2)
참고 : https://docs.oracle.com/en/database/oracle/oracle-database/23/sutil/installing-dbms_cloud.html
먼저 dbms_cloud를 설치해야함, 설치하기 위해 크게 두가지 스크립트를 사용함
기존 및 향후 생성할 모든 pluggable database(PDB)에 DBMS_CLOUD를 올바르게 설치하려면 $ORACLE_HOME/rdbms/admin 디렉토리에 있는 catcon.pl 유틸리티를 사용해 패키지를 설치해야함
DBMS_CLOUD의 코드와 설치 스크립트는 오라클 배포본에 포함되어 있음
주요 스크립트
- catclouduser.sql : 이 스크립트는 필수 권한과 함께 C##CLOUD$SERVICE 스키마를 생성함, 스크립트를 수동으로 변경하면 안 됨
- dbms_cloud_install.sql : 이 스크립트는 C##CLOUD$SERVICE 스키마에 DBMS_CLOUD 패키지를 설치함, 스크립트를 수동으로 변경하면 안 됨

 

 

db 기동 상태 확인

1
2
3
4
5
6
7
8
9
10
SQL>
set lines 200 pages 1000
col name for a20
select con_id, name, open_mode, dbid, con_uid, guid from v$containers;
 
    CON_ID NAME                 OPEN_MODE        DBID    CON_UID GUID
---------- -------------------- ---------- ---------- ---------- --------------------------------
         1 CDB$ROOT             READ WRITE 2139673887          1 1F2E1FEA745ED86FE0631789A8C03E68
         2 PDB$SEED             READ ONLY  1404751039 1404751039 1F2E1FEA745FD86FE0631789A8C03E68
         3 ORACLE23PDB1         READ WRITE 1388982306 1388982306 1F2FD9D07446FDA2E0631789A8C0EBF2

cdb, pdb 모두 기동상태임

 

 

DBMS_CLOUD 패키지 설치
예시 $ $ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl -u sys/{password} -force_pdb_mode 'READ WRITE' -b dbms_cloud_install -d $ORACLE_HOME/rdbms/admin/ -l /tmp catclouduser.sql

1
2
3
4
5
6
7
8
$ $ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl -u sys/oracle -force_pdb_mode 'READ WRITE' -b dbms_cloud_install -d $ORACLE_HOME/rdbms/admin/ -l /tmp catclouduser.sql
catcon::set_log_file_base_path: ALL catcon-related output will be written to [/tmp/dbms_cloud_install_catcon_3620.lst]
 
catcon::set_log_file_base_path: catcon: See [/tmp/dbms_cloud_install*.log] files for output generated by scripts
 
catcon::set_log_file_base_path: catcon: See [/tmp/dbms_cloud_install_*.lst] files for spool files, if any
 
catcon.pl: completed successfully

명령어 설명 :
DBMS_CLOUD 패키지를 설치할 CDB에 로그인한 뒤 catcon.pl와 catclouduser.sql을 이용하여 설치함
설치하면서, 로그 파일은 /tmp 디렉토리에 dbms_cloud_install 라는 이름으로 생성되도록 설정함

 

 

DBMS_CLOUD 패키지를 C##CLOUD$SERVICE 스키마에 설치
예시 $ $ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl -u sys/your-password -force_pdb_mode 'READ WRITE' -b dbms_cloud_install -d $ORACLE_HOME/rdbms/admin/ -l /tmp dbms_cloud_install.sql

1
2
3
4
5
6
7
8
$ $ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl -u sys/oracle -force_pdb_mode 'READ WRITE' -b dbms_cloud_install -d $ORACLE_HOME/rdbms/admin/ -l /tmp dbms_cloud_install.sql
catcon::set_log_file_base_path: ALL catcon-related output will be written to [/tmp/dbms_cloud_install_catcon_3751.lst]
 
catcon::set_log_file_base_path: catcon: See [/tmp/dbms_cloud_install*.log] files for output generated by scripts
 
catcon::set_log_file_base_path: catcon: See [/tmp/dbms_cloud_install_*.lst] files for spool files, if any
 
catcon.pl: completed successfully

명령어 설명 :
DBMS_CLOUD 패키지를 설치할 CDB에 로그인한 뒤 catcon.pl와 dbms_cloud_install.sql을 이용하여 설치함
설치하면서, 로그 파일은 /tmp 디렉토리에 dbms_cloud_install 라는 이름으로 생성되도록 설정함

 

 

참고로 설치시 alert log를 보면 PDB$SEED가 자동으로 close 상태가 되었다가 다시 read write 모드로 오픈됨을 확인할 수 있음

1
2
3
4
5
6
$ tail -300f /app/oracle/diag/rdbms/oracle23/oracle23/trace/alert_oracle23.log
2025-03-09T19:37:30.108021+09:00
alter pluggable database "PDB$SEED" close immediate force instances=('oracle23')
..
Completed: Pluggable database PDB$SEED opened read only
Completed: alter pluggable database "PDB$SEED" open READ ONLY instances=('oracle23')

그리고 설치를 진행하면 모든 pdb들이 DBMS_CLOUD 설치를 위해 강제로 open됨
설치가 이후에는 PDB는 설치 전 상태로 다시 돌아감(mount 등)
위의 쿼리 확인 작업은 open된 상태의 PDB에서만 유효함

 

 

CDBROOT에서 패키지 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
$ sqlplus sys/oracle@localhost:1521/oracle23 as sysdba
SQL>
set lines 200 pages 1000
col owner for a30
col object_name for a40
select con_id, owner, object_name, status, sharing, oracle_maintained 
from cdb_objects 
where object_name like 'DBMS_CLOUD%'
order by 1, 2, 3;
 
    CON_ID OWNER                          OBJECT_NAME                              STATUS  SHARING            O
---------- ------------------------------ ---------------------------------------- ------- ------------------ -
         1 C##CLOUD$SERVICE               DBMS_CLOUD                               VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD                               VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_AI                            VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_AI                            VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_AI_PROFILE$                   VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_AI_PROFILE_ATTR$              VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_AI_PROFILE_SCHEMA$            VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_CAPABILITIES$                 VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_CAPABILITIES_UNIQUE           VALID   NONE               Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_CAPABILITY                    VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_CAPABILITY                    VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_CLOUD_STORE_UNIQUE            VALID   NONE               Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_CONFIG_PARAM                  VALID   DATA LINK          Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_CONFIG_PARAM$                 VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_CORE                          VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_CORE                          VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_FILE_SYSTEM$                  VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_FILE_SYSTEM_UNIQUE            VALID   NONE               Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_INTERNAL                      VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_INTERNAL                      VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_NOTIFICATION                  VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_NOTIFICATION                  VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_OCI_REGIONS                   VALID   DATA LINK          Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_OCI_REGIONS$                  VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_OCI_REGIONS_UNIQUE            VALID   NONE               Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_PARAM_UNIQUE                  VALID   NONE               Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_PIPELINE                      VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_PIPELINE                      VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_PIPELINE$                     VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_PIPELINE_ATTR$                VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_PIPELINE_ATTR_I1$             VALID   NONE               Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_PIPELINE_FILE$                VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_PIPELINE_FILE_I1$             VALID   NONE               Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_PIPELINE_I1$                  VALID   NONE               Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_PIPELINE_INTERNAL             VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_PIPELINE_INTERNAL             VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_REPO                          VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_REPO                          VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_REQUEST                       VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_REQUEST                       VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_REST_API_RESULTS$             VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_STORE                         VALID   DATA LINK          Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_STORE$                        VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_TASK                          VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_TASK                          VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_TASK$                         VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_TASKS                         VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_TASK_CLASS                    VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_TASK_CLASS$                   VALID   METADATA LINK      Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_TASK_CLASS_UNIQUE             VALID   NONE               Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_TASK_CLEANUP                  VALID   NONE               Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_TASK_ID                       VALID   NONE               Y
         1 C##CLOUD$SERVICE               DBMS_CLOUD_TYPES                         VALID   METADATA LINK      Y
         1 PUBLIC                         DBMS_CLOUD                               VALID   METADATA LINK      Y
         1 PUBLIC                         DBMS_CLOUD_AI                            VALID   METADATA LINK      Y
         1 PUBLIC                         DBMS_CLOUD_CAPABILITY                    VALID   METADATA LINK      Y
         1 PUBLIC                         DBMS_CLOUD_CORE                          VALID   METADATA LINK      Y
         1 PUBLIC                         DBMS_CLOUD_INTERNAL                      VALID   METADATA LINK      Y
         1 PUBLIC                         DBMS_CLOUD_NOTIFICATION                  VALID   METADATA LINK      Y
         1 PUBLIC                         DBMS_CLOUD_OCI_REGIONS                   VALID   METADATA LINK      Y
         1 PUBLIC                         DBMS_CLOUD_PIPELINE                      VALID   METADATA LINK      Y
         1 PUBLIC                         DBMS_CLOUD_PIPELINE_INTERNAL             VALID   METADATA LINK      Y
         1 PUBLIC                         DBMS_CLOUD_REPO                          VALID   METADATA LINK      Y
         1 PUBLIC                         DBMS_CLOUD_TYPES                         VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD                               VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD                               VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_AI                            VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_AI                            VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_AI_PROFILE$                   VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_AI_PROFILE_ATTR$              VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_AI_PROFILE_SCHEMA$            VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_CAPABILITIES$                 VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_CAPABILITIES_UNIQUE           VALID   NONE               Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_CAPABILITY                    VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_CAPABILITY                    VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_CLOUD_STORE_UNIQUE            VALID   NONE               Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_CONFIG_PARAM                  VALID   DATA LINK          Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_CONFIG_PARAM$                 VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_CORE                          VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_CORE                          VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_FILE_SYSTEM$                  VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_FILE_SYSTEM_UNIQUE            VALID   NONE               Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_INTERNAL                      VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_INTERNAL                      VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_NOTIFICATION                  VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_NOTIFICATION                  VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_OCI_REGIONS                   VALID   DATA LINK          Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_OCI_REGIONS$                  VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_OCI_REGIONS_UNIQUE            VALID   NONE               Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_PARAM_UNIQUE                  VALID   NONE               Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_PIPELINE                      VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_PIPELINE                      VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_PIPELINE$                     VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_PIPELINE_ATTR$                VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_PIPELINE_ATTR_I1$             VALID   NONE               Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_PIPELINE_FILE$                VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_PIPELINE_FILE_I1$             VALID   NONE               Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_PIPELINE_I1$                  VALID   NONE               Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_PIPELINE_INTERNAL             VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_PIPELINE_INTERNAL             VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_REPO                          VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_REPO                          VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_REQUEST                       VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_REQUEST                       VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_REST_API_RESULTS$             VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_STORE                         VALID   DATA LINK          Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_STORE$                        VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_TASK                          VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_TASK                          VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_TASK$                         VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_TASKS                         VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_TASK_CLASS                    VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_TASK_CLASS$                   VALID   METADATA LINK      Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_TASK_CLASS_UNIQUE             VALID   NONE               Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_TASK_CLEANUP                  VALID   NONE               Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_TASK_ID                       VALID   NONE               Y
         3 C##CLOUD$SERVICE               DBMS_CLOUD_TYPES                         VALID   METADATA LINK      Y
         3 PUBLIC                         DBMS_CLOUD                               VALID   METADATA LINK      Y
         3 PUBLIC                         DBMS_CLOUD_AI                            VALID   METADATA LINK      Y
         3 PUBLIC                         DBMS_CLOUD_CAPABILITY                    VALID   METADATA LINK      Y
         3 PUBLIC                         DBMS_CLOUD_CORE                          VALID   METADATA LINK      Y
         3 PUBLIC                         DBMS_CLOUD_INTERNAL                      VALID   METADATA LINK      Y
         3 PUBLIC                         DBMS_CLOUD_NOTIFICATION                  VALID   METADATA LINK      Y
         3 PUBLIC                         DBMS_CLOUD_OCI_REGIONS                   VALID   METADATA LINK      Y
         3 PUBLIC                         DBMS_CLOUD_PIPELINE                      VALID   METADATA LINK      Y
         3 PUBLIC                         DBMS_CLOUD_PIPELINE_INTERNAL             VALID   METADATA LINK      Y
         3 PUBLIC                         DBMS_CLOUD_REPO                          VALID   METADATA LINK      Y
         3 PUBLIC                         DBMS_CLOUD_TYPES                         VALID   METADATA LINK      Y
 
128 rows selected.

con_id 1번 cdb와 con_id 3 pdb 모두 DBMS_CLOUD 오브젝트가 VALID 상태임

 

 

나의 경우 close 상태인 pdb가 없었지만 만약 open되어있지 않은 pdb가 존재했던 경우 pdb를 오픈시켜 오브젝트 vaild 유무를 확인해야함

 

 

설치 로그에 오류가 발견되거나 C##CLOUD$SERVICE 소유의 invalid 오브젝트가 있으면 원인을 분석 및 수정해야 함
PDB에서 패키지 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ sqlplus sys/oracle@localhost:1521/oracle23pdb1 as sysdba
SQL>
set lines 200 pages 1000
col owner for a30
col object_name for a40
select owner, object_name, status, sharing, oracle_maintained 
from cdb_objects 
where object_name like 'DBMS_CLOUD%'
order by 1, 2, 3;
 
OWNER                          OBJECT_NAME                              STATUS  SHARING            O
------------------------------ ---------------------------------------- ------- ------------------ -
C##CLOUD$SERVICE               DBMS_CLOUD                               VALID   METADATA LINK      Y
C##CLOUD$SERVICE               DBMS_CLOUD                               VALID   METADATA LINK      Y
C##CLOUD$SERVICE               DBMS_CLOUD_AI                            VALID   METADATA LINK      Y
..
PUBLIC                         DBMS_CLOUD_REPO                          VALID   METADATA LINK      Y
PUBLIC                         DBMS_CLOUD_TYPES                         VALID   METADATA LINK      Y
 
64 rows selected.

 

 

2. 인증서가 포함된 SSL 지갑(Wallet) 생성(20.3)
참고 : https://docs.oracle.com/en/database/oracle/oracle-database/23/sutil/create-ssl-wallet-with-certificates.html
HTTP URI와 Object Storage 등 HTTPS 기반의 자원에 접근하기 위해, 데이터베이스에서 사용할 SSL 월렛을 만들어야 함
SSL 월렛에는 필요한 인증서를 넣어야 함

 

 

인증서 다운로드
https://objectstorage.us-phoenix-1.oraclecloud.com/p/KB63IAuDCGhz_azOVQ07Qa_mxL3bGrFh1dtsltreRJPbmb-VwsH2aQ4Pur2ADBMA/n/adwcdemo/b/CERTS/o/dbc_certs.tar
이 링크는 변경될수 있으니 만약 디운로드 되지 않는다면 공식 메뉴얼에 있는 링크로 다운로드하면됨

 

 

인증서 서버에 업로드 및 권한 부여

1
2
3
# mkdir -p /home/oracle/dbc
# mv dbc_certs.tar /home/oracle/dbc
# chown -R oracle:dba /home/oracle/dbc

 

 

인증서 파일 압축 해제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# su - oracle
$ cd /home/oracle/dbc
$ tar -xvf dbc_certs.tar
$ ls
Actalis.cer       BaltimoreCyberTrust.cer  Comodo2.cer    DigiCert9.cer  GeoTrust5.cer      ISRG.cer         SecomTrust2.cer  TeleSec1.cer      UserTrust3.cer
AddTrust1.cer     Buypass1.cer             Comodo3.cer    DSTRoot.cer    GlobalSign1.cer    Keynectis.cer    Sectigo.cer      TeleSec2.cer      UserTrust4.cer
AddTrust2.cer     Buypass2.cer             Comodo4.cer    DTrust1.cer    GlobalSign2.cer    LuxTrust.cer     SecureTrust.cer  TeleSec3.cer      UserTrust5.cer
AddTrust3.cer     Camerfirma1.cer          dbc_certs.tar  DTrust2.cer    GlobalSign3.cer    MicroSec.cer     SSLCom1.cer      TeliaSonera1.cer  VeriSign1.cer
AffirmTrust1.cer  Camerfirma2.cer          DigiCert1.cer  Entrust1.cer   GlobalSign4.cer    NetLock.cer      SSLCom2.cer      TeliaSonera2.cer  VeriSign2.cer
AffirmTrust2.cer  Camerfirma3.cer          DigiCert2.cer  Entrust2.cer   GlobalSign5.cer    QuoVadis1.cer    Starfield1.cer   Thawte1.cer       VeriSign3.cer
AffirmTrust3.cer  Certplus1.cer            DigiCert3.cer  Entrust3.cer   GlobalSign6.cer    QuoVadis2.cer    Starfield2.cer   Thawte2.cer       VeriSign4.cer
AffirmTrust4.cer  Certplus2.cer            DigiCert4.cer  Entrust4.cer   GoDaddy1.cer       QuoVadis3.cer    Starfield3.cer   Thawte3.cer       VeriSign5.cer
Amazon1.cer       Certum1.cer              DigiCert5.cer  GeoTrust1.cer  GoDaddy2.cer       QuoVadis4.cer    Swisscom.cer     Thawte4.cer       VeriSign6.cer
Amazon2.cer       Certum2.cer              DigiCert6.cer  GeoTrust2.cer  GTECyberTrust.cer  QuoVadis5.cer    SwissSign1.cer   Thawte5.cer       VeriSign7.cer
Amazon3.cer       Chunghwa.cer             DigiCert7.cer  GeoTrust3.cer  IdenTrust1.cer     QuoVadis6.cer    SwissSign2.cer   UserTrust1.cer    XRamp.cer
Amazon4.cer       Comodo1.cer              DigiCert8.cer  GeoTrust4.cer  IdenTrust2.cer     SecomTrust1.cer  SwissSign3.cer   UserTrust2.cer

정상적으로 인증서가 받아짐

 

 

SSL 월렛을 /app/oracle/wallets/ssl 위치에 생성
(만약 월렛이 이미 있다면 이 과정은 생략가능하고 인증서만 추가하면됨)

1
2
3
4
5
6
7
8
9
$ mkdir -p /app/oracle/wallets/ssl
$ cd /app/oracle/wallets/ssl
예시 $ orapki wallet create -wallet . -pwd "SSL 월렛 패스워드" -auto_login
$ orapki wallet create -wallet . -pwd "sslpwd1!" -auto_login
Oracle PKI Tool Release 23.0.0.0.0 - Production
Version 23.0.0.0.0
Copyright (c) 2004, 2024, Oracle and/or its affiliates. All rights reserved.
 
Operation is successfully completed.

 

 

월렛에 인증서 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#! /bin/bash
for i in $(ls /home/oracle/dbc/*cer)
do
orapki wallet add -wallet /app/oracle/wallets/ssl -trusted_cert -cert $i -pwd "sslpwd1!"
done
 
Oracle PKI Tool Release 23.0.0.0.0 - Production
Version 23.0.0.0.0
Copyright (c) 2004, 2024, Oracle and/or its affiliates. All rights reserved.
 
Operation is successfully completed.
Oracle PKI Tool Release 23.0.0.0.0 - Production
Version 23.0.0.0.0
Copyright (c) 2004, 2024, Oracle and/or its affiliates. All rights reserved.
 
Operation is successfully completed.
..
(반복됨)

 

 

등록된 인증서 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ orapki wallet display -wallet /app/oracle/wallets/ssl
Oracle PKI Tool Release 23.0.0.0.0 - Production
Version 23.0.0.0.0
Copyright (c) 2004, 2024, Oracle and/or its affiliates. All rights reserved.
 
Requested Certificates:
User Certificates:
Trusted Certificates:
Subject:        OU=ePKI Root Certification Authority,O=Chunghwa Telecom Co.\, Ltd.,C=TW
Subject:        CN=Certum CA,O=Unizeto Sp. z o.o.,C=PL
Subject:        CN=NetLock Arany (Class Gold) Főtanúsítvány,OU=Tanúsítványkiadók (Certification Services),O=NetLock Kft.,L=Budapest,C=HU
Subject:        CN=UTN-USERFirst-Client Authentication and Email,OU=http://www.usertrust.com,O=The USERTRUST Network,L=Salt Lake City,ST=UT,C=US
Subject:        CN=GlobalSign,O=GlobalSign,OU=GlobalSign Root CA - R6
..
Subject:        CN=QuoVadis Root Certification Authority,OU=Root Certification Authority,O=QuoVadis Limited,C=BM
Subject:        CN=SwissSign Platinum CA - G2,O=SwissSign AG,C=CH
Subject:        CN=QuoVadis Root CA 2 G3,O=QuoVadis Limited,C=BM

모두 등록됨

 

 

3. 새로 생성한 SSL 지갑을 사용할 수 있도록 환경 설정(20.4)
참고 : https://docs.oracle.com/en/database/oracle/oracle-database/23/sutil/configure-oracle-environment-to-use-new-ssl-wallet.html
Oracle Database 환경에서 새로 만든 SSL 월렛을 사용하려면 DB 환경이 새로 생성된 SSL 월렛을 가리키도록 설정해야 함
설정을 위해서는 OCI 서버의 SQLnet.ora 파일에 월렛 위치를 추가해야 함
만약 Oracle RAC(Real Application Clusters) 환경이라면, 모든 노드에서 동일하게 SQLnet.ora 파일을 설정해줘야 함
이미 기존의 SSL 월렛이 있고 인증서를 기존 월렛에 추가했다면, 이 과정은 생략 가능함

 

 

sqlnet.ora 파일에 월렛 위치 추가

1
2
3
4
$ vi $ORACLE_HOME/network/admin/sqlnet.ora
WALLET_LOCATION=
  (SOURCE=(METHOD=FILE)
   (METHOD_DATA=(DIRECTORY=/app/oracle/wallets/ssl)))

 

 

4. DBMS_CLOUD 사용을 위한 데이터베이스 ACE(Access Control Entries, 접근 제어 항목) 구성(20.5)
참고 : https://docs.oracle.com/en/database/oracle/oracle-database/23/sutil/configure-database-aces-for-dbms_cloud.html
Object Storage 및 신뢰할 수 있는 외부 HTTPS 엔드포인트(URI)에 접속하려면 접근 제어 항목(ACE)을 설정해야 함
기본적으로 오라클 데이터베이스는 외부와의 통신이 허용되지 않음
Object Storage에 접근하기 위해서는 데이터베이스가 외부 통신을 할 수 있도록 적절한 ACE를 구성해야 함
만약 데이터베이스가 방화벽 뒤에 있다면 인터넷 게이트웨이(프록시)의 정보를 제공하고 ACE를 구성해야 함
데이터베이스가 HTTP 프록시를 사용해 인터넷에 연결하는 환경이라면, 게이트웨이를 통해 외부 네트워크 서비스에 접근할 수 있도록 반드시 구성해야 함
이 과정에서 DBMS_CLOUD가 외부 네트워크 서비스에 접근할 때 사용할 HTTP 프록시 게이트웨이에 접근할 수 있도록 데이터베이스의 접근 제어 목록(ACL)에 ACE를 추가해야 함

 

 

나의 경우 HTTP 프록시를 사용하지 않고 iptime 공유기를 이용해 외부 연결용 DDNS만 설정해놓은 환경임
이 경우 모든 호스트(host='*')를 HTTPS 포트인 443번으로 열어주면됨
Oracle DB는 DDNS 여부와 상관없이 DBMS_CLOUD가 접근할 모든 HTTPS 목적지에 대한 ACE만 필요함
DDNS 자체가 목적지가 아니라 출발지이기 때문에, DDNS를 별도로 ACE에 넣을 필요는 없음

 

 

HTTP 프록시를 사용하는 경우 공식 문서를 참고해서 설정해야함
참고 :

https://docs.oracle.com/en/database/oracle/oracle-database/23/sutil/configure-database-aces-for-dbms_cloud.html

 

 

환경 설정 시 주의사항
DB 환경 관련 변수를 정확히 입력해야 DBMS_CLOUD가 올바르게 동작함
설정을 정확히 하지 않으면 DBMS_CLOUD 기능이 제대로 작동하지 않음
프록시 설정과 SSL 월렛 경로를 정확하게 입력해야 함

 

 

dbc_aces.sql 파일 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
$ vi /home/oracle/dbc/dbc_aces.sql
@$ORACLE_HOME/rdbms/admin/sqlsessstart.sql
 
-- DBMS_CLOUD의 기능 소유자 변경 금지
define clouduser=C##CLOUD$SERVICE
 
-- SSL 월렛 경로 지정
define sslwalletdir=/app/oracle/wallets/ssl
 
begin
    -- 모든 HTTPS(443) 접속을 허용
    dbms_network_acl_admin.append_host_ace(
        host => '*',
        lower_port => 443,
        upper_port => 443,
        ace => xs$ace_type(
            privilege_list => xs$name_list('http', 'http_proxy'),
            principal_name => upper('&clouduser'),
            principal_type => xs_acl.ptype_db));
 
    -- SSL 월렛 접근 권한 설정
    dbms_network_acl_admin.append_wallet_ace(
        wallet_path => 'file:&sslwalletdir',
        ace => xs$ace_type(
            privilege_list => xs$name_list('use_client_certificates', 'use_passwords'),
            principal_name => upper('&clouduser'),
            principal_type => xs_acl.ptype_db));
end;
/
 
-- 데이터베이스 속성 SSL_WALLET 설정
begin
    if sys_context('userenv', 'con_name') = 'CDB$ROOT' then
        execute immediate 'alter database property set ssl_wallet=''&sslwalletdir''';
    end if;
end;
/

 

 

cdb 접속 후 스크립트 실행

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ sqlplus sys/oracle@localhost:1521/oracle23 as sysdba
SQL> @/home/oracle/dbc/dbc_aces.sql
 
Session altered.
 
old   9:             principal_name => upper('&clouduser'),
new   9:             principal_name => upper('C##CLOUD$SERVICE'),
old  14:         wallet_path => 'file:&sslwalletdir',
new  14:         wallet_path => 'file:/app/oracle/wallets/ssl',
old  17:             principal_name => upper('&clouduser'),
new  17:             principal_name => upper('C##CLOUD$SERVICE'),
 
PL/SQL procedure successfully completed.
 
old   3:         execute immediate 'alter database property set ssl_wallet=''&sslwalletdir''';
new   3:         execute immediate 'alter database property set ssl_wallet=''/app/oracle/wallets/ssl''';
 
PL/SQL procedure successfully completed.

스크립트를 실행한 후 환경에 맞게 설정값이 들어갔는지 확인이 필요함
HTTP 프록시 환경이 아닌 경우 어떤 항목도 표시되지 않음
SSL_WALLET 속성에는 속성에는 ssl 월렛이 위치한 디렉토리가 표시되어야함

 

 

5. DBMS_CLOUD 설정 검증(20.6)
참고 : https://docs.oracle.com/en/database/oracle/oracle-database/23/sutil/verify-configuration-dbms_cloud.html
DBMS_CLOUD 코드가 올바르게 설치되었는지 확인한 후 SSL 월렛과 접근 제어 항목(ACE)이 올바르게 설정되었는지 검증해야 함

 

 

그전에 dns에 오라클 링크 주소가 등록되어 있지 않으면 아래 스크립트 수행시 에러가 발생함

1
2
3
possibly raised PLSQL/SQL error: -29273 - ORA-29273: HTTP request failed
possibly raised HTML error: ORA-12545: Connect failed because target host or
object does not exist

 

 

구글 dns(8.8.8.8) 등록
/etc/resolv.conf에 8.8.8.8, 8.8.8.4 추가

1
2
3
4
# vi /etc/resolv.conf
nameserver 168.126.63.1
nameserver 8.8.8.8
nameserver 8.8.4.4

 

 

nslookup 통신 테스트

1
2
3
4
5
6
7
8
9
10
11
12
# nslookup objectstorage.eu-frankfurt-1.oraclecloud.com
Server:         8.8.8.8
Address:        8.8.8.8#53
 
Non-authoritative answer:
objectstorage.eu-frankfurt-1.oraclecloud.com    canonical name = objectstorage.eu-frankfurt-1.oci.oraclecloud.com.
Name:   objectstorage.eu-frankfurt-1.oci.oraclecloud.com
Address: 134.70.48.1
Name:   objectstorage.eu-frankfurt-1.oci.oraclecloud.com
Address: 134.70.44.1
Name:   objectstorage.eu-frankfurt-1.oci.oraclecloud.com
Address: 134.70.40.1

정상

 

 

ping 테스트

1
2
3
4
5
6
7
8
9
10
$ ping objectstorage.eu-frankfurt-1.oraclecloud.com
PING objectstorage.eu-frankfurt-1.oci.oraclecloud.com (134.70.48.1) 56(84) bytes of data.
64 bytes from 134.70.48.1 (134.70.48.1): icmp_seq=1 ttl=128 time=264 ms
64 bytes from 134.70.48.1 (134.70.48.1): icmp_seq=2 ttl=128 time=265 ms
64 bytes from 134.70.48.1 (134.70.48.1): icmp_seq=3 ttl=128 time=264 ms
64 bytes from 134.70.48.1 (134.70.48.1): icmp_seq=4 ttl=128 time=264 ms
^C
--- objectstorage.eu-frankfurt-1.oci.oraclecloud.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 263.753/264.157/264.560/0.301 ms

정상

 

 

db에서 접속되는지 확인

1
2
3
4
5
SQL> select utl_http.request('https://objectstorage.eu-frankfurt-1.oraclecloud.com') from dual;
 
UTL_HTTP.REQUEST('HTTPS://OBJECTSTORAGE.EU-FRANKFURT-1.ORACLECLOUD.COM')
--------------------------------------------------------------------------------
{"code":"NotFound","message":"Not Found"}

정상적으로 표시됨

 

 

스크립트 파일 생성
*아래 스크립트는 SYS 사용자로 CDB 또는 PDB에서 실행해야 함
*환경 변수 값이 정확히 설정되지 않으면, DBMS_CLOUD가 정상적으로 설정되었더라도 검증 과정이 실패할 수 있음

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
$ vi /home/oracle/dbc/check_dbms_cloud.sql
define clouduser=C##CLOUD$SERVICE
 
-- 환경에 맞게 SSL Wallet 디렉토리와 비밀번호 설정
define sslwalletdir=/app/oracle/wallets/ssl
define sslwalletpwd="sslpwd1!"
 
-- 프록시가 필요한 환경에서는 아래 설정 추가
-- define proxy_uri=<프록시 URI 주소>
 
-- create and run this procedure as owner of the ACLs, which is the future owner
-- of DBMS_CLOUD
 
CREATE OR REPLACE PROCEDURE &clouduser..GET_PAGE(url IN VARCHAR2) AS
    request_context UTL_HTTP.REQUEST_CONTEXT_KEY;
    req UTL_HTTP.REQ;
    resp UTL_HTTP.RESP;
    data VARCHAR2(32767) default null;
    err_num NUMBER default 0;
    err_msg VARCHAR2(4000) default null;
 
BEGIN
 
-- SSL 월렛을 사용해 request context 생성
    request_context := UTL_HTTP.CREATE_REQUEST_CONTEXT(
        wallet_path => 'file:&sslwalletdir',
        wallet_password => '&sslwalletpwd');
 
-- HTTP 프록시가 필요한 경우 주석 해제 후 설정
--    UTL_HTTP.SET_PROXY('&proxy_uri', NULL);
 
-- HTTP request 수행
    req := UTL_HTTP.BEGIN_REQUEST(url => url,request_context => request_context);
    resp := UTL_HTTP.GET_RESPONSE(req);
 
DBMS_OUTPUT.PUT_LINE('valid response');
 
EXCEPTION
    WHEN OTHERS THEN
        err_num := SQLCODE;
        err_msg := SUBSTR(SQLERRM, 1, 3800);
        DBMS_OUTPUT.PUT_LINE('possibly raised PLSQL/SQL error: ' ||err_num||' - '||err_msg);
 
        UTL_HTTP.END_RESPONSE(resp);
        data := UTL_HTTP.GET_DETAILED_SQLERRM ;
        IF data IS NOT NULL THEN
            DBMS_OUTPUT.PUT_LINE('possibly raised HTML error: ' ||data);
        END IF;
END;
/
 
set serveroutput on
BEGIN
    &clouduser..GET_PAGE('https://objectstorage.eu-frankfurt-1.oraclecloud.com');
END;
/
 
set serveroutput off
drop procedure &clouduser..GET_PAGE;

 

 

스크립트 수행
*위 스크립트 수행시 "valid response" 라고 표시되면 정상 동작하는것임

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SQL> @/home/oracle/dbc/check_dbms_cloud.sql
old   1: CREATE OR REPLACE PROCEDURE &clouduser..GET_PAGE(url IN VARCHAR2) AS
new   1: CREATE OR REPLACE PROCEDURE C##CLOUD$SERVICE.GET_PAGE(url IN VARCHAR2) AS
old  13:         wallet_path => 'file:&sslwalletdir',
new  13:         wallet_path => 'file:/app/oracle/wallets/ssl',
old  14:         wallet_password => '&sslwalletpwd');
new  14:         wallet_password => 'sslpwd1!');
Enter value for proxy_uri: [엔터] <<-- proxy_uri를 사용하지 않기때문에 그냥 엔터 입력
old  17: --    UTL_HTTP.SET_PROXY('&proxy_uri', NULL);
new  17: --    UTL_HTTP.SET_PROXY('', NULL);
 
Procedure created.
 
old   2:     &clouduser..GET_PAGE('https://objectstorage.eu-frankfurt-1.oraclecloud.com');
new   2:     C##CLOUD$SERVICE.GET_PAGE('https://objectstorage.eu-frankfurt-1.oraclecloud.com');
valid response  <<--- vaild response 표시됨(정상)
 
PL/SQL procedure successfully completed.
 
old   1: drop procedure &clouduser..GET_PAGE
new   1: drop procedure C##CLOUD$SERVICE.GET_PAGE
 
Procedure dropped.

 

 

6. DBMS_CLOUD를 사용할 사용자 또는 롤 구성(20.7)
6_1. DBMS_CLOUD를 위한 최소 권한 부여(20.7.1)
참고 : https://docs.oracle.com/en/database/oracle/oracle-database/23/sutil/grant-minimal-privileges-user-role-use-dbms_cloud.html
DBMS_CLOUD 기능을 사용하려면 사용자 또는 롤에 최소한의 접근 권한을 부여해야 함
*다수의 사용자에게 일괄적으로 권한을 부여할 경우, Role을 통해 권한을 관리하는 것이 권장됨

 

 

pdb의 imsi 유저에게 권한을 부여함
imsi 유저가 없다면 생성
참고 : 오라클 19c 테스트 시 사용하는 imsi 유저 생성 쿼리 ( https://positivemh.tistory.com/1017 )

 

 

Role을 사용하여 권한 부여 (권장 방식)
CLOUD_USER 롤을 생성한 후, IMSI 사용자에게 롤을 부여
*pdb환경에서 sys 또는 system 계정으로 실행해야 함

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
SQL>
set verify off
 
-- 대상 롤 정의
define userrole='CLOUD_USER'
 
-- 대상 사용자 정의
define username='IMSI'
 
-- 롤 생성
CREATE ROLE &userrole;
 
-- 사용자에게 롤 부여
GRANT CLOUD_USER TO &username;
 
-- DBMS_CLOUD 기능을 사용하기 위한 최소 권한 부여
 
-- External 테이블 생성 권한 부여(DBMS_CLOUD.CREATE_EXTERNAL_TABLE() 사용 시 필요)
GRANT CREATE TABLE TO &userrole;
 
-- 아래 권한 부여(COPY_DATA() 사용 시 필요)
GRANT READ, WRITE ON DIRECTORY DATA_PUMP_DIR TO &userrole;
 
-- DBMS_CLOUD 패키지 실행 권한 부여
GRANT EXECUTE ON DBMS_CLOUD TO &userrole;
GRANT EXECUTE ON DBMS_CLOUD_PIPELINE TO &userrole;
GRANT EXECUTE ON DBMS_CLOUD_REPO TO &userrole;
GRANT EXECUTE ON DBMS_CLOUD_NOTIFICATION TO &userrole;

모든 권한이 부여됨

 

 

6_2. 사용자 또는 롤에 대한 ACE(Access Control Entries) 구성(20.7.2)
참고 : https://docs.oracle.com/en/database/oracle/oracle-database/23/sutil/configure-aces-user-role-use-dbms_cloud.html
DBMS_CLOUD 패키지는 INVOKER 권한을 사용하므로 사용자 또는 롤이 DBMS_CLOUD의 모든 기능을 사용하려면 적절한 ACE(Access Control Entries) 구성이 필요함
*다수의 사용자에게 권한을 부여할 경우, 롤을 통해 설정하는 것이 관리에 유리함

 

 

Role을 사용하여 ACE 구성(권장 방식)
CLOUD_USER 롤을 생성한 후, 해당 롤에 대한 ACE를 설정함
*pdb환경에서 sys 또는 system 계정으로 실행해야 함

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
SQL>
@$ORACLE_HOME/rdbms/admin/sqlsessstart.sql
 
-- 대상 롤 정의
define cloudrole='CLOUD_USER'
 
-- SSL Wallet 디렉토리 설정
define sslwalletdir=/app/oracle/wallets/ssl
 
-- 프록시 환경이라면 아래 설정을 수정하여 사용
-- define proxy_uri=<프록시 URI 주소>
-- define proxy_host=<프록시 DNS 이름>
-- define proxy_low_port=<프록시 하위 포트>
-- define proxy_high_port=<프록시 상위 포트>
 
-- 새로운 ACL / ACE 구성
BEGIN
    -- 모든 HTTPS(443) 요청 허용
    DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
        host => '*',
        lower_port => 443,
        upper_port => 443,
        ace => xs$ace_type(
            privilege_list => xs$name_list('http', 'http_proxy'),
            principal_name => upper('&cloudrole'),
            principal_type => xs_acl.ptype_db));
 
    -- 프록시 환경에서만 사용
    -- DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
    --     host => '&proxy_host',
    --     lower_port => &proxy_low_port,
    --     upper_port => &proxy_high_port,
    --     ace => xs$ace_type(
    --         privilege_list => xs$name_list('http', 'http_proxy'),
    --         principal_name => upper('&cloudrole'),
    --         principal_type => xs_acl.ptype_db));
 
    -- SSL Wallet 접근 권한 부여
    DBMS_NETWORK_ACL_ADMIN.APPEND_WALLET_ACE(
        wallet_path => 'file:&sslwalletdir',
        ace => xs$ace_type(
            privilege_list => xs$name_list('use_client_certificates', 'use_passwords'),
            principal_name => upper('&cloudrole'),
            principal_type => xs_acl.ptype_db));
END;
/
 
@$ORACLE_HOME/rdbms/admin/sqlsessend.sql

ACE가 설정됨

 

 

6_3. 사용자 및 롤 설정 검증(20.7.3)
참고 : https://docs.oracle.com/en/database/oracle/oracle-database/23/sutil/verify-setup-user-roles-use-dbms_cloud.html

 

 

일반유저 테스트용 스크립트 파일 생성
*아래 스크립트는 SYS 사용자로 CDB 또는 PDB에서 실행해야 함
*환경 변수 값이 정확히 설정되지 않으면, DBMS_CLOUD가 정상적으로 설정되었더라도 검증 과정이 실패할 수 있음

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
$ vi /home/oracle/dbc/check_dbms_cloud_imsi.sql
-- 대상 사용자 정의 (IMSI 사용자 테스트)
define clouduser='IMSI'
 
-- SSL Wallet 디렉토리 및 비밀번호 설정
define sslwalletdir=/app/oracle/wallets/ssl
define sslwalletpwd="sslpwd1!"
 
-- 테스트 프로시저 생성
CREATE OR REPLACE PROCEDURE &clouduser..GET_PAGE(url IN VARCHAR2)
AS
    request_context UTL_HTTP.REQUEST_CONTEXT_KEY;
    req UTL_HTTP.REQ;
    resp UTL_HTTP.RESP;
    data VARCHAR2(32767) default null;
    err_num NUMBER default 0;
    err_msg VARCHAR2(4000) default null;
BEGIN
    -- SSL Wallet을 활용한 요청 컨텍스트 생성
    request_context := UTL_HTTP.CREATE_REQUEST_CONTEXT(
        wallet_path => 'file:&sslwalletdir',
        wallet_password => '&sslwalletpwd');
 
    -- HTTP 요청 수행
    req := UTL_HTTP.BEGIN_REQUEST(url => url, request_context => request_context);
    resp := UTL_HTTP.GET_RESPONSE(req);
 
    DBMS_OUTPUT.PUT_LINE('valid response');
 
EXCEPTION
    WHEN OTHERS THEN
        err_num := SQLCODE;
        err_msg := SUBSTR(SQLERRM, 1, 3800);
        DBMS_OUTPUT.PUT_LINE('possibly raised PLSQL/SQL error: ' || err_num || ' - ' || err_msg);
 
        UTL_HTTP.END_RESPONSE(resp);
        data := UTL_HTTP.GET_DETAILED_SQLERRM;
        IF data IS NOT NULL THEN
            DBMS_OUTPUT.PUT_LINE('possibly raised HTML error: ' || data);
        END IF;
END;
/
 
set serveroutput on
BEGIN
    &clouduser..GET_PAGE('https://objectstorage.eu-frankfurt-1.oraclecloud.com');
END;
/
set serveroutput off

 

 

pdb에 imsi유저로 접속 후 스크립트 수행
*위 스크립트 수행시 "valid response" 라고 표시되면 정상 동작하는것임

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ sqlplus imsi/imsi@localhost:1521/oracle23pdb1
SQL> @/home/oracle/dbc/check_dbms_cloud_imsi.sql
old   1: CREATE OR REPLACE PROCEDURE &clouduser..GET_PAGE(url IN VARCHAR2)
new   1: CREATE OR REPLACE PROCEDURE IMSI.GET_PAGE(url IN VARCHAR2)
old  12:         wallet_path => 'file:&sslwalletdir',
new  12:         wallet_path => 'file:/app/oracle/wallets/ssl',
old  13:         wallet_password => '&sslwalletpwd');
new  13:         wallet_password => 'sslpwd1!');
 
Procedure created.
 
possibly raised PLSQL/SQL error: -29273 - ORA-29273: HTTP request failed
possibly raised HTML error: ORA-24247: network access denied by access control
list (ACL)
 
PL/SQL procedure successfully completed.

에러 발생

 

 

pdb의 sys나 system 유저로 imsi 유저에 utl_http 실행 권한 및 acl 권한 직접 부여

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SQL> grant execute on utl_http to imsi;
 
Grant succeeded.
 
SQL>
BEGIN
    DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
        host => '*',
        lower_port => 443,
        upper_port => 443,
        ace => xs$ace_type(
            privilege_list => xs$name_list('http', 'http_proxy'),
            principal_name => 'IMSI',
            principal_type => xs_acl.ptype_db)
    );
END;
/
 
PL/SQL procedure successfully completed.

 

 

pdb의 imsi 유저로 스크립트 재수행
*위 스크립트 수행시 "valid response" 라고 표시되면 정상 동작하는것임

1
2
3
4
5
6
7
SQL> @/home/oracle/dbc/check_dbms_cloud_imsi.sql
 
Procedure created.
 
valid response  <<--- vaild response 표시됨(정상)
 
PL/SQL procedure successfully completed.

정상적으로 vaild response가 나옴
*해결하고 보니 메뉴얼에도 나와있는 내용이었음
(원문 : If you have granted the ACLs through a role, then you must grant those privileges explicitly to user SCOTT for this example to work)
(번역 : 롤을 통해 ACL을 부여한 경우 SCOTT이 예제가 작동하려면 해당 권한을 사용자에게 명시적으로 부여해야 합니다.)

 

 

dba_network_acl_privileges 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SQL>
set lines 200 pages 1000
col acl for a50
col principal for a10
col privilege for a10
col is_grant for a10
select acl, principal, privilege, is_grant
from dba_network_acl_privileges
where principal = 'IMSI';
 
ACL                                                PRINCIPAL  PRIVILEGE  IS_GRANT
-------------------------------------------------- ---------- ---------- ----------
NETWORK_ACL_305057**********************B47C       IMSI       http       true
NETWORK_ACL_305057**********************B47C       IMSI       http-proxy true

 

 

결론 :
이렇게 오라클 23.7버전부터 dbms_cloud를 사용할수 있게됨
다음 게시글에선 dbms_cloud_ai를 이용해 23.7(non autonomous database)에서 select ai를 테스트해볼 예정임

 

 

참조 : 

2748362.1
https://docs.oracle.com/en/database/oracle/oracle-database/23/nfcoa/ru_23_7.html#GUID-104803-1
https://docs.oracle.com/en/database/oracle/oracle-database/23/sutil/dbms_cloud-family-packages.html
https://bryangrenn.blogspot.com/2025/03/23.7-Selectai.html?m=1
https://oracle-cloud.tistory.com/entry/Select-AI-%EC%BF%BC%EB%A6%AC-%EC%83%9D%EC%84%B1-%EA%B8%B0%EB%8A%A5-%EC%86%8C%EA%B0%9C
https://blog.cloudnueva.com/select-ai-is-not-a-toy