pg_shdepend
#51.48. pg_shdepend
#
目录 pg_shdepend
记录了数据库对象和共享对象(例如角色)之间的依赖关系。此信息允许 PostgreSQL 确保在尝试将其删除之前,这些对象没有被引用。
不像大多数系统目录,pg_shdepend
在集群的所有数据库中都是共享的:每个集群只存在一个 pg_shdepend
的副本,而不是每个数据库一个。
表 51.48. pg_shdepend
列
列类型 描述 |
---|
依赖对象所在的数据库的 OID,如果是共享对象,则为零 |
依赖对象所在的系统目录的 OID |
特定依赖对象的 OID |
对于表列,就是该列的编号( |
被引用对象所在的系统目录的 OID(必须是共享目录) |
特定被引用对象的 OID |
一个代码,定义了此依赖关系的特定语义;见文本 |
在所有情况下,pg_shdepend
条目都表示无法删除被引用对象,除非也删除依赖对象。不过,deptype
标识有几种不同类型的风味
SHARED_DEPENDENCY_OWNER
(o
)被引用对象(必须是一个角色)是依赖对象的拥有者。
SHARED_DEPENDENCY_ACL
(a
)被引用对象(必须是一个角色)在依赖对象的 ACL(访问控制列表,即权限列表)中被提及。(不会为对象的拥有者创建一个 SHARED_DEPENDENCY_ACL
条目,因为该拥有者无论如何都会有一个 SHARED_DEPENDENCY_OWNER
条目)。
SHARED_DEPENDENCY_INITACL
(i
)被引用对象(必须是一个角色)在依赖对象的 pg_init_privs
条目中被提及。
SHARED_DEPENDENCY_POLICY
(r
)所引用的对象(必须是角色)被提到是相关策略对象的 target。
SHARED_DEPENDENCY_TABLESPACE
(t
)所引用的对象(必须是表空间)被提到是未存储关系的表空间。
未来可能需要其他依赖类型。特别注意,当前定义仅支持角色和表空间为所引用的对象。
在 pg_depend
目录中,在 initdb 期间创建的大部分对象都是 “pinned”。在 pg_shdepend
中不会创建将固定对象作为所引用对象或相关对象的任何条目。