30

我想为所有数据库中的所有表创建一个只有选择权限的用户。我认为我可以获得数据库列表并为每个数据库应用以下命令:

GRANT select ON DATABASE dbname to user1;

但我收到以下错误:

ERROR:  invalid privilege type SELECT for database

当我用谷歌搜索时,人们建议grant select对所有表进行操作。但是总是在添加新表。所以这对我来说不是一个可以接受的解决方案。有谁知道任何解决方法?

4

6 回答 6

31

您不能在数据库级别执行此操作,只能在架构级别执行此操作。

假设您只使用public每个数据库中的模式,您可以这样做:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO user1;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO user;
于 2011-06-23T13:05:36.960 回答
31

您需要做两件事:首先,允许访问现有对象;其次,为从现在开始创建的新对象设置默认访问权限。

请注意,授予对“TABLES”的访问权限包括视图,但不包括序列(例如“SERIAL”列的自动增量功能),因此您可能也希望授予对这些的访问权限。

下面假设您想​​要在public架构中执行所有操作。该语句可以通过省略子句ALTER DEFAULT PRIVILEGES作用于整个数据库;IN SCHEMA ...必须GRANT为每个模式运行一次。

-- 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 手册

于 2011-11-23T18:10:17.107 回答
4

我意识到你已经说过这不是一个可以接受的答案,但无论如何这是正确的答案。

指定安全性(GRANT 和 REVOKE)是表设计和测试的一部分。

在表定义、安全性、测试和测试数据处于版本控制之下之前,不要将表移至生产环境。

话虽如此,PostgreSQL 对数据库没有任何 SELECT 权限。您只能授予对数据库的 CREATE、CONNECT 或 TEMP 权限。

您可以在给定架构中的所有表上授予 SELECT 权限。我不知道这对运行 GRANT 语句后创建的表有何影响,但测试起来相当容易。

PostgreSQL 授予语法

于 2011-06-23T11:40:35.263 回答
3

对于低于 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
于 2012-10-05T11:50:53.117 回答
2

我执行以下步骤来创建只读用户:

创建你的用户:

1. createuser --interactive --pwprompt

转到 your_databases 中的 postgresql:

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;
于 2020-04-20T11:50:50.850 回答
0

尝试:

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;
于 2021-06-01T08:14:31.400 回答