...

Seguridad y roles en SQL: crea y administra roles correctamente

La seguridad en una base de datos no se trata solo de proteger contraseñas.
Se trata de controlar quién puede hacer qué dentro del sistema: desde crear tablas hasta consultar datos sensibles.
Y en SQL, eso se logra con roles y permisos.

En este artículo aprenderás paso a paso cómo gestionar usuarios, roles y privilegios en PostgreSQL, aplicándolo sobre un mini sistema de ventas.


¿Qué es un rol en SQL?

En PostgreSQL, un rol puede representar tanto a un usuario individual como a un grupo de usuarios.
Los roles controlan el acceso a las operaciones y objetos dentro de la base de datos.

Por ejemplo:

  • Un usuario puede tener un rol que le permita solo leer datos (SELECT).
  • Otro puede tener permisos para modificar datos (INSERT, UPDATE, DELETE).
  • Y un tercero puede administrar todo el sistema (CREATE, DROP, GRANT).

Paso 1: Crear la base de datos y tablas

Usaremos una versión simplificada de un mini sistema de ventas.
Puedes ejecutarlo directamente en db-fiddle.com eligiendo PostgreSQL como motor.

CREATE TABLE clientes (
    id_cliente SERIAL PRIMARY KEY,
    nombre VARCHAR(100),
    email VARCHAR(100)
);

CREATE TABLE productos (
    id_producto SERIAL PRIMARY KEY,
    nombre VARCHAR(100),
    precio NUMERIC(10,2)
);

CREATE TABLE ventas (
    id_venta SERIAL PRIMARY KEY,
    id_cliente INT REFERENCES clientes(id_cliente),
    id_producto INT REFERENCES productos(id_producto),
    cantidad INT,
    fecha_venta DATE DEFAULT CURRENT_DATE
);

INSERT INTO clientes (nombre, email) VALUES
('Laura Pérez', 'laura@correo.com'),
('Carlos Ruiz', 'carlos@correo.com');

INSERT INTO productos (nombre, precio) VALUES
('Laptop', 15000.00),
('Mouse', 300.00);

INSERT INTO ventas (id_cliente, id_producto, cantidad)
VALUES (1, 1, 1), (2, 2, 3);

Paso 2: Crear roles y asignar permisos

Rol administrador

Puede crear tablas, usuarios y otorgar permisos.

CREATE ROLE rol_admin LOGIN PASSWORD 'admin123';
GRANT ALL PRIVILEGES ON DATABASE postgres TO rol_admin;

Rol de ventas

Puede consultar y registrar ventas, pero no modificar estructuras.

CREATE ROLE rol_ventas LOGIN PASSWORD 'ventas123';
GRANT CONNECT ON DATABASE postgres TO rol_ventas;
GRANT USAGE ON SCHEMA public TO rol_ventas;
GRANT SELECT, INSERT ON ALL TABLES IN SCHEMA public TO rol_ventas;

Rol de consulta

Solo puede leer datos.

CREATE ROLE rol_consulta LOGIN PASSWORD 'consulta123';
GRANT CONNECT ON DATABASE postgres TO rol_consulta;
GRANT USAGE ON SCHEMA public TO rol_consulta;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO rol_consulta;

Paso 3: Pruebas de acceso

Puedes verificar el comportamiento conectándote con cada rol en db-fiddle.com (usa el comando SET ROLE):

SET ROLE rol_consulta;
SELECT * FROM ventas; --  Permitido
INSERT INTO ventas (id_cliente, id_producto, cantidad) VALUES (1,2,1); -- Denegado
SET ROLE rol_ventas;
INSERT INTO ventas (id_cliente, id_producto, cantidad) VALUES (1,2,1); -- Permitido
ALTER TABLE ventas ADD COLUMN observacion TEXT; -- Denegado

Buenas prácticas

  • Nunca uses la cuenta de administrador para tareas diarias.
  • Crea roles específicos por función o área.
  • Usa “GRANT” y “REVOKE” para ajustar permisos de forma granular.
  • Audita los accesos periódicamente.

Diferencias entre motores SQL

MotorEquivalente a RolesParticularidades
PostgreSQLRoles y usuarios unificadosFlexible y jerárquico
SQL ServerLogins y usuarios por baseControl granular por esquema
MySQLUsuarios individualesNo existen roles hasta versiones recientes
SQLiteSin roles ni usuariosSeguridad delegada al sistema operativo

Conclusión

Definir roles es uno de los pilares de la seguridad en SQL.
Con una buena estructura de permisos, no solo proteges tus datos, también garantizas un acceso ordenado.

Deja un comentario

Seraphinite AcceleratorOptimized by Seraphinite Accelerator
Turns on site high speed to be attractive for people and search engines.