pg_depend #目录pg_depend记录数据库对象之间的依赖关系。这些信息允许DROP命令查找必须被DROP CASCADE删除的其他对象,或者在DROP RESTRICT情况下阻止删除。
另请参阅pg_shdepend,它对在一个数据库集簇中共享的对象之间的依赖提供了相似的功能。
Table 52.18. pg_depend 列
| Name | 类型 | 引用 | 描述 |
|---|---|---|---|
classid |
oid |
|
依赖对象所在系统目录的OID |
objid |
oid |
任意 OID 列 | 特定依赖对象的OID |
objsubid |
int4 |
对于一个表列,这里是列号(objid和classid指表本身)。对于所有其他对象类型,此列为0。 |
|
refclassid |
oid |
|
被引用对象所在的系统目录的OID |
refobjid |
oid |
任意 OID 列 | 指定被引用对象的OID |
refobjsubid |
int4 |
对于一个表列,这里是列号(refobjid和refclassid指表本身)。对于所有其他对象类型,此列为0。 |
|
deptype |
char |
定义此依赖关系语义的一个代码,见文本 |
在所有情况下,一条pg_depend记录都表示:如果不同时删除依赖对象,就不能删除被引用对象。不过,还存在若干由deptype标识的子类型:
DEPENDENCY_NORMAL(n)两个独立创建的对象之间的正常关系。依赖对象可以被删除而不影响被引用对象。 被引用对象只能通过指定CASCADE来删除,这样依赖对象也会被删除。 例如:表列对其数据类型有一个正常依赖关系。
DEPENDENCY_AUTO (a)依赖对象可以与被引用对象分开删除,并且在被引用对象删除时应自动删除(无论使用RESTRICT还是CASCADE模式)。 例如,表上的命名约束会自动依赖于该表,因此删除表时该约束也会消失。
DEPENDENCY_INTERNAL(i)依赖对象作为被引用对象创建过程的一部分而创建,实际上只是其内部实现的一部分。 对依赖对象执行DROP会被直接禁止(我们会告诉用户改为对被引用对象执行DROP)。 对被引用对象执行DROP会传播到依赖对象,使其被删除,无论是否指定CASCADE。 例如,为实施外键约束而创建的触发器会在内部依赖于该约束的pg_constraint项。
DEPENDENCY_INTERNAL_AUTO (I)依赖对象作为被引用对象创建过程的一部分而创建,实际上只是其内部实现的一部分。 对依赖对象执行DROP会被直接禁止(我们会告诉用户改为对被引用对象执行DROP)。 对于普通内部依赖,只要还有任何这样的依赖关系存在,就不能删除依赖对象; 而DEPENDENCY_INTERNAL_AUTO允许删除,只要沿这些依赖关系中的任意一个能够找到该对象。 例如,分区上的索引既以内部自动方式依赖于分区本身,也依赖于父分区表上的索引; 因此,无论删除该分区索引所索引的分区,还是删除它所附属的父索引,都会一并删除该分区索引。
DEPENDENCY_EXTENSION(e)依赖对象是作为被引用对象的扩展的一个成员(参见pg_extension)。 只能通过对被引用对象执行DROP EXTENSION来删除依赖对象。 在功能上,这种依赖类型与内部依赖相同,但为了清晰和简化pg_dump而单独区分。
DEPENDENCY_AUTO_EXTENSION(x)依赖对象不是作为被引用对象的扩展的成员(因此 pg_dump 不应忽略它),但它无法在没有该扩展的情况下运行, 所以删除扩展时也应删除它。依赖对象也可以单独删除。
DEPENDENCY_PIN (p)不存在依赖对象;这种项表示系统本身依赖于被引用对象,因此该对象绝不能删除。 这种项只由initdb创建。用于表示依赖对象的各列包含零。
未来可能需要其他依赖关系的变种。