如何在Postgresql中为所有数据库创建具有只读权限的用户?

时间:2011-06-23 10:59:32

标签: security postgresql permissions database-permissions

我想创建一个只对所有数据库中的所有表都有select权限的用户。我以为我可以得到一个数据库列表,并为每个数据库应用以下命令:

GRANT select ON DATABASE dbname to user1;

但是我收到了以下错误:

ERROR:  invalid privilege type SELECT for database

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

6 个答案:

答案 0 :(得分:24)

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

请注意,授予对“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手册

答案 1 :(得分:22)

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

假设您只在每个数据库中使用public架构,则可以执行以下操作:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO user1;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO user;

答案 2 :(得分:4)

我知道你已经说过这不是一个可接受的答案,但无论如何这都是正确的答案。

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

在表定义,安全性,测试和测试数据受版本控制之前,不要将表移动到生产中。

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

您可以在给定架构中的所有表上授予SELECT。我不知道如何影响在运行GRANT语句后创建的表,但它很容易测试。

PostgreSQL Grant syntax

答案 3 :(得分: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

答案 4 :(得分:2)

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

创建您的用户:

2. psql your_database                      

转到your_database中的PostgreSQL:

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;

定义默认访问权限:

{{1}}

答案 5 :(得分: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;