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 / 问题 / 316810
Accepted
MacGyver
MacGyver
Asked: 2022-09-13 12:22:56 +0800 CST2022-09-13 12:22:56 +0800 CST 2022-09-13 12:22:56 +0800 CST

在 postgresql 中查找并删除角色的公共模式对象依赖项

  • 772

几周前,当我学习 PostgreSQL 安全性时,我试图做一些奇怪的事情(尽管不推荐)从 pgadmin 的对象浏览器中删除公共模式。幸运的是,我有我运行的所有命令和我运行的所有撤消命令,但我似乎仍然有一个我无法删除的角色对象。尝试 DROP ROLE test_role_11 时出现错误,但我似乎仍然在公共模式中有对象依赖关系。你能帮我找到查询以找出它是什么吗?给定第一个查询,您还可以帮我找到正确的 REVOKE 命令(或其他命令)以撤消依赖关系和/或特权吗?PUBLIC 似乎是它自己的挑战,而不是一个实际的角色,所以我不确定如何编写查询。我尝试过使用旧问题,但没有走得太远。

异常/错误:

无法删除角色“test_role_11”,因为某些对象依赖于它 详细信息:架构公共的特权

这是我运行的查询。

CREATE ROLE test_role_11 
--NOSUPERUSER NOCREATEDB NOCREATEROLE NOINHERIT NOLOGIN NOREPLICATION NOBYPASSRLS
REVOKE ALL ON ALL TABLES IN SCHEMA pg_catalog FROM public, me;
--GRANT ALL ON ALL TABLES IN SCHEMA pg_catalog TO public, me;
GRANT SELECT ON ALL TABLES IN SCHEMA pg_catalog TO test_role_11;
--REVOKE SELECT ON ALL TABLES IN SCHEMA pg_catalog FROM test_role_11;
GRANT test_role_11 TO me
--REVOKE object_browser FROM me;

--GRANT SELECT ON TABLE aaa IN SCHEMA pg_catalog TO test_role_11;

GRANT SELECT ON TABLE pg_catalog."aaa" TO test_role_11;
GRANT SELECT ON TABLE staging."aaa" TO test_role_11;

GRANT SELECT ON TABLE pg_database TO test_role_11;

这些没有为我的角色找到任何对象依赖项。

查找链接到 PostgreSQL 角色的对象


postgresql
  • 1 1 个回答
  • 23 Views

1 个回答

  • Voted
  1. Best Answer
    MacGyver
    2022-09-13T14:45:19+08:002022-09-13T14:45:19+08:00

    在查看了所有目录表之后,我能够找到一些具有该对象的 oid 的记录。但我还不确定如何处理这些信息。

    SELECT rolname, oid FROM pg_roles WHERE rolname = 'test_role_11';
    
    -- rolname, oid
    -- test_role_11, 612646
    
    SELECT DISTINCT dbid, * FROM   pg_shdepend WHERE refobjid = 612646
    
    -- dbid, classid, objid, objsubid, refclassid, refobjid, deptype
    -- 612032, 2615, 2200, 0, 1260, 612646, a
    -- obj* must be the dependent object (aka 'test_role_11')
    -- ref* must be the dependency object
    
    SELECT * FROM pg_database WHERE oid = 612032
    
    -- oid, datname
    -- 612032, p01
    
    SELECT * FROM  pg_catalog.pg_class WHERE oid = 2615
    
    -- oid, relname, relnamespace, reltype, reloftype, relowner, relam, relfilenode, reltablespace, relpages, reltuples, relalvisible, reltoastrelid, 
    -- 2615, pg_namespace, 11, 12023,  ...
    
    SELECT * FROM pg_namespace WHERE oid = 11;
    
    -- oid, nspname, nspowner, nspacl
    -- 11, pg_catalog, 10, {postgres=UC/postgres,=U/postgres}
    
    SELECT * FROM pg_namespace WHERE oid = 2200
    
    -- oid, nspname, nspowner, nspaci
    -- 2200, public, 10, {postgres=UC/postgres,=UC/postgres,test_role_11=U/postgres}
    

    所以事实证明,引用依赖(ref*)对象的依赖对象是 2200,这就是公共模式本身!所以我需要改变这个角色的所有权(也许)。

    这是我学到的。依赖项的依赖项(父项),oid=2200,可以是任何对象类型。所以很难弄清楚它在哪个表中。还有两个表具有依赖关系。此依赖项不在 pg_depend!

    在 PostgreSQL 中,数据库对象的依赖关系在系统表 pg_depend 中进行跟踪。还有另一个系统表 pg_shdepend,它跟踪在集群中存在的所有数据库之间共享的对象的依赖关系。

    这解决了问题!并且在此之后能够 DROP ROLE test_role_11 。

    REVOKE ALL ON SCHEMA public FROM test_role_11;  
    
    • 0

相关问题

  • 我可以在使用数据库后激活 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