pg_depend 表记录数据库对象之间的依赖 关系。这个信息允许 DROP 命令找出哪些其他的对象必须 由 DROP CASCADE 删除,或者是在 DROP RESTRICT 的情况下避免删除。
Table 3-13. pg_depend 字段
名字 | 类型 | 引用 | 描述 |
---|---|---|---|
classid | oid | pg_class.oid | 有倚赖对象所在系统表的 oid |
objid | oid | 任何 oid 属性 | 指定的有依赖对象的 oid |
objsubid | int4 | 对于表属性,这个是该属性的字段数(objid和classid引用表本身)。 对于所有其他对象类型,目前这个字段是零。 | |
refclassid | oid | pg_class.oid | 被引用对象所在的系统表的 oid |
refobjid | oid | any oid attribute | 指定的被引用对象的 oid |
refobjsubid | int4 | 对于表属性,这个是该属性的字段数(objid和classid引用表本身)。 对于所有其他对象类型,目前这个字段是零。 | |
deptype | char | 一个定义这个依赖关系特定语义的代码。 |
在所有情况下,一个 pg_depend 记录表示 被引用的对象不能在有依赖的对象被删除前删除。不过,这里还有几种 由 deptype 定义的情况:
DEPENDENCY_NORMAL ('n'):独立创建的对象之间的一般关系。 有倚赖的对象可以在不影响被引用对象的情况下删除。被引用对象 只有在声明了 CASCADE 的情况下删除,这时有依赖的对象也被删除。 例子:一个表字段对其数据类型有一般依赖关系。
DEPENDENCY_AUTO ('a');有依赖对象可以和被引用对象分别删除, 并且如果删除了被引用对象则应该被自动删除(不管是 RESTRICT 还是 CASCADE 模式)。 例子:一个表上面的命名约束是在该表上的自动依赖关系,因此 如果删除了表,它也会被删除。
DEPENDENCY_INTERNAL ('i'):有依赖的对象是作为被引用对象的一部分创建的, 实际上只是它的内部实现的一部分。DROP 有依赖对象是不能直接允许的(我们 将告诉用户发出一条删除被引用对象的 DROP)。一个对被引用对象的 DROP 将传播到有依赖对象,不管是否声明了 CASCADE。 例子:一个创建来强制外键约束的触发器在该约束的 pg_constraint 记录上是标记为内部依赖的。
DEPENDENCY_PIN ('p'):无有依赖对象;这种类型的记录标志着系统本身依赖 于被引用对象,因此这个对象决不能被删除。这种类型的记录只有在 initdb 的 时候创建。有依赖对象的字段里是零。
将来可能还会有其他依赖的风格。