AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 155332
Accepted
Nicolas Payart
Nicolas Payart
Asked: 2016-11-16 08:36:54 +0800 CST2016-11-16 08:36:54 +0800 CST 2016-11-16 08:36:54 +0800 CST

查找链接到 PostgreSQL 角色的对象

  • 772

前段时间我创建了一个名为user1 (PostgreSQL 9.4.9) 的 PostgreSQL 用户。

我想删除这个用户。所以我首先撤销了对表、序列、函数、默认权限和所有权的所有权限:

ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE ALL ON SEQUENCES FROM user1;
ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE ALL ON TABLES FROM user1;
ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE ALL ON FUNCTIONS FROM user1;

REVOKE ALL ON ALL SEQUENCES IN SCHEMA public FROM user1;
REVOKE ALL ON ALL TABLES IN SCHEMA public FROM user1;
REVOKE ALL ON ALL FUNCTIONS IN SCHEMA public FROM user1;

REASSIGN OWNED BY user1 TO postgres;

但是,在 2 个数据库中,一个对象似乎仍然与该用户相关联:

postgres=# DROP ROLE user1;
ERROR:  role "user1" cannot be dropped because some objects depend on it
DETAIL:  1 object in database db1
1 object in database db2

它甚至似乎是一个函数:

postgres=# \c db1
You are now connected to database "db1" as user "postgres".
db1=# DROP ROLE user1;
ERROR:  role "user1" cannot be dropped because some objects depend on it
DETAIL:  privileges for function text(boolean)
1 object in database db2

但我无法确定哪个对象拥有或与 user1 相关。

如果我pg_dump -s db1 | grep user1没有结果!它会是一个全局对象吗?

如何识别丢失的对象?

我已经在每个数据库(db1 和 db2)中执行了命令。我不想删除 拥有的对象user1,只想重新分配或删除此用户的授权。

postgresql permissions
  • 3 3 个回答
  • 47317 Views

3 个回答

  • Voted
  1. Best Answer
    Erwin Brandstetter
    2016-11-16T12:07:11+08:002016-11-16T12:07:11+08:00

    回答问题

    要在错误消息中查找函数及其所有者:

    SELECT oid::regprocedure AS function
         , pg_get_userbyid(proowner) AS owner
    FROM   pg_proc
    WHERE  oid = 'text(boolean)'::regprocedure;
    

    有关的:

    • DROP FUNCTION 不知道参数的数量/类型?

    实际问题

    错误消息说:

    DETAIL:函数文本的权限(布尔值)

    这不是关于所有权,而是关于特权。

    手册DROP ROLE:

    在删除角色之前,您必须删除它拥有的所有对象(或重新分配其所有权)并撤销该角色已授予其他对象的任何特权。

    对于ALTER DEFAULT PRIVILEGES:

    如果您希望删除已更改默认权限的角色,则需要反转其默认权限的更改或使用DROP OWNEDBY删除该角色的默认权限条目。

    看起来您只REASSIGN OWNED在一个数据库中执行,但手册指示:

    因为REASSIGN OWNED不影响其他数据库中的对象,所以通常需要在每个包含要删除的角色拥有的对象的数据库中执行此命令。

    大胆强调我的。

    你用 . 限制了你的命令IN SCHEMA public。删除该子句以针对整个数据库。但别担心,有一个...

    简单的解决方案DROP OWNED

    REASSIGN OWNED BY user1 TO postgres;
    DROP OWNED BY user1;
    

    postgres所有角色的对象都使用第一个命令更改了所有权,现在是安全的。的措辞DROP OWNED有点误导,因为它也摆脱了所有特权和默认特权。手册DROP OWNED:

    DROP OWNED删除当前数据库中由指定角色之一拥有的所有对象。在当前数据库中的对象和共享对象(数据库、表空间)上授予给定角色的任何特权也将被撤销。

    在所有相关的数据库中重复,然后你可以进入杀戮:

    DROP ROLE user1;
    
    • 18
  2. Sahap Asci
    2016-11-16T13:20:04+08:002016-11-16T13:20:04+08:00

    下面的查询列出了具有所有者的对象。对于所有特权,我们实际上需要更多。

    --r = ordinary table, i = index, S = sequence, v = view, m = materialized view, c = composite type, t = TOAST table, f = foreign table
    SELECT 
        n.nspname AS schema_name,
        c.relname AS rel_name,
        c.relkind AS rel_kind,
        pg_get_userbyid(c.relowner) AS owner_name
      FROM pg_class c
      JOIN pg_namespace n ON n.oid = c.relnamespace
    
    UNION ALL
    
    -- functions (or procedures)
    SELECT
        n.nspname AS schema_name,
        p.proname,
        'p',
        pg_get_userbyid(p.proowner)
      FROM pg_proc p
      JOIN pg_namespace n ON n.oid = p.pronamespace
    
    • 14
  3. Samuel Anyaele
    2019-02-05T20:24:23+08:002019-02-05T20:24:23+08:00

    您需要先连接到数据库。在你的例子中,那将是

    \c db1
    

    和

    \c db2
    

    然后尝试再次运行 REVOKE ALL PRIVILEGES 和 REASSIGN OWNED/DROP OWNED 语句。

    • 1

相关问题

  • 我可以在使用数据库后激活 PITR 吗?

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve