Postgres 中的插入和只读表

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)

Erw*_*ter 6

假设“用户”不包括任何具有超级用户权限的角色(可以执行所有操作),请以表所有者或超级用户身份运行:

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)

有关的: