El artículo también se encuentra publicado en Ingles English version.
En el artículo de hoy, vamos a ver el nuevo open-mode introducido en 26ai denominado Hybrid Read-Only .
Cuando usamos este modo, el common user seguirá teniendo acceso read-write, mientras que el local user solo tendrá acceso read-only.
Sin más, vamos a ello.
El primer paso es definir una nueva PDB.
SQL> CREATE PLUGGABLE DATABASE PDB_HYBRID ADMIN USER admin IDENTIFIED BY admin keystore identified by external store;
Pluggable database created.
SQL> ALTER PLUGGABLE DATABASE PDB_HYBRID OPEN;
Pluggable database altered.
SQL> ALTER PLUGGABLE DATABASE PDB_HYBRID SAVE STATE;
Pluggable database altered.
Definimos los diferentes usuarios:
SQL> CREATE USER c##hybrid IDENTIFIED BY "XXXXXXX";
User created.
SQL> GRANT DBA TO c##hybrid CONTAINER=ALL;
Grant succeeded.
SQL> alter session set container=pdb_hybrid;
SQL> create smallfile tablespace tb1
datafile size 1m autoextend on maxsize 10m;
Tablespace created.
SQL> CREATE USER hybrid IDENTIFIED BY "XXXXXXX"
DEFAULT TABLESPACE tb1
TEMPORARY TABLESPACE temp
QUOTA UNLIMITED ON tb1;
User created.
SQL> GRANT DBA TO hybrid;
Grant succeeded.
Perfecto, ya tenemos definidos tanto el common user (c##hybrid) como el local user (hybrid).
Antes de abrir la PDB con el nuevo estado, vamos a conectarnos con el usuario hybrid para definir un tabla con algo de información:
SQL> conn hybrid/"XXXXX"@X.X.X.X:1521/pdb_hybrid.XXXX.XXXX.XXXX.com
Connected.
SQL>
SQL>
Create table T_TEST AS
SELECT OBJECT_NAME FROM ALL_OBJECTS;
Table created.
Nos conectamos a CDB$Root para poner en modo hybrid read-only la PDB.
SQL> alter pluggable database PDB_HYBRID close;
Pluggable database altered.
SQL> alter pluggable database PDB_HYBRID open hybrid read only;
Pluggable database altered.
SQL> r
select con_name,
open_mode,
is_hybrid_read_only
from v$container_topology
CON_NAME OPEN_MODE IS_HYBRID_READ_ONLY
-------------------- ---------- --------------------
CDB$ROOT READ WRITE NO
PDB$SEED READ ONLY NO
PDB_HYBRID READ WRITE YES
Nos conectamos con el local user a la PDB e intentamos realizar operaciones DML (delete) y DDL (truncate).
SQL> conn hybrid/"XXXXX"@X.X.X.X:1521/pdb_hybrid.XXXX.XXXX.XXXX.com
Connected.
SQL> set linesize 1000
SQL> col name format a20
SQL> select name, open_mode from v$pdbs;
NAME OPEN_MODE
-------------------- ----------
PDB_HYBRID READ ONLY
SQL> delete T_TEST;
delete T_TEST
*
ERROR at line 1:
ORA-16000: Attempting to modify database or pluggable database that is open for read-only access.
Help: https://docs.oracle.com/error-help/db/ora-16000/
SQL> truncate table T_TEST;
truncate table T_TEST
*
ERROR at line 1:
ORA-16000: Attempting to modify database or pluggable database that is open for read-only access.
Help: https://docs.oracle.com/error-help/db/ora-16000/
Han fallado ambas operaciones con el siguiente mensaje "ORA-16000: Attempting to modify database or pluggable database that is open for read-only access".
Ahora, nos conectamos con el common user y repetimos ambas operaciones.
SQL> conn c##hybrid/"FJA_2026_Oracle19c"
Connected.
SQL> alter session set container=PDB_HYBRID;
Session altered.
SQL> select name, open_mode from v$pdbs;
NAME OPEN_MODE
-------------------- ----------
PDB_HYBRID READ WRITE
SQL> delete hybrid.T_TEST;
52165 rows deleted.
SQL> truncate table hybrid.T_TEST;
Table truncated.
Hemos podido hacer ambas operaciones.
Otro punto que hay que mirar es la v$pdbs, cuando estamos conectados con el local user el OPEN_MODE viene READ ONLY, en cambio, para el common user el valor es READ WRITE.
Espero que os guste. ¡Nos vemos en el próximo artículo!