50.18. pg_depend
目录pg_depend记录数据库对象之间的依赖关系。这些信息允许DROP命令查找必须被DROP CASCADE删除的其他对象,或者在DROP RESTRICT情况下阻止删除。
另请参阅pg_shdepend,它对在一个数据库集簇中共享的对象之间的依赖提供了相似的功能。
表 50-18. pg_depend的列
名称 | 类型 | 引用 | 描述 |
---|---|---|---|
classid | oid | pg_class.oid | 依赖对象所在的系统目录OID |
objid | oid | any OID column | 指定依赖对象的OID |
objsubid | int4 | 对于一个表列,这里是列号(objid和classid指表本身)。对于所有其他对象类型,此列为0。 | |
refclassid | oid | pg_class.oid | 被引用对象所在的系统目录的OID |
refobjid | oid | any OID column | 指定被引用对象的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)。不管是否指定CASCADE,一个被引用对象的DROP将被传播来删除其依赖对象。例子:一个用于强制外键约束的触发器将被设置为内部依赖于其约束的pg_constraint项。
- DEPENDENCY_EXTENSION (e)
依赖对象是作为扩展的被引用对象的一个成员(参见pg_extension)。依赖对象可以通过被引用对象上的DROP EXTENSION来删除。在功能上,这种依赖类型和一个内部依赖的作用相同,其存在只是为了清晰和简化pg_dump。
- DEPENDENCY_AUTO_EXTENSION (x)
依赖对象不是作为被引用对象的扩展的成员(因此不应该被 pg_dump 忽略),但是没有被引用对象又无法工作,所以当扩展本身被删除时也应该把该依赖对象删除。该依赖对象也可以自己被删除。
- DEPENDENCY_PIN (p)
没有依赖对象,这种类型的项是一个信号,用于说明系统本身依赖于被引用对象,并且该对象永远不能被删除。这种类型的项只能被initdb创建。而此种项的依赖对象的列都为0。
在未来可能会需要其他依赖类型。