Permisos a nivel de columna
Oculte las columnas sensibles
Permisos a nivel de columna es una lección gratuita de SQL Academy en CoddyKit. Esta es la lección 3 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.
Por qué son importantes los permisos a nivel de columna
No todos los usuarios deberían poder ver todas las columnas de una tabla. Una columna salary, un password_hash o un credit_card_number pueden estar en la misma tabla que datos completamente públicos, como un nombre de usuario o un correo electrónico.
Los permisos a nivel de columna permiten conceder acceso a columnas específicas en lugar de a toda la tabla, manteniendo ocultos los datos confidenciales para los usuarios que no tienen un motivo legítimo para verlos.
GRANT sobre una tabla completa
De forma predeterminada, GRANT SELECT ON table permite que un rol lea todas las columnas. Esto está bien para los datos públicos, pero resulta problemático cuando la tabla combina columnas confidenciales y no confidenciales.
La consulta siguiente proporciona al rol analyst acceso completo de lectura a la tabla employees, incluidos el salario y el SSN.
GRANT SELECT ON employees TO analyst;Sintaxis de GRANT a nivel de columna
PostgreSQL (y SQL estándar) permite enumerar nombres de columnas específicos dentro de una instrucción GRANT. La sintaxis es:
GRANT privilege (col1, col2) ON table TO role;
El ejemplo siguiente concede al rol analyst permiso para leer únicamente id, name y department, pero NO salary ni ssn.
GRANT SELECT (id, name, department) ON employees TO analyst;Comprobación de los permisos de columna
Puede consultar los privilegios a nivel de columna en PostgreSQL mediante la vista information_schema.column_privileges. Esta indica qué concesionario tiene qué privilegio sobre qué columna.
SELECT grantee, table_name, column_name, privilege_type
FROM information_schema.column_privileges
WHERE table_name = 'employees'
ORDER BY grantee, column_name;Qué ocurre sin las columnas adecuadas
Si un rol intenta leer una columna cuyo acceso no se le ha concedido, la base de datos devuelve un error de permiso denegado. Solo se podrán ejecutar correctamente las referencias a columnas permitidas.
Suponiendo que a analyst solo se le concedieron id, name y department, la primera consulta falla y la segunda se ejecuta correctamente.
-- This will fail for analyst (no permission on salary):
-- SELECT id, name, salary FROM employees;
-- This succeeds:
SELECT id, name, department FROM employees;Permisos UPDATE a nivel de columna
Las restricciones a nivel de columna también se aplican a UPDATE. Puede permitir que un rol actualice únicamente columnas específicas; por ejemplo, permitir que un rol de soporte actualice el status de un usuario sin que pueda cambiar su email o password_hash.
GRANT UPDATE (status) ON users TO helpdesk;
-- helpdesk can now run:
UPDATE users SET status = 'suspended' WHERE id = 42;Ocultar columnas mediante vistas
Otro enfoque habitual consiste en crear una vista que exponga únicamente las columnas seguras y, después, conceder acceso a la vista en lugar de a la tabla base. Esto funciona en todas las bases de datos, no solo en las que admiten GRANT a nivel de columna.
CREATE VIEW public_employees AS
SELECT id, name, department, hire_date
FROM employees;
GRANT SELECT ON public_employees TO analyst;Revocación del acceso a nivel de columna
Al igual que GRANT, puede usar REVOKE con una lista de columnas para eliminar el acceso a columnas específicas. Si un rol tenía acceso general a nivel de tabla, es posible que primero deba revocarlo por completo antes de concederle acceso restringido a nivel de columna.
-- Remove all SELECT on the table first
REVOKE SELECT ON employees FROM analyst;
-- Then grant only safe columns
GRANT SELECT (id, name, department) ON employees TO analyst;Permisos de columna y seguridad a nivel de fila juntos
Los permisos a nivel de columna y Row-Level Security (RLS) son complementarios. RLS controla qué filas puede ver un usuario; los permisos a nivel de columna controlan qué columnas de esas filas son visibles.
Juntos forman un potente control de acceso bidimensional: restringen el conjunto de filas Y ocultan los campos confidenciales dentro de cada fila.
-- RLS policy: employees can see only their own row
CREATE POLICY own_row ON employees
FOR SELECT
USING (user_id = current_user_id());
-- Column grant: hide salary even for own row
GRANT SELECT (id, name, department) ON employees TO employee_role;Uso de funciones SECURITY DEFINER
Cuando necesita una lógica detallada que vaya más allá de simples listas de columnas, una función SECURITY DEFINER puede servir de puente. La función se ejecuta con los privilegios de su propietario (que tiene acceso completo a las columnas) y devuelve únicamente lo que decide exponer, independientemente de quién la invoque.
CREATE OR REPLACE FUNCTION get_employee_summary(emp_id INT)
RETURNS TABLE(id INT, name TEXT, department TEXT)
SECURITY DEFINER
LANGUAGE sql AS
$$
SELECT id, name, department
FROM employees
WHERE id = emp_id;
$$;
GRANT EXECUTE ON FUNCTION get_employee_summary(INT) TO analyst;Diseño práctico: seguridad de columnas por capas
Un patrón sólido para producción combina tres capas:
- Propiedad de la tabla — solo la cuenta de servicio de la aplicación es propietaria de la tabla base.
- Vistas o GRANTs de columna — los roles de lectura solo tienen acceso a las columnas no confidenciales.
- Columnas de auditoría — registran, mediante triggers, qué usuario accedió a los datos confidenciales y en qué momento.
Esto garantiza que, aunque un rol tenga accidentalmente demasiados privilegios en una capa, las demás capas sigan protegiendo los datos.
-- Layer 1: revoke public access
REVOKE ALL ON employees FROM PUBLIC;
-- Layer 2: expose safe columns via view
CREATE VIEW employee_public AS
SELECT id, name, department, hire_date FROM employees;
GRANT SELECT ON employee_public TO reporting_role;
-- Layer 3: audit trigger logs sensitive field reads (pseudocode)
-- CREATE TRIGGER audit_salary AFTER SELECT ON employees ...Comprobación rápida
¿Qué instrucción SQL concede correctamente al rol hr_viewer la capacidad de leer únicamente las columnas name y department de la tabla employees?
Resumen: permisos a nivel de columna
Los permisos a nivel de columna permiten restringir el acceso a campos individuales en lugar de a tablas completas, manteniendo ocultos para los roles sin privilegios los datos confidenciales, como salarios, SSN y hashes de contraseñas.
Conclusiones clave:
- Use
GRANT SELECT (col1, col2) ON table TO rolepara restringir las columnas que se pueden leer. - Use
REVOKEcon una lista de columnas para eliminar el acceso a columnas específicas. - Las vistas son una alternativa portable que funciona en todas las bases de datos.
- Combine los permisos a nivel de columna con RLS para implementar un control de acceso bidimensional.
- Las funciones SECURITY DEFINER proporcionan un filtrado de columnas programático con lógica adicional.
Aplicada de forma coherente, la seguridad a nivel de columna es una de las maneras más sencillas y eficaces de aplicar el principio de mínimo privilegio en la capa de datos.
Preguntas frecuentes
¿La lección «Permisos a nivel de columna» es gratis?
Sí — el texto completo de «Permisos a nivel de columna» 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 «Permisos a nivel de columna»?
Oculte las columnas sensibles 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 3 de 4.
¿Cuánto tiempo toma la lección «Permisos a nivel de columna»?
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