GRANT CHỌN cho tất cả các bảng trong postgresql


Câu trả lời:


144

Tôi nghĩ có thể hữu ích khi đề cập rằng, kể từ 9.0, postgres có cú pháp để cấp các đặc quyền trên tất cả các bảng (cũng như các đối tượng khác) trong một lược đồ:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO user;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO user;

Đây là liên kết .


Tôi sẽ sớm nâng cấp, vì vậy đây thực sự là một tin tốt. Cảm ơn!
Adam Matan

Điều này có ảnh hưởng đến tất cả các cơ sở dữ liệu trên máy chủ sử dụng lược đồ công cộng không?
kristianp

5
Nếu tôi tạo một bảng mới, người dùng này có quyền truy cập vào bảng vừa tạo không?
GuiSim

8
@GuiSim Không, Bạn phải đặt default privilegesmột lược đồ, trong đó ytou tạo bảng: postgresql.org/docs/civerse/static/
trộm

@kristianp Không, mọi cơ sở dữ liệu trong cụm PG đều có lược đồ công khai riêng. Nó ảnh hưởng đến tất cả các bảng (hàm) trong lược đồ publiccho DB hiện tại mà bạn được kết nối.
SkyRaT

11

Giải pháp của tôi (không phải là một lót):

#!/bin/bash

for table in `echo "SELECT schemaname || '.' || relname FROM pg_stat_user_tables;" | psql -A -t my_database_name`;
do
    echo "GRANT SELECT ON TABLE $table to my_new_user;"
    echo "GRANT SELECT ON TABLE $table to my_new_user;" | psql my_database_name
done

Chạy từ người dùng đặc quyền, nó hoạt động như một bùa mê.


3
Nếu bạn sử dụng pg_stat_user_tables thay vì all_tables, bạn không cần grep của mình ... Ngoài ra, hãy chuyển -A -t sang psql để thoát khỏi đầu ra được định dạng.
Magnus Hagander

1
Lưu ý rằng kể từ Postgres 9.0, cách tiếp cận của câu trả lời này đang thực hiện nó một cách khó khăn. Trong 9.x, bây giờ chúng ta có "TRÊN TẤT CẢ" được thấy trong câu trả lời khác này .
Basil Bourque

cái này không hoạt động trong đó tên bảng hoặc lược đồ chứa chữ in hoa. Thêm phiên bản sửa đổi bên dưới
anneb

9

Điều này có thể được thực hiện với một quá trình hai bước.

  1. Chạy truy vấn này:

    select 'grant all on '||schemaname||'.'||tablename||' to $foo;'
    from pg_tables where schemaname in ('$bar', '$baz')
    order by schemaname, tablename;
    

    Thay thế:

    $foo= tên người dùng bạn muốn cấp quyền cho
    $bar, $baz= lược đồ bạn muốn cấp quyền trong (có thể chỉ là "công khai")

  2. Điều đó sẽ cung cấp cho bạn một danh sách các truy vấn sẽ tạo ra các quyền cần thiết. Sao chép đầu ra, dán nó vào một truy vấn khác và thực hiện.


2

Đây là những gì tôi đã sử dụng:

psql dbname -tc "select 'grant select on '||relname||' to readonly;' from pg_stat_user_tables" | psql dbname

Tôi cảm thấy tự nhiên hơn khi thực hiện định dạng và mệnh đề trong sql ..


2

Tôi đã kết thúc việc này và nó đã hoạt động:

ALTER DEFAULT PRIVILEGES IN SCHEMA public 
GRANT SELECT ON TABLES TO PUBLIC;

1

Tôi đang làm việc với postgres 8.4 và để cung cấp tất cả các đặc quyền cho người dùng, hãy làm như sau:

#!/bin/bash

for table in `echo "SELECT schemaname||'.'||relname FROM pg_stat_all_tables WHERE schemaname NOT IN('pg_catalog','pg_toast','information_schema')" | psql -t db `;
do
    echo "grant select on table $table to my_new_user;"
    echo "grant select on table $table to my_new_user;" | psql db
done

1
Bằng tiếng Anh xin vui lòng.
Nán lại

0

một cách để khắc phục điều này là viết một thủ tục được lưu trữ. Thật không may, không có lệnh "cấp mọi thứ cho tất cả các bảng". bạn thực sự cần một thủ tục hoặc một số kịch bản shell bên ngoài có thể để thực hiện công việc này.


0

Kịch bản (giải pháp một lớp) của Adam Matan rất tuyệt vời khi có nhiều lược đồ, nhưng nó không hoạt động khi tên lược đồ hoặc tên bảng chứa chữ cái in hoa hoặc ký tự đặc biệt.

Phiên bản được sửa đổi:

#!/bin/bash

for table in `echo "SELECT '\"' || schemaname || '\".\"' || relname || '\"'  FROM pg_stat_user_tables;" | psql -A -t my_database_name`;
do
    echo "GRANT SELECT ON TABLE $table to my_new_user;"
    echo "GRANT SELECT ON TABLE $table to my_new_user;" | psql my_database_name
done
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.