pg_depend #
目录 pg_depend 记录数据库对象之间的依赖关系。
该信息允许 DROP 命令找出
DROP CASCADE 必须一并删除哪些其他对象,
或在 DROP RESTRICT 情况下阻止删除。
另见 pg_shdepend,
它对涉及跨数据库集群共享对象的依赖执行类似的功能。
Table 52.18. \1 字段列说明
Column Type Description |
|---|
依赖对象所在的系统目录的 OID |
依赖的具体对象的 OID |
对于表列,这是列号( |
被引用对象所在的系统目录的 OID |
被引用的具体对象的 OID |
对于表列,这是列号( |
定义此依赖关系特定语义的代码;详见正文 |
在所有情况下,pg_depend 条目表明,
被引用对象在不删除依赖对象的情况下无法被删除。
不过,由 deptype 标识出若干子类型:
DEPENDENCY_NORMAL (n)
单独创建的对象之间的一种普通关系。
依赖对象可以被删除而不影响被引用对象。
被引用对象只有通过指定 CASCADE 才能被删除,
此时依赖对象也会被删除。
示例:表列对其数据类型有普通依赖。
DEPENDENCY_AUTO (a)
依赖对象可以与被引用对象分开删除,
并且如果被引用对象被删除,它应当被自动删除
(无论 RESTRICT 还是 CASCADE 模式)。
示例:表上的命名约束被设置为自动依赖该表,
这样表被删除时它也会随之消失。
DEPENDENCY_INTERNAL (i)
依赖对象是作为被引用对象创建过程的一部分而创建的,
实际上只是其内部实现的一部分。直接对依赖对象
DROP 将被完全禁止
(我们会告诉用户改为对被引用对象发出 DROP)。
对被引用对象的 DROP
将导致依赖对象被自动删除,无论是否指定了
CASCADE。如果由于对其他某个被移除对象的依赖
而不得不删除该依赖对象,其删除会被转换为对被引用对象的删除,
从而使该依赖对象的 NORMAL 和
AUTO 依赖表现得就像它们是被引用对象的依赖一样。
示例:视图的 ON SELECT 规则被设置为内部依赖该视图,
在视图存在期间阻止它被删除。
该规则的依赖(例如它引用的表)表现得就像它们是视图的依赖。
DEPENDENCY_PARTITION_PRI (P)DEPENDENCY_PARTITION_SEC (S)
依赖对象是作为被引用对象创建过程的一部分而创建的,
实际上只是其内部实现的一部分;但是与 INTERNAL
不同,这里有多于一个这样的被引用对象。
除非至少删除其中一个被引用对象,否则不得删除该依赖对象;
如果删除了其中任何一个,则无论是否指定
CASCADE,依赖对象都应当被删除。
另外与 INTERNAL 不同的是,
删除依赖对象所依赖的其他某个对象并不会导致任何
分区引用对象被自动删除。因此,
如果删除没有通过其他路径级联到至少其中一个对象,删除将被拒绝。
(在大多数情况下,依赖对象与至少一个分区引用对象
共享其所有非分区依赖,因此该限制不会阻止任何级联删除。)
主分区依赖与次分区依赖的行为完全相同,
区别只是主依赖会被优先用于错误消息;因此,
分区依赖对象应当有一个主分区依赖和一个或多个次分区依赖。
注意,分区依赖是在该对象通常具有的依赖之外额外做出的,
而不是取代它们。这简化了
ATTACH/DETACH PARTITION 操作:
只需添加或删除分区依赖即可。
示例:子分区索引被设置为同时分区依赖于它所在的分区表
和父分区索引,这样任意一者被删除时它都会消失,
否则不会。对父索引的依赖是主依赖,
这样当用户试图删除子分区索引时,
错误消息会建议改为删除父索引(而不是表)。
DEPENDENCY_EXTENSION (e)
依赖对象是作为被引用对象的
扩展的成员(见
pg_extension)。
依赖对象只能通过对被引用对象执行
DROP EXTENSION
来删除。在功能上,这种依赖类型与
INTERNAL 依赖的作用相同,
但为了清晰起见以及简化 pg_dump
而将它单独区分出来。
DEPENDENCY_AUTO_EXTENSION (x)
依赖对象是该被引用对象的扩展的成员
(因此它不应被 pg_dump 忽略),
但没有该扩展它无法工作,如果扩展被删除,它应当被自动删除。
依赖对象也可以自行被删除。
在功能上,这种依赖类型与
AUTO 依赖的作用相同,
但为了清晰起见以及简化 pg_dump
而将它单独区分出来。
其他依赖子类型将来可能会加入。
注意,两个对象完全可能由多于一个
pg_depend 条目链接。例如,
子分区索引既有对其关联分区表的分区类型依赖,
也有对其索引的该表每一列的自动依赖。
这种情况表达了多种依赖语义的并集。
如果任何一条依赖满足其自动删除条件,
依赖对象就可以在不用 CASCADE 的情况下被删除。
反过来,各依赖关于哪些对象必须被一起删除的限制都必须得到满足。
在 initdb 期间创建的大多数对象
被视为“被钉住的”(pinned),
这意味着系统本身依赖于它们。因此,永远不允许删除它们。
另外,由于知道被钉住的对象不会被删除,
依赖机制不会费心为指向它们的依赖创建
pg_depend 条目。
因此,举例来说,numeric 类型的表列在名义上
对 numeric 数据类型有 NORMAL 依赖,
但 pg_depend 中实际上并不出现这样的条目。