¿Cómo puedo ver los permisos de tabla de un usuario?
Escenario 1: Ejecute el comando information_schema.table_privileges a view the table permissions of a user. Por ejemplo:
1
|
SELECT * FROM information_schema.table_privileges WHERE GRANTEE='user_name'; |
Columna |
Tipo de datos |
Descripción |
---|---|---|
grantor |
sql_identifier |
Concedidor de permisos |
grantee |
sql_identifier |
Concesionario del permiso |
table_catalog |
sql_identifier |
Base de datos donde se encuentra la tabla |
table_schema |
sql_identifier |
Esquema donde se encuentra la tabla |
table_name |
sql_identifier |
Nombre de la tabla |
privilege_type |
character_data |
Tipo de permiso concedido. El valor puede ser SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, ANALYZE, VACUUM, ALTER, DROP o TRIGGER. |
is_grantable |
yes_or_no |
Indica si el permiso se puede conceder a otros usuarios. YES indica que el permiso se puede conceder a otros usuarios, y NO indica que el permiso no se puede conceder a otros usuarios. |
with_hierarchy |
yes_or_no |
Indica si se permiten operaciones específicas heredadas en el nivel de tabla. Si la operación específica es SELECT, se muestra YES. De lo contrario, se muestra NO. |
En la figura anterior, el usuario u2 tiene todos los permisos de la tabla t2 en el esquema u2 y el permiso SELECT de la tabla t1 en el esquema u1.
information_schema.table_privileges solo puede consultar los permisos concedidos directamente al usuario, la función has_table_privilege() puede consultar tanto los permisos concedidos directamente como los permisos indirectos (obtenidos por el rol de GRANT al usuario). Por ejemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
CREATE TABLE t1 (c1 int); CREATE USER u1 password '********'; CREATE USER u2 password '********'; GRANT dbadmin to u2; //Indirectly grant permissions through roles. GRANT SELECT on t1 to u1; // Directly grant the permission. SET ROLE u1 password '********'; SELECT * FROM public.t1; // Directly grant the permission to access the table. c1 ---- (0 rows) SET ROLE u2 password '********'; SELECT * FROM public.t1; // Indirectly grant the permission to access the table. c1 ---- (0 rows) RESET role; //Switch back to dbadmin. SELECT * FROM information_schema.table_privileges WHERE table_name = 't1'; // Can only view direct grants. grantor | grantee | table_catalog | table_schema | table_name | privilege_type | is_grantable | with_hierarchy ---------+------------+---------------+--------------+------------+----------------+--------------+---------------- dbadmin | u1 | gaussdb | public | t1 | SELECT | NO | YES (1 rows) SELECT has_table_privilege('u2', 'public.t1', 'select'); // Can view both direct and indirect grants. has_table_privilege --------------------- t (1 row) |
Escenario 2: Para check whether a user has permissions on a table, realice los siguientes pasos: