2011-09-07 35 views
52

Làm cách nào tôi có thể truy vấn tất cả GRANTS được cấp cho một đối tượng trong postgres?Trợ cấp truy vấn cho một bảng trong postgres

Ví dụ tôi có bảng "mytable":

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

Tôi cần somthing mà mang lại cho tôi:

user1: SELECT, INSERT 
user2: UPDATE 

Trả lời

59

Tôi đã tìm thấy nó:

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

\z mytable từ psql cung cấp cho bạn tất cả các khoản tài trợ từ một bảng, nhưng bạn muốn sau đó phải chia nó ra bởi người dùng cá nhân.

+0

bạn sẽ chạy này trực tiếp từ cửa sổ sql hoặc dòng lệnh pg? –

+1

@ DanielL.VanDenBosch: tất cả các lệnh meta, như '\ z', là dành cho psql. Và psql là giao diện dòng lệnh cho PostgreSQL. –

18

Nếu bạn thực sự muốn một dòng cho mỗi người dùng, bạn có thể nhóm bằng được cấp (yêu cầu PG9 + cho string_agg)

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

này nên đầu ra một cái gì đó như:

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

Hầu như những gì tôi muốn, tôi có thể có chính xác 'GRANT' s như pg_dump kết quả đầu ra? – brauliobo

8

Hãy thử truy vấn bên dưới. Nó sẽ cung cấp cho bạn danh sách tất cả người dùng và quyền của họ trên bảng.

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

Đây là câu trả lời duy nhất ở đây tính các quyền thu được từ tư cách thành viên trong các vai trò khác, do đó, nó nhận được phiếu bầu của tôi. Mặt khác, tôi sẽ nói 'has_table_privilege (tên người dùng, liên hệ (schemaname, '.', Tablename), ...)' để tránh sự mơ hồ. –

+0

Plus One - Đây là GOLD PURE! – Daniel

0

Đây là tập lệnh tạo truy vấn cấp cho một bảng cụ thể. Nó bỏ qua các đặc quyền của chủ sở hữu.

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

Truy vấn này sẽ liệt kê tất cả các bảng trong tất cả các cơ sở dữ liệu và lược đồ (bỏ ghi chú dòng (s) trong mệnh đề WHERE để lọc cho cụ cơ sở dữ liệu, lược đồ, hoặc bảng), với những đặc quyền thể hiện trong trật tự để nó dễ dàng để xem nếu một đặc ân cụ thể được cấp hay không: sản lượng

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; 

mẫu:

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 | 
... 
Các vấn đề liên quan