43.13. pg_depend #
目录pg_depend记录数据库对象之间的依赖关系。这些信息允许DROP命令查找必须被DROP CASCADE删除的其他对象,或者在DROP RESTRICT情况下阻止删除。
表 43.13. pg_depend 列
| 名称 | 类型 | 引用 | 描述 |
|---|---|---|---|
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删除依赖对象来删除。例如,表列对其数据类型有一个 normal 依赖。DEPENDENCY_AUTO(a)依赖对象可以独立于被引用对象删除,并且在被引用对象被删除时应自动删除(无论
RESTRICT还是CASCADE模式)。例如,表上的一个命名约束对表是 autodependent 的,这样表被删除时它也会消失。DEPENDENCY_INTERNAL(i)依赖对象是作为创建被引用对象的一部分而创建的,实际上只是其内部实现的一部分。对依赖对象的
DROP将被直接禁止(我们会让用户改为对被引用对象发出DROP)。无论是否指定CASCADE,对被引用对象的DROP都会传播下去删除依赖对象。例如,被视为包含pg_class行的 TOAST 表对主表有 internal 依赖。DEPENDENCY_PIN(p)没有依赖对象;这种类型的项是一个信号,表明系统自身依赖于被引用对象,因此该对象永远不能被删除。这种类型的项只能由
initdb创建。依赖对象各列的值为零。
未来的版本中可能还需要其他种类的依赖。