52.18. pg_depend #
В каталоге pg_depend записываются отношения зависимости между объектами базы данных. Благодаря этой информации, команды DROP могут найти, какие объекты должны удаляться при использовании DROP CASCADE, или когда нужно запрещать удаление при DROP RESTRICT.
Также смотрите описание каталога pg_shdepend, который играет подобную роль в отношении совместно используемых объектов в кластере баз данных.
Таблица 52.18. Столбцы pg_depend
Тип столбца Описание |
|---|
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, попытка удаления некоторого другого объекта, от которого зависит подчинённый, не приводит к автоматическому удалению какого-либо из связанных секционированных отношений. Таким образом, если удаление не доходит до минимум одного из вышестоящих объектов по какому-то пути, оно не будет произведено. (В большинстве случаев подчинённый объект разделяет все свои несекционные зависимости с минимум одним секционно-связанным объектом, чтобы это ограничение не блокировало каскадные удаления.) Первичные (PRI) и вторичные (SEC) секционные зависимости похожи, и отличаются только тем, что первичные зависимости предпочитаются при формировании сообщений об ошибках; поэтому секционно-подчинённый объект, как правило, будет иметь одну первичную секционную зависимость и одну или несколько вторичных. Заметьте, что секционные зависимости создаются в дополнение, но не вместо обычных зависимостей, которые будет иметь объект. Это упрощает операции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, считаются «закреплёнными», что означает, что сама система зависит от них. Поэтому их нельзя удалять ни при каких условиях. Кроме того, зная, что закреплённые объекты не будут удалены, механизм зависимостей не создаёт в pg_depend записи, показывающие зависимости от этих объектов. Так, например, столбец таблицы типа numeric условно имеет зависимость NORMAL от типа данных numeric, но на самом деле такая запись не появляется в pg_depend.
52.18. pg_depend #
The catalog pg_depend records the dependency relationships between database objects. This information allows DROP commands to find which other objects must be dropped by DROP CASCADE or prevent dropping in the DROP RESTRICT case.
See also pg_shdepend, which performs a similar function for dependencies involving objects that are shared across a database cluster.
Table 52.18. pg_depend Columns
Column Type Description |
|---|
The OID of the system catalog the dependent object is in |
The OID of the specific dependent object |
For a table column, this is the column number (the |
The OID of the system catalog the referenced object is in |
The OID of the specific referenced object |
For a table column, this is the column number (the |
A code defining the specific semantics of this dependency relationship; see text |
In all cases, a pg_depend entry indicates that the referenced object cannot be dropped without also dropping the dependent object. However, there are several subflavors identified by deptype:
DEPENDENCY_NORMAL(n)A normal relationship between separately-created objects. The dependent object can be dropped without affecting the referenced object. The referenced object can only be dropped by specifying
CASCADE, in which case the dependent object is dropped, too. Example: a table column has a normal dependency on its data type.DEPENDENCY_AUTO(a)The dependent object can be dropped separately from the referenced object, and should be automatically dropped (regardless of
RESTRICTorCASCADEmode) if the referenced object is dropped. Example: a named constraint on a table is made auto-dependent on the table, so that it will go away if the table is dropped.DEPENDENCY_INTERNAL(i)The dependent object was created as part of creation of the referenced object, and is really just a part of its internal implementation. A direct
DROPof the dependent object will be disallowed outright (we'll tell the user to issue aDROPagainst the referenced object, instead). ADROPof the referenced object will result in automatically dropping the dependent object whetherCASCADEis specified or not. If the dependent object has to be dropped due to a dependency on some other object being removed, its drop is converted to a drop of the referenced object, so thatNORMALandAUTOdependencies of the dependent object behave much like they were dependencies of the referenced object. Example: a view'sON SELECTrule is made internally dependent on the view, preventing it from being dropped while the view remains. Dependencies of the rule (such as tables it refers to) act as if they were dependencies of the view.DEPENDENCY_PARTITION_PRI(P)DEPENDENCY_PARTITION_SEC(S)The dependent object was created as part of creation of the referenced object, and is really just a part of its internal implementation; however, unlike
INTERNAL, there is more than one such referenced object. The dependent object must not be dropped unless at least one of these referenced objects is dropped; if any one is, the dependent object should be dropped whether or notCASCADEis specified. Also unlikeINTERNAL, a drop of some other object that the dependent object depends on does not result in automatic deletion of any partition-referenced object. Hence, if the drop does not cascade to at least one of these objects via some other path, it will be refused. (In most cases, the dependent object shares all its non-partition dependencies with at least one partition-referenced object, so that this restriction does not result in blocking any cascaded delete.) Primary and secondary partition dependencies behave identically except that the primary dependency is preferred for use in error messages; hence, a partition-dependent object should have one primary partition dependency and one or more secondary partition dependencies. Note that partition dependencies are made in addition to, not instead of, any dependencies the object would normally have. This simplifiesATTACH/DETACH PARTITIONoperations: the partition dependencies need only be added or removed. Example: a child partitioned index is made partition-dependent on both the partition table it is on and the parent partitioned index, so that it goes away if either of those is dropped, but not otherwise. The dependency on the parent index is primary, so that if the user tries to drop the child partitioned index, the error message will suggest dropping the parent index instead (not the table).DEPENDENCY_EXTENSION(e)The dependent object is a member of the extension that is the referenced object (see
pg_extension). The dependent object can be dropped only viaDROP EXTENSIONon the referenced object. Functionally this dependency type acts the same as anINTERNALdependency, but it's kept separate for clarity and to simplify pg_dump.DEPENDENCY_AUTO_EXTENSION(x)The dependent object is not a member of the extension that is the referenced object (and so it should not be ignored by pg_dump), but it cannot function without the extension and should be auto-dropped if the extension is. The dependent object may be dropped on its own as well. Functionally this dependency type acts the same as an
AUTOdependency, but it's kept separate for clarity and to simplify pg_dump.
Other dependency flavors might be needed in future.
Note that it's quite possible for two objects to be linked by more than one pg_depend entry. For example, a child partitioned index would have both a partition-type dependency on its associated partition table, and an auto dependency on each column of that table that it indexes. This sort of situation expresses the union of multiple dependency semantics. A dependent object can be dropped without CASCADE if any of its dependencies satisfies its condition for automatic dropping. Conversely, all the dependencies' restrictions about which objects must be dropped together must be satisfied.
Most objects created during initdb are considered “pinned”, which means that the system itself depends on them. Therefore, they are never allowed to be dropped. Also, knowing that pinned objects will not be dropped, the dependency mechanism doesn't bother to make pg_depend entries showing dependencies on them. Thus, for example, a table column of type numeric notionally has a NORMAL dependency on the numeric data type, but no such entry actually appears in pg_depend.