OracleXE21 Dell

¿Qué es una PDB y por qué crear el usuario allí?

PDB (Pluggable Database): en la arquitectura multitenant de Oracle hay una base de datos contenedora (CDB) que puede alojar varias bases de datos "enchufables" llamadas PDB. Cada PDB actúa como una base de datos independiente: tiene sus propios esquemas, objetos y datos, pero comparte el mismo proceso/instancia y los archivos del CDB.

Por qué crear el usuario en la PDB (y no en CDB$ROOT):
Aislamiento: los usuarios y objetos creados en una PDB sólo existen en esa PDB. Si creas el usuario en CDB$ROOT (la raíz), acabarías creando un usuario común que puede aparecer en todas las PDB o requerir prefijo C##, lo cual no es adecuado para aplicaciones específicas.
Seguridad y administración: normalmente cada aplicación usa su propia PDB o al menos su propio esquema dentro de una PDB. Esto facilita backups, export/import (expdp/impdp a nivel de PDB), y control de privilegios.
Compatibilidad: muchas operaciones y herramientas esperan que los objetos de la aplicación estén en la PDB correspondiente; crear en la raíz puede generar errores o comportamientos inesperados.
Errores como ORA-65096: aparecen cuando intentas crear un usuario "local" desde la raíz; mover la sesión al contenedor (PDB) evita ese requisito del prefijo C##.

Analogía simple: piensa en el CDB como un edificio de oficinas y cada PDB como una oficina independiente. Si quieres contratar a un empleado (usuario) que trabaje en la oficina de Hostal, debes registrarlo en esa oficina (PDB), no en el lobby del edificio (CDB$ROOT).

SQL> SELECT name, open_mode FROM v$pdbs;

NAME OPEN_MODE

PDB$SEED READ ONLY

XEPDB1 READ WRITE

Tienes dos PDBs: PDB$SEED (solo lectura) y XEPDB1 (READ WRITE). Debes usar XEPDB1. Ejecuta estos comandos como SYS AS SYSDBA:

SQL> ALTER SESSION SET CONTAINER = XEPDB1;

Session altered.

SQL> SHOW CON_NAME;

CON_NAME

XEPDB1

SQL> CREATE USER hostal_user IDENTIFIED BY password
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP
QUOTA 500M ON USERS;

User created.

SQL> GRANT CREATE SESSION, CREATE TABLE, CREATE SEQUENCE, CREATE VIEW, CREATE PROCEDURE TO hostal_user;

Grant succeeded.

CONNECT hostal_user/password@//localhost:1521/XEPDB1

CREATE TABLE pruebahostal (id NUMBER PRIMARY KEY, nombre VARCHAR2(100));
INSERT INTO prueba
hostal VALUES (1,'Prueba');
COMMIT;

SELECT * FROM prueba_hostal;

DROP TABLE prueba_hostal PURGE;

CREATE TABLE reserva (
reservaid NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
huesped
nombre VARCHAR2(100) NOT NULL,
fechaingreso DATE NOT NULL,
fecha
salida DATE NOT NULL,
habitacion VARCHAR2(20),
total NUMBER(10,2),
estado VARCHAR2(20) DEFAULT 'CONFIRMADA'
);

INSERT INTO reserva (huespednombre, fechaingreso, fecha_salida, habitacion, total)
VALUES ('Juan Perez', DATE '2025-11-01', DATE '2025-11-03', '101', 150.00);

INSERT INTO reserva (huespednombre, fechaingreso, fecha_salida, habitacion, total, estado)
VALUES ('María López', DATE '2025-11-05', DATE '2025-11-07', '202', 200.00, 'PENDIENTE');

COMMIT;

-- 1. Configuración general de la consola
SET LINESIZE 130 -- ancho suficiente para todas las columnas
SET PAGESIZE 50 -- filas por página antes de repetir encabezado
SET COLSEP '|' -- separador visual entre columnas
SET TRIMSPOOL ON -- elimina espacios al final de cada línea

-- 2. Definir formato de cada columna
COLUMN reservaid FORMAT 99999 HEADING 'IDRESERVA'
COLUMN huespednombre FORMAT A30 HEADING 'HUESPED'
COLUMN fecha
ingreso FORMAT A11 HEADING 'INGRESO' -- DD-MON-YYYY
COLUMN fecha_salida FORMAT A11 HEADING 'SALIDA' -- DD-MON-YYYY
COLUMN habitacion FORMAT A8 HEADING 'HAB.'
COLUMN total FORMAT 999,999.99 HEADING 'TOTAL'
COLUMN estado FORMAT A12 HEADING 'ESTADO'

-- 3. Consulta con los formatos aplicados
SELECT reservaid,
huesped
nombre,
TOCHAR(fechaingreso, 'DD-MON-YYYY') AS fechaingreso,
TO
CHAR(fechasalida, 'DD-MON-YYYY') AS fechasalida,
habitacion,
total,
estado
FROM reserva;


You'll only receive email when they publish something new.

More from 32502
All posts