锁定:允许插入但不允许更新

gue*_*tli 0 postgresql locking

我想锁定一个表:INSERT应该被允许,但UPDATE应该被禁用。

我正在使用当前的 PostgreSQL 版本。

我阅读了“建议锁”和“显式锁定”。也许我是盲人,但我找不到适合我的目标的解决方案。

以下是我的用例的详细信息:

有一个表,大致类似于日志记录:多个进程同时向表中添加新行。

脚本每小时处理一次添加的数据。

现在我想确定这个脚本有一个固定的工作集。不应修改脚本正在处理的行。但是,如果在脚本运行时添加新行也没关系。这些行在下一次调用脚本时获取进程。

Erw*_*ter 5

当然,您可以使用行级锁来写锁定当前在表中的所有行:

SELECT * FROM tbl FOR UPDATE;
Run Code Online (Sandbox Code Playgroud)

或者类似的。

但这会阻止所有写入,包括DELETE,不仅UPDATE- 在锁定期间。还有一个关于在此之后插入的行的剩余问题:这些行不应该也受到保护UPDATE吗?

您的措辞方式(INSERT应该被允许,但UPDATE应该被禁用。”),这听起来像是使用GRANTandREVOKE进行权限管理的更一般问题,而不是锁定。

就像是:

GRANT INSERT ON TABLE public.tbl TO public;
REVOKE UPDATE ON TABLE public.tbl FROM public;
Run Code Online (Sandbox Code Playgroud)

或者:

GRANT INSERT ON TABLE public.tbl TO specific_role;
REVOKE UPDATE ON TABLE public.tbl FROM specific_role;
Run Code Online (Sandbox Code Playgroud)

实际的命令取决于谁首先获得了GRANTed 权限,以及现在应该阻止谁更新。
不要忘记 table owner的特殊情况。手册GRANT

不需要向对象的所有者(通常是创建它的用户)授予权限,因为默认情况下所有者拥有所有权限。(但是,所有者可以选择撤销他们自己的一些特权以确保安全。)

虽然锁定仅在事务期间持续,但效果是永久性的 - 直到显式更改。另外,锁很贵。GRANT/REVOKE几乎是免费的。

您需要必要的权限。要么是表的所有者,要么是拥有该表的角色的成员,要么是超级用户,要么您已被授予相同的权限WITH GRANT OPTION