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

Alp*_*gay 21 security postgresql permissions database-permissions

我想为所有数据库中的所有表创建一个只具有select权限的用户.我以为我可以获取数据库列表并为每个数据库应用以下命令:

GRANT select ON DATABASE dbname to user1;
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

ERROR:  invalid privilege type SELECT for database
Run Code Online (Sandbox Code Playgroud)

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

IMS*_*SoP 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;
Run Code Online (Sandbox Code Playgroud)

PostgreSQL手册


a_h*_*ame 23

您无法在数据库级别执行此操作,仅在架构级别执行此操作.

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

GRANT SELECT ON ALL TABLES IN SCHEMA public TO user1;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO user;
Run Code Online (Sandbox Code Playgroud)

  • 是的 - 如果你知道postgres.我的猜测(对我来说也是如此)是很多对pg知识有限的人会发现这个Q&A.并非所有人都知道架构是特定于数据库的.另外,如果您只是通过`psql`连接,您可以发出上述命令而不会出现错误 - >这导致我假设GRANT已应用于安装范围:).也许只需添加`psql database_name`作为第一个命令.另一方面,这些评论可能足以满足其他人的要求:) (3认同)
  • 您将声明这将适用于新创建的表和视图是不正确的 - "ALL TABLES"只是在每个当前存在的表上运行GRANT SELECT的简写,并且不设置任何默认值.要设置新对象的默认值,您需要ALTER DEFAULT PRIVILEGES命令:http://www.postgresql.org/docs/current/static/sql-alterdefaultprivileges.html(请参阅下面的答案) (2认同)
  • 最初的问题是关于所有表和所有数据库的 SELECT 主题。这在 mysql 中是可能的,但(我认为)在 postgres 中是不可能的。在 postgres 中,必须独立地为每个数据库授予这些权限。也许您可以将其添加为澄清(或在可能的情况下纠正我)。 (2认同)