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
| Motor | Equivalente a Roles | Particularidades |
|---|---|---|
| PostgreSQL | Roles y usuarios unificados | Flexible y jerárquico |
| SQL Server | Logins y usuarios por base | Control granular por esquema |
| MySQL | Usuarios individuales | No existen roles hasta versiones recientes |
| SQLite | Sin roles ni usuarios | Seguridad 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.