52.47. pg_shdepend

目录pg_shdepend记录数据库对象和共享对象(例如角色)之间的依赖关系。该信息使 PostgreSQL 可以确保在尝试删除这些对象之前未对其进行引用。

另请参见pg_depend,它对涉及单个数据库内对象的依赖项执行类似的功能。

与大多数系统目录不同,pg_shdepend在群集的所有数据库之间共享:每个群集只有pg_shdepend的一个副本,而不是每个数据库一个。

表 52.47. pg_shdepend

NameTypeReferencesDescription
dbidoidpg_database.oid从属对象所在数据库的 OID,对于共享对象为 0
classidoidpg_class.oid从属对象所在的系统目录的 OID
objidoid任何 OID 列特定从属对象的 OID
objsubidint4 对于表列,这是列号(objidclassid表示表本身)。对于所有其他对象类型,此列为零。
refclassidoidpg_class.oid引用对象所在的系统目录的 OID(必须是共享目录)
refobjidoid任何 OID 列特定参考对象的 OID
deptypechar 定义此依赖关系的特定语义的代码;看到 Literals

在所有情况下,pg_shdepend条目表示如果不删除依赖对象也不能删除所引用的对象。但是,存在由deptype标识的几种子口味:

  • SHARED_DEPENDENCY_OWNER ( o )

    • 引用的对象(必须是角色)是从属对象的所有者。
  • SHARED_DEPENDENCY_ACL ( a )

    • 在从属对象的 ACL(访问控制列表,即特权列表)中提到了引用的对象(必须是角色)。 (该对象的所有者未创建SHARED_DEPENDENCY_ACL条目,因为所有者仍然会有SHARED_DEPENDENCY_OWNER条目.)
  • SHARED_DEPENDENCY_POLICY ( r )

    • 引用的对象(必须是角色)被称为从属策略对象的目标。
  • SHARED_DEPENDENCY_PIN ( p )

    • 没有从属对象。这种类型的 Importing 表明系统本身依赖于引用的对象,因此绝不能删除该对象。此类型的条目仅由initdb创建。从属对象的列包含零。

将来可能需要其他依赖项。特别要注意的是,当前定义仅支持将角色用作引用对象。