我是Postgres的新手,正尝试迁移我们的MySQL数据库。在MySQL中,我可以向低特权用户授予SELECTUPDATEINSERTDELETE特权,并使这些授予能够应用于指定数据库中的所有表。我必须在Postgres中缺少一些东西,因为看起来我不得不一次为每个表授予这些特权。拥有许多数据库,每个数据库有数百个表,这似乎是一项艰巨的任务,只是要起步。此外,一旦数据库开始运行,添加表的频率就会很高,以至于除非绝对必要,否则我不想每次都授予权限。

#1 楼

首先,您必须能够连接到数据库才能运行查询。这可以通过

REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;

GRANT CONNECT
ON DATABASE database_name 
TO user_name;


REVOKE是必要的,因为


关键字PUBLIC表示特权是授予
所有角色,包括以后可能创建的角色。可以将PUBLIC视为一个隐式定义的组,该组始终包含所有
角色。任何特定角色都将直接具有授予权限的总和
,授予该角色当前属于其的任何角色的权限,以及授予PUBLIC的特权。 />如果您确实想将用户限制为DML语句,那么您还有更多工作要做:

REVOKE ALL
ON ALL TABLES IN SCHEMA public 
FROM PUBLIC;

GRANT SELECT, INSERT, UPDATE, DELETE
ON ALL TABLES IN SCHEMA public 
TO user_name;


这些假设您将只有一个模式(正如杰克·道格拉斯(Jack Douglas)所指出的那样,以上内容仅赋予了已经存在的表特权。要在将来的表中实现相同的功能,必须定义默认权限:

ALTER DEFAULT PRIVILEGES 
    FOR ROLE some_role   -- Alternatively "FOR USER"
    IN SCHEMA public
    GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO user_name;
是创建表的角色,而some_role是创建表的角色特权。定义这个之后,您必须以user_name或它的成员身份登录。是您需要的some_role特权。

评论


谢谢,因为FOR some_role是我无法使它适用于以后创建的表的关键部分。但是我不必以some_role身份登录,如果我以默认的admin postgres用户身份执行查询,它也可以工作。

– JustAMartin
15年7月28日在14:38

我为用户执行了所有这些命令,但是仍然不允许我在数据库内的表上使用SELECT。只有在我再次撤销所有特权并再次授予之后,它才能工作。

–rubo77
1月2日,2:24

#2 楼

假设您想授予他们所有特权-请执行以下操作:

grant all privileges on database dbname to dbuser;


其中dbname是数据库的名称,而dbuser是用户的名称。

评论


这将在数​​据库上添加以下特权:CREATE,CONNECT,TEMPORARY。在表上没有特权。

– dezso
13年2月1日在12:45

对于所有表,类似的命令是:在SCHEMA public TO dbuser中授予所有表上的所有特权;

– Dolan Antenucci
17 Mar 28 '17在3:04

我也发现这很有用:将SCHEMA中所有序列上的所有特权授予public到dbuser;

–保罗
17年9月8日在18:18



#3 楼

使用

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA <schema_name> TO <username>;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA <schema_name> TO <username>;

授予数据库中所有表的所有特权。

#4 楼

因为我是PostgreSQL的新手,所以我可能在这里做错了。但这对我来说只是解决了问题的第一部分-在所有现有表上设置特权。

为了在新表上为我的用户正确设置权限,我必须设置用户的默认权限:

ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT, INSERT, UPDATE, DELETE ON tables TO user_name;

ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT, USAGE ON sequences TO user_name;


#5 楼

--Create User

CREATE USER my_user_test WITH LOGIN NOSUPERUSER NOCREATEDB  NOCREATEROLE    INHERIT NOREPLICATION   CONNECTION LIMIT -1 PASSWORD 'xxxxxxx';

-- Grant connect to my data base

GRANT CONNECT ON DATABASE my_db_test TO my_user_test;

-- Grant usage the schema

GRANT USAGE ON SCHEMA my_sch_test TO my_user_test ;

-- Grant all table for SELECT, INSERT, UPDATE, DELETE

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA my_sch_test TO my_user_test;