Has*_*sef 3 postgresql permissions read-only-database
我想创建一个“不可变”的Postgres数据库,用户只能insert/ select(写入/读取)数据,但不能update/ delete(更改/删除)。
我知道有FOR UPDATE锁,但不知道如何使用它。
假设我有下表,如何使其不可变(或者,如果我理解正确,如何FOR UPDATE永久使用锁)?
CREATE TABLE account(
user_id serial PRIMARY KEY,
username VARCHAR (50) UNIQUE NOT NULL,
password VARCHAR (50) NOT NULL,
email VARCHAR (355) UNIQUE NOT NULL,
created_on TIMESTAMP NOT NULL,
last_login TIMESTAMP
);
Run Code Online (Sandbox Code Playgroud)
假设“用户”不包括任何具有超级用户权限的角色(可以执行所有操作),请以表所有者或超级用户身份运行:
REVOKE ALL ON TABLE account FROM public;
GRANT SELECT, INSERT ON TABLE account TO public;
Run Code Online (Sandbox Code Playgroud)
用户还需要附加到列USAGE的权限:SEQUENCEserial
GRANT USAGE ON SEQUENCE account_user_id_seq TO public;
Run Code Online (Sandbox Code Playgroud)
关于serial:
要确保附加序列的名称,请使用pg_get_serial_sequence()。看:
您还需要USAGE模式和CONNECT数据库的权限,这两个权限都是默认授予 schema 的public。
如果您只想影响一部分用户,请向组角色授予权限,而不是public向这些用户授予该角色的成员资格。您仍然需要撤销伪角色的权限public,它可以被视为向所有人授予成员资格的默认组角色(不可撤销)。并将仍需要的一切授予其他人(例如,通过另一个小组角色)。
CREATE ROLE my_group;
GRANT my_group TO my_user1;
GRANT my_group TO my_user2; -- more?
REVOKE ... FROM public;
GRANT SELECT, INSERT ON TABLE account TO my_group;
GRANT USAGE ON SEQUENCE account_user_id_seq TO my_group;
CREATE ROLE others;
GRANT others TO other_user1;
GRANT others TO other_user2;
GRANT ... TO others;
Run Code Online (Sandbox Code Playgroud)
有关的:
| 归档时间: |
|
| 查看次数: |
25163 次 |
| 最近记录: |