Answers:
首先,您必须能够连接到数据库才能运行查询。这可以通过
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
或其成员身份登录。
最后,您必须对序列执行相同的操作(感谢PlaidFan指出)-这是USAGE
您需要的特权。
假设您想赋予他们所有特权-请执行以下操作:
grant all privileges on database dbname to dbuser;
where dbname
是您的数据库dbuser
的名称,是用户的名称。
CREATE, CONNECT, TEMPORARY
。在表上没有特权。
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO dbuser;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO dbuser;
--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
如果我以默认管理员postgres
用户身份执行查询,它也可以正常工作。