2011-09-07 57 views
52

如何查詢授予postgres中的對象的所有授予?postgres中的表的查詢授予

例如,我有表 「MYTABLE」:

GRANT SELECT, INSERT ON mytable TO user1 
GRANT UPDATE ON mytable TO user2 

我需要財產以後,給了我:

user1: SELECT, INSERT 
user2: UPDATE 

回答

59

我已經找到它:

SELECT grantee, privilege_type 
FROM information_schema.role_table_grants 
WHERE table_name='mytable' 
71

\z mytable在psql給你所有從表中的授權,但你那麼必須由個人用戶分割它。

+0

你會從SQL窗格或PG命令行直接運行呢? –

+1

@ DanielL.VanDenBosch:所有的元命令,比如'\ z',都是用於psql的。而psql是PostgreSQL的命令行界面。 –

18

如果你真的想每個用戶一行,您可以通過受贈組(需要PG9 +爲string_agg)

SELECT grantee, string_agg(privilege_type, ', ') AS privileges 
FROM information_schema.role_table_grants 
WHERE table_name='mytable' 
GROUP BY grantee; 

這應該輸出類似:

grantee | privileges 
---------+---------------- 
user1 | INSERT, SELECT 
user2 | UPDATE 
(2 rows) 
+1

幾乎我想要的,我可以有像'pg_dump輸出一樣的'GRANT'嗎? – brauliobo

8

請嘗試以下的查詢。它會給你所有用戶及其在桌面上的權限列表。

select a.tablename,b.usename,HAS_TABLE_PRIVILEGE(usename,tablename, 'select') as select, 
    HAS_TABLE_PRIVILEGE(usename,tablename, 'insert') as insert, 
    HAS_TABLE_PRIVILEGE(usename,tablename, 'update') as update, 
    HAS_TABLE_PRIVILEGE(usename,tablename, 'delete') as delete, 
    HAS_TABLE_PRIVILEGE(usename,tablename, 'references') as references from pg_tables a , pg_user b 
where a.tablename='your_table_name'; 
+1

這是計算從其他角色的成員身份獲得的權限的唯一答案,因此它可以獲得我的投票。另一方面,我會說'has_table_privilege(usename,contact(schemaname,'。',tablename),...)'以避免含糊不清。 –

+0

加一 - 這是純金! – Daniel

0

這是一個爲特定表生成授權查詢的腳本。它省略了所有者的權限。

SELECT 
    format (
     'GRANT %s ON TABLE %I.%I TO %I%s;', 
     string_agg(tg.privilege_type, ', '), 
     tg.table_schema, 
     tg.table_name, 
     tg.grantee, 
     CASE 
     WHEN tg.is_grantable = 'YES' 
     THEN ' WITH GRANT OPTION' 
     ELSE '' 
     END 
    ) 
    FROM information_schema.role_table_grants tg 
    JOIN pg_tables t ON t.schemaname = tg.table_schema AND t.tablename = tg.table_name 
    WHERE 
    tg.table_schema = 'myschema' AND 
    tg.table_name='mytable' AND 
    t.tableowner <> tg.grantee 
    GROUP BY tg.table_schema, tg.table_name, tg.grantee, tg.is_grantable; 
2

該查詢將列出所有的表中的所有數據庫和模式的(取消對WHERE子句中的線(或多個)用於過濾特定的數據庫,模式,或表),並在所示的特權爲了使人們很容易看到,如果一個特定的權限授予與否:

SELECT grantee 
     ,table_catalog 
     ,table_schema 
     ,table_name 
     ,string_agg(privilege_type, ', ' ORDER BY privilege_type) AS privileges 
FROM information_schema.role_table_grants 
WHERE grantee != 'postgres' 
-- and table_catalog = 'somedatabase' /* uncomment line to filter database */ 
-- and table_schema = 'someschema' /* uncomment line to filter schema */ 
-- and table_name = 'sometable' /* uncomment line to filter table */ 
GROUP BY 1, 2, 3, 4; 

輸出示例:

grantee |table_catalog |table_schema |table_name  |privileges  | 
--------|----------------|--------------|---------------|---------------| 
PUBLIC |adventure_works |pg_catalog |pg_sequence |SELECT   | 
PUBLIC |adventure_works |pg_catalog |pg_sequences |SELECT   | 
PUBLIC |adventure_works |pg_catalog |pg_settings |SELECT, UPDATE | 
...