为数据库上的用户授予所有权限

Die*_*ego 176 sql postgresql privileges ddl grant

我想为用户提供数据库的所有权限,而不是将其作为管理员.我想这样做的原因是,目前DEV和PROD是同一集群上的不同DB,因此我不希望用户能够更改生产对象,但它必须能够更改DEV上的对象.

我试过了:

grant ALL on database MY_DB to group MY_GROUP;
Run Code Online (Sandbox Code Playgroud)

但它似乎没有给予任何许可.

然后我尝试了:

grant all privileges on schema MY_SCHEMA to group MY_GROUP;
Run Code Online (Sandbox Code Playgroud)

它似乎允许我创建对象,但不允许查询属于其他用户的该架构上的\ delete对象

我可以继续在MY_SCHEMA上向用户授予USAGE权限,但是它会抱怨没有权限在桌子上......

所以我想我的问题是:是否有任何简单的方法可以在数据库上为用户提供所有权限?

我正在研究PostgreSQL 8.1.23.

Erw*_*ter 225

用户显然需要访问数据库:

GRANT CONNECT ON DATABASE my_db TO my_user;
Run Code Online (Sandbox Code Playgroud)

并且(至少)USAGE架构的特权:

GRANT USAGE ON SCHEMA public TO my_user;
Run Code Online (Sandbox Code Playgroud)

然后,所有表的所有权限(需要Postgres 9.0或更高版本):

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO my_user;
Run Code Online (Sandbox Code Playgroud)

并且不要忘记序列(如果有的话):

GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO my_user;
Run Code Online (Sandbox Code Playgroud)

对于旧版本,您可以使用pgAdmin III(默认GUI)的"授予向导".

更多:

但实际上,您应该升级到当前版本.

  • 这仅授予对表的访问权限.Postgres中有许多其他类型的对象,用户仍然无法访问... (6认同)
  • 首先我使用“sudo -i -u postgres” (3认同)
  • 请记住:在运行这些命令之前,您首先需要切换到 psql 中的数据库:`\c my_db` (2认同)
  • 哦,这个答案非常完美,只需要澄清新创建的表等不会获得这些新权限。为此,应使用 ALTER DEFAULT PRIVILEGES 指定它们... (2认同)

小智 118

GRANT ALL PRIVILEGES ON DATABASE "my_db" to my_user;
Run Code Online (Sandbox Code Playgroud)

  • @zaitsman"下面的那个"是指什么? (31认同)
  • 授予所有特权"ON DATABASE"听起来很强大,但它没有做太多.这只是一个开始.它不会对包含的对象授予任何权限. (12认同)
  • 在数据库名称周围加上双引号是可选的. (2认同)
  • @ErwinBrandstetter 那么,OP 的问题有答案吗……有一种简单的方法可以对给定数据库中的所有权限和所有包含的对象执行所有权限吗? (2认同)

Pat*_*ick 47

在PostgreSQL 9.0+中,您将执行以下操作:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA MY_SCHEMA TO MY_GROUP;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA MY_SCHEMA TO MY_GROUP;
Run Code Online (Sandbox Code Playgroud)

如果要为新创建的关系启用此功能,请设置默认权限:

ALTER DEFAULT PRIVILEGES IN SCHEMA MY_SCHEMA
  GRANT ALL PRIVILEGES ON TABLES TO MY_GROUP;
ALTER DEFAULT PRIVILEGES IN SCHEMA MY_SCHEMA
  GRANT ALL PRIVILEGES ON SEQUENCES TO MY_GROUP;
Run Code Online (Sandbox Code Playgroud)

但是,看到你使用8.1,你必须自己编写代码:

CREATE FUNCTION grant_all_in_schema (schname name, grant_to name) RETURNS integer AS $$
DECLARE
  rel RECORD;
BEGIN
  FOR rel IN
    SELECT c.relname
    FROM pg_class c
    JOIN pg_namespace s ON c.namespace = s.oid
    WHERE s.nspname = schname
  LOOP
    EXECUTE 'GRANT ALL PRIVILEGES ON ' || quote_ident(schname) || '.' || rel.relname || ' TO ' || quote_ident(grant_to);
  END LOOP;
  RETURN 1;
END; $$ LANGUAGE plpgsql STRICT;
REVOKE ALL ON FUNCTION grant_all_in_schema(name, name) FROM PUBLIC;
Run Code Online (Sandbox Code Playgroud)

这将设置所有关系的权限:表,视图,索引,序列等.如果要限制它,请过滤pg_class.relkind.有关详细信息,请参阅pg_class文档.

您应该以超级用户身份运行此功能,并按照应用程序的要求运行.一个选项是将其打包在每天或每小时执行的cron作业中.

  • 您应该在架构上授予使用权限.然后在该模式中的所有关系(表,视图,序列,索引等)上,您必须分别进行GRANT SELECT,INSERT,UPDATE,DELETE,TRUNCATE.模式是名称空间,关系是数据所在的位置. (2认同)

Sum*_*ora 24

我做了以下操作,在PostgreSQL 9.4.15数据库中添加了一个角色'eSumit',并为此角色提供了所有权限:

CREATE ROLE eSumit;

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO eSumit;

GRANT ALL PRIVILEGES ON DATABASE "postgres" to eSumit;

ALTER USER eSumit WITH SUPERUSER;
Run Code Online (Sandbox Code Playgroud)

还通过以下方式检查了pg_table enteries:

select*from pg_roles; 在此输入图像描述

数据库查询快照: 在此输入图像描述


Pro*_*ton 5

在 PostgreSQL 12 及更高版本中,可以将数据库中表的所有权限授予角色/用户/帐户。

语法是:

GRANT ALL ON table_name TO role_name;
Run Code Online (Sandbox Code Playgroud)

如果要将其授予数据库中的所有表,则语法为:

GRANT ALL ON ALL TABLES TO role_name;
Run Code Online (Sandbox Code Playgroud)

如果要将其授予数据库中模式的所有表,则语法为:

GRANT ALL ON ALL TABLES IN SCHEMA schema_name TO role_name;
Run Code Online (Sandbox Code Playgroud)

注意:请记住,您需要先选择数据库,然后才能将其权限授予用户。

资源PostgreSQL GRANT

就这样

我希望这有帮助

  • 如果没有“IN SCHEMA schema_name”,“GRANT USAGE ON ALL TABLES IN SCHEMA schema_name TO role_name”会导致错误:“错误:42601:“TO”处或附近的语法错误”。 (9认同)