Roles y privilegios
Conceda y revoque acceso con GRANT y REVOKE
Roles y privilegios es una lección gratuita de SQL Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de SQL Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Academy incluye 4 lecciones en total.
¿Qué son los roles y los privilegios?
En SQL, los roles son grupos con nombre de privilegios que pueden asignarse a los usuarios. Los privilegios controlan qué acciones puede realizar un usuario o rol sobre objetos de la base de datos, como tablas, vistas y funciones.
En lugar de conceder permisos a cada usuario individualmente, puede crear un rol con los privilegios necesarios y asignarlo después a varios usuarios a la vez. Esto facilita considerablemente la gestión del control de acceso a gran escala.
Crear un rol
Utilice CREATE ROLE para definir un rol nuevo en PostgreSQL. Un rol puede representar a un solo usuario o a un grupo de usuarios, según cómo lo configure.
De forma predeterminada, los roles se crean sin privilegios; debe concederles explícitamente acceso a los objetos.
CREATE ROLE readonly_user;
CREATE ROLE app_writer;
CREATE ROLE db_admin;Conceder privilegios sobre tablas
La instrucción GRANT concede a un rol o usuario permiso para realizar operaciones específicas sobre un objeto de la base de datos. Entre los privilegios habituales a nivel de tabla se incluyen SELECT, INSERT, UPDATE y DELETE.
Puede conceder un solo privilegio o varios a la vez, separándolos mediante comas.
-- Grant SELECT only (read-only role)
GRANT SELECT ON employees TO readonly_user;
-- Grant multiple privileges
GRANT SELECT, INSERT, UPDATE ON orders TO app_writer;Conceder todos los privilegios
Si un rol necesita acceso completo a una tabla, puede usar GRANT ALL PRIVILEGES en lugar de enumerar cada permiso individualmente. Esto concede todos los privilegios aplicables sobre el objeto especificado.
Tenga cuidado con ALL PRIVILEGES: concédalo únicamente a los roles que realmente necesiten control total sobre el objeto.
-- Grant full access to db_admin on a table
GRANT ALL PRIVILEGES ON employees TO db_admin;
-- Or the shorthand form
GRANT ALL ON orders TO db_admin;Revocar privilegios
La instrucción REVOKE elimina los privilegios concedidos previamente a un rol o usuario. Así puede restringir el acceso cuando cambien los requisitos o cuando un rol ya no necesite determinados permisos.
Después de ejecutar un REVOKE, el rol afectado pierde inmediatamente el privilegio especificado sobre el objeto indicado.
-- Remove UPDATE access from app_writer
REVOKE UPDATE ON orders FROM app_writer;
-- Remove all privileges from a role
REVOKE ALL PRIVILEGES ON employees FROM readonly_user;Asignar un rol a un usuario
En PostgreSQL, los usuarios también son roles: un rol con el atributo LOGIN puede conectarse a la base de datos. Puede asignar un rol de grupo a un rol de inicio de sesión mediante GRANT role TO user.
Una vez asignado, el usuario hereda todos los privilegios pertenecientes a ese rol, lo que facilita la gestión de permisos para varios usuarios a la vez.
-- Create a login user
CREATE ROLE alice WITH LOGIN PASSWORD 'secret123';
-- Assign the readonly role to alice
GRANT readonly_user TO alice;
-- Alice can now SELECT on tables granted to readonly_userRevocar un rol a un usuario
Para eliminar la asignación de un rol a un usuario, utilice REVOKE role FROM user. Después de hacerlo, el usuario dejará de heredar los privilegios asociados a ese rol.
Esto resulta útil cuando un empleado cambia de responsabilidades o deja la organización: puede revocar su rol sin modificar las definiciones de privilegios propias del rol.
-- Remove the readonly role from alice
REVOKE readonly_user FROM alice;
-- Alice no longer has SELECT on tables via that rolePrivilegios a nivel de esquema
Antes de que un rol pueda acceder a cualquier objeto dentro de un esquema, necesita el privilegio USAGE sobre dicho esquema. Sin él, incluso un rol con SELECT sobre una tabla específica no puede leer los datos porque no puede resolver la ruta del esquema.
Conceda siempre USAGE sobre el esquema junto con los privilegios a nivel de objeto.
-- Allow readonly_user to see inside the public schema
GRANT USAGE ON SCHEMA public TO readonly_user;
-- Then grant table-level privilege
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly_user;Privilegios predeterminados para objetos futuros
Cuando se crean tablas nuevas en un esquema, los roles existentes no obtienen acceso a ellas automáticamente. Utilice ALTER DEFAULT PRIVILEGES para garantizar que los objetos futuros creados por un rol específico sean accesibles automáticamente para otro rol.
Esto evita un problema habitual: una tabla recién creada queda invisible para los roles de la aplicación hasta que alguien recuerda ejecutar GRANT manualmente.
-- Future tables created by the current user will be SELECTable by readonly_user
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO readonly_user;
-- Future tables will allow INSERT/UPDATE/DELETE for app_writer
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO app_writer;La opción WITH GRANT OPTION
De forma predeterminada, un rol que recibe un privilegio no puede concedérselo a otros roles. Añadir WITH GRANT OPTION permite al destinatario conceder también ese privilegio a otras personas.
Utilícelo con cuidado: el rol se convierte en un punto de delegación de confianza para el control de acceso, lo que puede complicar las auditorías si se usa en exceso.
-- app_writer can now grant SELECT on orders to other roles
GRANT SELECT ON orders TO app_writer WITH GRANT OPTION;
-- app_writer can then do:
-- GRANT SELECT ON orders TO reporting_role;Consultar los privilegios concedidos
PostgreSQL almacena la información sobre los privilegios en vistas del catálogo del sistema. Puede consultar information_schema.role_table_grants para ver qué roles tienen concedidos qué privilegios sobre qué tablas.
El comando de barra inversa \dp tablename de psql también muestra la lista de privilegios de acceso de una tabla en un formato compacto.
-- List all table-level grants in the current database
SELECT grantee, table_schema, table_name, privilege_type
FROM information_schema.role_table_grants
WHERE table_schema = 'public'
ORDER BY grantee, table_name;Comprobación rápida
Compruebe cuánto ha entendido sobre los roles y los privilegios en SQL.
Repaso: roles y privilegios
En esta lección aprendió cómo gestiona SQL el control de acceso mediante roles y privilegios:
- CREATE ROLE define un rol nuevo o una cuenta de usuario
- GRANT asigna privilegios (SELECT, INSERT, UPDATE, DELETE, ALL) sobre objetos a un rol
- REVOKE elimina esos privilegios
- GRANT role TO user asigna un rol de grupo a un usuario de inicio de sesión para que herede sus privilegios
- Los roles necesitan USAGE sobre el esquema antes de poder acceder a los objetos que contiene
- ALTER DEFAULT PRIVILEGES garantiza que los objetos futuros sean accesibles automáticamente
- WITH GRANT OPTION permite al destinatario delegar el privilegio a su vez
Mantener los privilegios al mínimo y basarlos en roles es un principio fundamental del diseño seguro de bases de datos: conceda solo lo necesario y revoque los privilegios rápidamente cuando ya no sean necesarios.
Preguntas frecuentes
¿La lección «Roles y privilegios» es gratis?
Sí — el texto completo de «Roles y privilegios» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de SQL Academy, actualiza a CoddyKit PRO. El curso de SQL Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Roles y privilegios»?
Conceda y revoque acceso con GRANT y REVOKE Practicas SQL Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar SQL Academy?
No se requiere experiencia previa. SQL Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.
¿Cuánto tiempo toma la lección «Roles y privilegios»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de SQL Academy?
Sí. Cada lección de SQL Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Roles y privilegios
- Políticas de seguridad a nivel de fila
- Permisos a nivel de columna
- Auditoría de accesos