OracleXE21 Dell
November 5, 2025•555 words
¿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 pruebahostal 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,
huespednombre VARCHAR2(100) NOT NULL,
fechaingreso DATE NOT NULL,
fechasalida 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 fechaingreso 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,
huespednombre,
TOCHAR(fechaingreso, 'DD-MON-YYYY') AS fechaingreso,
TOCHAR(fechasalida, 'DD-MON-YYYY') AS fechasalida,
habitacion,
total,
estado
FROM reserva;