我想创建一个只能在所有数据库的所有表上进行选择操作的用户。我认为我可以获取数据库列表,并针对每个数据库应用以下命令:
GRANT select ON DATABASE dbname to user1;
但是我得到了以下错误:
ERROR: invalid privilege type SELECT for database
当我谷歌搜索时,有人建议对所有表执行 grant select
操作。但新的表总是在不断添加。所以这对我来说不是一个可接受的解决方案。有人知道任何解决方法吗?
我想创建一个只能在所有数据库的所有表上进行选择操作的用户。我认为我可以获取数据库列表,并针对每个数据库应用以下命令:
GRANT select ON DATABASE dbname to user1;
但是我得到了以下错误:
ERROR: invalid privilege type SELECT for database
当我谷歌搜索时,有人建议对所有表执行 grant select
操作。但新的表总是在不断添加。所以这对我来说不是一个可接受的解决方案。有人知道任何解决方法吗?
-- Grant access to current tables and views
GRANT SELECT ON ALL TABLES IN SCHEMA public TO user1;
-- Now make sure that's also available on new tables and views by default
ALTER DEFAULT PRIVILEGES
IN SCHEMA public -- omit this line to make a default across all schemas
GRANT SELECT
ON TABLES
TO user1;
-- Now do the same for sequences
GRANT SELECT, USAGE ON ALL SEQUENCES IN SCHEMA public TO user1;
ALTER DEFAULT PRIVILEGES
IN SCHEMA public -- omit this line to make a default across all schemas
GRANT SELECT, USAGE
ON SEQUENCES
TO user1;
PostgreSQL手册
grant usage on schema public to user1;
。 - Sam Saffron\c mydatabase;
进行连接。只有user1
才能访问mydatabase
。 - jerrymouse你无法在数据库级别上实现此功能,只能在模式级别上实现。
假设你只在每个数据库中使用public
模式,那么你可以这样做:
GRANT SELECT ON ALL TABLES IN SCHEMA public TO user1;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO user;
psql
连接,你可以发出上述命令而不会出错 -> 这让我认为GRANT是应用于安装范围内的 :). 也许可以将 psql database_name
添加为第一个命令。另一方面,这些评论可能已经足够其他人使用了 :) - Michael对于低于9.0版本的Postgres:
psql -d DBNAME -qAt -c "SELECT 'GRANT SELECT ON ' || tablename || ' TO USER;'
FROM pg_tables WHERE schemaname = 'public'" | psql -d DBNAME
psql -d DBNAME -qAt -c "SELECT 'GRANT SELECT ON ' || viewname || ' TO USER;'
FROM pg_views WHERE schemaname = 'public'" | psql -d DBNAME
psql -d DBNAME -qAt -c "SELECT 'GRANT SELECT ON ' || relname || ' TO USER;'
FROM pg_statio_all_sequences WHERE schemaname = 'public'" | psql -d DBNAME
psql -d DBNAME -qAt -c "SELECT 'GRANT SELECT ON ' || relname || ' TO USER;' FROM pg_statio_all_tables WHERE schemaname = 'public'" | psql -d DBNAME
- tymik我知道你已经说过这不是一个可接受的答案,但它仍然是正确的答案。
指定安全性(GRANT和REVOKE)是表设计和测试的一部分。
在表定义、安全性、测试和测试数据都处于版本控制之前,不要将表移动到生产环境中。
话虽如此,PostgreSQL没有对数据库进行任何SELECT权限。您只能在数据库上授予CREATE、CONNECT或TEMP权限。
您可以在给定模式中授予所有表的SELECT权限。我不知道运行GRANT语句后创建的表会受到什么影响,但这很容易测试。
1. createuser --interactive --pwprompt
2. psql your_database
3. GRANT SELECT ON ALL TABLES IN SCHEMA public TO your_user;
4. ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO your_user;
CREATE USER your_readonly_user WITH PASSWORD 'changeme';
GRANT pg_read_all_data TO your_readonly_user;
尝试:
CREATE USER readonly WITH ENCRYPTED PASSWORD 'yourpassword';
GRANT CONNECT ON DATABASE <database_name> to readonly;
GRANT USAGE ON SCHEMA public to readonly;
GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;