Seguridad con Vistas en SQL

usando WITH CHECK OPTION

Este documento muestra cómo utilizar vistas con propósito de seguridad en bases de datos SQL, usando la cláusula WITH CHECK OPTION, y cómo configurar usuarios con acceso limitado a través de una vista segura.


🧱 1. Crear la tabla base

CREATE TABLE empleados (
    id INT PRIMARY KEY,
    nombre VARCHAR(100),
    departamento VARCHAR(50),
    salario DECIMAL(10,2)
);

👁 2. Crear la vista segura

CREATE VIEW vista_ventas AS
SELECT * FROM empleados
WHERE departamento = 'Ventas'
WITH CHECK OPTION;

Esta vista:

  • Permite consultar solo empleados del departamento “Ventas”
  • Impide insertar o modificar datos fuera de ese departamento

🧪 3. Ejemplos de INSERT

✅ Válidos (cumplen la condición)

INSERT INTO vista_ventas (id, nombre, departamento, salario)
VALUES (1, 'Ana Torres', 'Ventas', 4000.00);

INSERT INTO vista_ventas (id, nombre, departamento, salario)
VALUES (2, 'Luis Fernández', 'Ventas', 4200.00);

❌ Inválido (fallará por WITH CHECK OPTION)

INSERT INTO vista_ventas (id, nombre, departamento, salario)
VALUES (3, 'Carlos Gómez', 'Marketing', 3900.00);

Error esperado:

ERROR: new row violates check option for view "vista_ventas"

🔄 UPDATE bloqueado por seguridad

UPDATE vista_ventas
SET departamento = 'RRHH'
WHERE id = 1;

Esto fallará porque el resultado de la modificación saldría del conjunto definido por la vista.


👤 4. Crear un usuario restringido

CREATE USER usuario_ventas IDENTIFIED BY 'clave_segura';

🔐 5. Asignar permisos

❌ Revocar acceso directo a la tabla base

REVOKE ALL ON empleados FROM usuario_ventas;

✅ Conceder acceso a la vista

GRANT SELECT, INSERT, UPDATE ON vista_ventas TO usuario_ventas;

📋 Resumen

Objeto Permiso Usuario Efecto
empleados ❌ Ninguno usuario_ventas No puede ver, modificar ni consultar
vista_ventas ✅ SELECT/INSERT/UPDATE usuario_ventas Solo ve empleados de “Ventas”, y solo puede modificar/insertar respetando esa condición

🧪 Prueba como usuario

✅ Permitido:

INSERT INTO vista_ventas (id, nombre, departamento, salario)
VALUES (10, 'Laura Méndez', 'Ventas', 4100.00);

❌ Bloqueado:

INSERT INTO vista_ventas (id, nombre, departamento, salario)
VALUES (11, 'Marco Ruiz', 'Finanzas', 4300.00);

✅ Seguridad reforzada

  • Se evita que el usuario vea o modifique otros datos.
  • Solo puede trabajar con información que cumple las condiciones de la vista.

Diego J. Gonzalez