Como visualizar as permissões da tabela de um usuário?
Cenário 1: execute o comando information_schema.table_privileges para exibir as permissões de tabela de um usuário. Exemplo:
1
|
SELECT * FROM information_schema.table_privileges WHERE GRANTEE='user_name'; |
Coluna |
Tipos de dados |
Descrição |
---|---|---|
grantor |
sql_identifier |
Concedente da permissão |
grantee |
sql_identifier |
Beneficiário de permissão |
table_catalog |
sql_identifier |
Banco de dados onde a tabela é |
table_schema |
sql_identifier |
Esquema em que a tabela está |
table_name |
sql_identifier |
Nome da tabela |
privilege_type |
character_data |
Tipo da permissão concedida. O valor pode ser SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, ANALYZE, VACUUM, ALTER, DROP ou TRIGGER. |
is_grantable |
yes_or_no |
Indica se a permissão pode ser concedida a outros usuários. YES indica que a permissão pode ser concedida a outros usuários e NO indica que a permissão não pode ser concedida a outros usuários. |
with_hierarchy |
yes_or_no |
Indica se operações específicas podem ser herdadas no nível da tabela. Se a operação específica for SELECT, YES será exibido. Caso contrário, NO será exibido. |
Na figura anterior, o usuário u2 tem todas as permissões da tabela t2 no esquema u2 e a permissão SELECT da tabela t1 no esquema u1.
information_schema.table_privileges pode consultar apenas as permissões concedidas diretamente ao usuário, a função has_table_privilege() pode consultar tanto permissões concedidas diretamente quanto permissões indiretas (obtidas pela função GRANT para o usuário). Por exemplo:
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) |