You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何撤销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不会自动覆盖已经存在的列级权限——列级权限的优先级更高,必须单独撤销。

正确的操作步骤

  1. 先定位所有需要处理的列
    先执行你的查询语句,明确哪些表的哪些列给PUBLIC开了UPDATE权限:

    SELECT table_schema, table_name, column_name
    FROM information_schema.column_privileges 
    WHERE grantee='PUBLIC' AND privilege_type='UPDATE';
    
  2. 逐个撤销列级权限
    针对查询结果里的每一行,执行对应的撤销命令:

    -- 替换成实际的schema、表名和列名
    REVOKE UPDATE (column_name) ON table_schema.table_name FROM PUBLIC;
    
  3. 批量处理(可选)
    如果需要处理的列很多,可以用动态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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:12:25