SELECT
,UPDATE
,INSERT
和DELETE
特权,并使这些授予能够应用于指定数据库中的所有表。我必须在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
特权。#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;
评论
谢谢,因为FOR some_role是我无法使它适用于以后创建的表的关键部分。但是我不必以some_role身份登录,如果我以默认的admin postgres用户身份执行查询,它也可以工作。
– JustAMartin
15年7月28日在14:38
我为用户执行了所有这些命令,但是仍然不允许我在数据库内的表上使用SELECT。只有在我再次撤销所有特权并再次授予之后,它才能工作。
–rubo77
1月2日,2:24