Có một lớp lót mà cấp cho phép SELECT để một người dùng mới postgresql?
Một cái gì đó sẽ thực hiện mã giả sau đây:
GRANT SELECT ON TABLE * TO my_new_user;
Có một lớp lót mà cấp cho phép SELECT để một người dùng mới postgresql?
Một cái gì đó sẽ thực hiện mã giả sau đây:
GRANT SELECT ON TABLE * TO my_new_user;
Câu trả lời:
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 .
default privileges
một lược đồ, trong đó ytou tạo bảng: postgresql.org/docs/civerse/static/
public
cho DB hiện tại mà bạn được kết nối.
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ê.
Điều này có thể được thực hiện với một quá trình hai bước.
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")
Đ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.
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
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.
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