gue*_*tli 0 postgresql locking
我想锁定一个表:INSERT
应该被允许,但UPDATE
应该被禁用。
我正在使用当前的 PostgreSQL 版本。
我阅读了“建议锁”和“显式锁定”。也许我是盲人,但我找不到适合我的目标的解决方案。
以下是我的用例的详细信息:
有一个表,大致类似于日志记录:多个进程同时向表中添加新行。
脚本每小时处理一次添加的数据。
现在我想确定这个脚本有一个固定的工作集。不应修改脚本正在处理的行。但是,如果在脚本运行时添加新行也没关系。这些行在下一次调用脚本时获取进程。
当然,您可以使用行级锁来写锁定当前在表中的所有行:
SELECT * FROM tbl FOR UPDATE;
Run Code Online (Sandbox Code Playgroud)
或者类似的。
但这会阻止所有写入,包括DELETE
,不仅UPDATE
- 在锁定期间。还有一个关于在此之后插入的行的剩余问题:这些行不应该也受到保护UPDATE
吗?
您的措辞方式(“INSERT
应该被允许,但UPDATE
应该被禁用。”),这听起来像是使用GRANT
andREVOKE
进行权限管理的更一般问题,而不是锁定。
就像是:
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)
实际的命令取决于谁首先获得了GRANT
ed 权限,以及现在应该阻止谁更新。
不要忘记 table owner的特殊情况。手册GRANT
:
不需要向对象的所有者(通常是创建它的用户)授予权限,因为默认情况下所有者拥有所有权限。(但是,所有者可以选择撤销他们自己的一些特权以确保安全。)
虽然锁定仅在事务期间持续,但效果是永久性的 - 直到显式更改。另外,锁很贵。GRANT
/REVOKE
几乎是免费的。
您需要必要的权限。要么是表的所有者,要么是拥有该表的角色的成员,要么是超级用户,要么您已被授予相同的权限WITH GRANT OPTION
。
归档时间: |
|
查看次数: |
95 次 |
最近记录: |