پایگاه داده اوراکل در نسخه ۲۳C به ما امکان می دهد PDB ها را در حالت Hybrid Read-Only قراردهیم. این به کاربران در سطح CDB اجازه می دهد تا در حالت خواندن و نوشتن کار کنند، در حالی که کاربران PDB و کاربران معمولی برنامه به حالت فقط خواندن محدود می شوند.
حالا این امکان چه مزیتی به ما می دهد؟ در مواقعی لازم هست که شما یکسری فعالیت ادمینی انجام دهید که در این حالت نباید تغییراتی در سطح پایگاه داده انجام شودُ با این امکان می توان این تغییرات را انجام داد و در همین حال به جای اینکه دسترسی کاربران را کامل قطع کنیم به آنها اجازه مشاهده داده را می دهیم.
آموزش نصب و راه اندازی Oracle Database 23c
با کاربر sys به CDB وصل می شویم و PDB را که نام آن freepdb1 می باشد را در این حالت قرار می دهیم.
conn / as sysdba
alter pluggable database freepdb1 close immediate;
alter pluggable database freepdb1 open hybrid read only;
حال برای اینکه در حالت فقط خواندنی و یا خواندن و نوشتن قرار بگیریم به این وابسته می باشد که با چه کاربری متصل شویم.
برای بررسی کاربران مربوطه را می سازیم، کاربر در سطح CDB با دسترسی به PDB (c##soltani) و کاربر در سطح (soltani)PDB.
conn / as sysdba
create user c##soltani identified by ab123456 container=all;
grant dba to c## soltani container=all;
alter session set container=freepdb1;
create user soltani identified by ab123456;
grant dba to soltani;
ابتدا با کاربر c##soltani متصل می شویم:
conn c##soltani/ab123456@//localhost:1521/freepdb1
column name format a10
select name, open_mode from v$pdbs;
NAME OPEN_MODE
———- ———-
FREEPDB1 READ WRITE
SQL>
column con_name format a10
column is_hybrid_read_only format a20
select con_name,
open_mode,
is_hybrid_read_only
from v$container_topology;
CON_NAME OPEN_MODE IS_HYBRID_READ_ONLY
———- ———- ——————–
FREEPDB1 READ WRITE YES
SQL>
همانطور که انتظار داشتیم، PDB در حالت Read Write قراردارد.
حال با کاربر Soltani متصل می شویم.
conn soltani/ ab123456@//localhost:1521/freepdb1
column name format a10
select name, open_mode from v$pdbs;
NAME OPEN_MODE
———- ———-
FREEPDB1 READ ONLY
SQL>
column con_name format a10
column is_hybrid_read_only format a20
select con_name,
open_mode,
is_hybrid_read_only
from v$container_topology;
CON_NAME OPEN_MODE IS_HYBRID_READ_ONLY
———- ———- ——————–
FREEPDB1 READ WRITE YES
SQL>
در این حالت viewبه نام v$pdbs پایگاه داده را به صورت Read Only نمایش میدهد.
در ادامه دستوراتی را با هر دوکاربر اجرا می کنیم تا خروجی ها را مشاهده کنیم.
SQL> conn c##soltani/ab123456@//localhost:1521/freepdb1
Connected.
SQL> drop user if exists rad cascade;
User dropped.
SQL> create user rad identified by rad quota unlimited on users;
User created.
SQL> grant db_developer_role to rad;
Grant succeeded.
SQL>create table rad.tabletest (id number);
Table created.
SQL> insert into rad. tabletest values (1);
۱ row created.
SQL> commit;
Commit complete.
SQL>
همانطور که مشاهده کردید هنگامی که با کاربر c##soltani متصل شدیم، توانستیم تمامی دستورات DDL و DML را اجرا کنیم. در صورتی که این دستورات را نمی توانیم با کاربر soltani اجرا کنیم و با خطا مواجه می شویم.
SQL> conn soltani/ab123456@//localhost:1521/freepdb1
Connected.
SQL> drop user if exists rad cascade;
*
ERROR at line 1:
ORA-16000: Attempting to modify database or pluggable database that is open for
read-only access.
SQL> create user rad identified by rad quota unlimited on users;
*
ERROR at line 1:
ORA-16000: Attempting to modify database or pluggable database that is open for
read-only access.
SQL> grant db_developer_role to rad;
*
ERROR at line 1:
ORA-16000: Attempting to modify database or pluggable database that is open for
read-only access.
SQL> create table rad.tabletest (id number);
*
ERROR at line 1:
ORA-16000: Attempting to modify database or pluggable database that is open for
read-only access.
SQL> insert into rad.tabletest values (1);
*
ERROR at line 1:
ORA-16000: Attempting to modify database or pluggable database that is open for
read-only access.
SQL> select * from rad.tabletest;
ID
———-
۱
SQL>
conn / as sysdba
alter pluggable database freepdb1 close immediate;
alter pluggable database freepdb1 open read write;