guettli Asked: 2020-11-13 11:57:42 +0800 CST2020-11-13 11:57:42 +0800 CST 2020-11-13 11:57:42 +0800 CST 锁定:允许 INSERT 但不允许 UPDATE 772 我想锁定一个表:INSERT应该被允许,但UPDATE应该被禁用。 我正在使用当前的 PostgreSQL 版本。 我阅读了咨询锁和显式锁定。也许我是盲人,但我找不到适合我目标的解决方案。 以下是我的用例的详细信息: 有一个表大致类似于日志记录:多个进程同时向表中添加新行。 一个脚本每小时处理一次添加的数据。 现在我想确定这个脚本有一个固定的工作集。不应对脚本正在处理的行进行任何修改。但是如果在脚本运行时添加新行也没关系。这些行通过脚本的下一次调用获取进程。 postgresql locking 2 个回答 Voted Best Answer Erwin Brandstetter 2020-11-13T15:02:54+08:002020-11-13T15:02:54+08:00 当然,您可以使用行级锁来写锁定表中当前的所有行: SELECT * FROM tbl FOR UPDATE; 或类似的。 但这会阻止所有写入,包括DELETE,不仅是UPDATE- 在锁定期间。还有一个关于之后插入的行的问题:这些行不应该也受到保护UPDATE吗? 您的措辞方式(“INSERT应该被允许,但UPDATE应该被禁用。”),这听起来像是一个更一般的权限管理问题GRANTandREVOKE,而不是锁定。 就像是: GRANT INSERT ON TABLE public.tbl TO public; REVOKE UPDATE ON TABLE public.tbl FROM public; 或者: GRANT INSERT ON TABLE public.tbl TO specific_role; REVOKE UPDATE ON TABLE public.tbl FROM specific_role; 实际的命令取决于谁GRANT首先获得了特权,以及现在应该阻止谁更新。 不要忘记表所有者的特殊情况。手册GRANT: 无需向对象的所有者(通常是创建它的用户)授予权限,因为所有者默认拥有所有权限。(但是,所有者可以选择撤销他们自己的一些安全特权。) 虽然锁定仅在事务期间持续,但其效果是永久性的 - 直到明确更改。另外,锁很贵。GRANT/REVOKE几乎是免费的。 您需要必要的权限。要么是表的所有者,要么是拥有表的角色的成员,要么是超级用户,要么您已被授予相同的权限WITH GRANT OPTION。 guettli 2020-11-14T08:43:20+08:002020-11-14T08:43:20+08:00 你可以使用pg_try_advisory_lock(). 见咨询锁
当然,您可以使用行级锁来写锁定表中当前的所有行:
或类似的。
但这会阻止所有写入,包括
DELETE
,不仅是UPDATE
- 在锁定期间。还有一个关于之后插入的行的问题:这些行不应该也受到保护UPDATE
吗?您的措辞方式(“
INSERT
应该被允许,但UPDATE
应该被禁用。”),这听起来像是一个更一般的权限管理问题GRANT
andREVOKE
,而不是锁定。就像是:
或者:
实际的命令取决于谁
GRANT
首先获得了特权,以及现在应该阻止谁更新。不要忘记表所有者的特殊情况。手册
GRANT
:虽然锁定仅在事务期间持续,但其效果是永久性的 - 直到明确更改。另外,锁很贵。
GRANT
/REVOKE
几乎是免费的。您需要必要的权限。要么是表的所有者,要么是拥有表的角色的成员,要么是超级用户,要么您已被授予相同的权限
WITH GRANT OPTION
。你可以使用
pg_try_advisory_lock()
. 见咨询锁