如何撤销PostgreSQL列权限?需清空指定查询结果
搞定PUBLIC用户的列级UPDATE权限撤销问题
我懂你的需求——要让SELECT * FROM information_schema.column_privileges where grantee='PUBLIC' and privilege_type='UPDATE';返回空结果,也就是彻底收回PUBLIC用户对所有列的UPDATE权限。但你之前执行的命令没起作用,问题出在方向不对:你操作的是information_schema schema、数据库和整个表的权限,但column_privileges里的记录对应的是实际业务表的列级权限,不是information_schema本身的权限。
为什么之前的命令没用?
information_schema是PostgreSQL的系统视图,本身是只读的,你撤销它的权限不会改变里面记录的实际权限数据。- 数据库、schema或表级的
REVOKE ALL不会自动覆盖已经存在的列级权限——列级权限的优先级更高,必须单独撤销。
正确的操作步骤
先定位所有需要处理的列
先执行你的查询语句,明确哪些表的哪些列给PUBLIC开了UPDATE权限:SELECT table_schema, table_name, column_name FROM information_schema.column_privileges WHERE grantee='PUBLIC' AND privilege_type='UPDATE';逐个撤销列级权限
针对查询结果里的每一行,执行对应的撤销命令:-- 替换成实际的schema、表名和列名 REVOKE UPDATE (column_name) ON table_schema.table_name FROM PUBLIC;批量处理(可选)
如果需要处理的列很多,可以用动态SQL自动生成撤销命令,然后复制执行:SELECT 'REVOKE UPDATE (' || column_name || ') ON ' || table_schema || '.' || table_name || ' FROM PUBLIC;' AS revoke_command FROM information_schema.column_privileges WHERE grantee='PUBLIC' AND privilege_type='UPDATE';
额外提醒
- 超级用户(比如postgres)默认拥有所有权限,除非你特意针对它撤销列级权限,但你的目标是PUBLIC,所以重点放在PUBLIC上即可。
- 执行完所有撤销命令后,再重新运行你的查询语句,就能得到空结果了。
内容的提问来源于stack exchange,提问作者drojokef
相关产品推荐
相关产品推荐

