it-swarm-vi.tech

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

Có một lớp lót nào cấp quyền CHỌN cho người dùng mới postgresql không?

Một cái gì đó sẽ thực hiện mã giả sau đây:

GRANT SELECT ON TABLE * TO my_new_user;
94
Adam Matan

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 liên kết .

153
TimH

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 nét duyên dáng.

12
Adam Matan

Đ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.

9
Ben Williams

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

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

Đâ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
stox

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
wilson

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
0
anneb

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ố tập lệnh Shell bên ngoài có thể để thực hiện công việc này.

0
postgresql007