51.48. pg_shdepend #

В каталоге pg_shdepend записываются отношения зависимости между объектами баз данных и разделяемыми объектами, такими как роли. Эта информация позволяет PostgreSQL удостовериться, что эти объекты не используется, прежде чем удалять их.

Также смотрите каталог pg_depend, который играет подобную роль в отношении зависимостей объектов в одной базе данных.

В отличие от большинства системных каталогов, pg_shdepend разделяется всеми базами данных кластера: есть только один экземпляр pg_shdepend в кластере, а не отдельные в каждой базе данных.

Таблица 51.48. Столбцы pg_shdepend

Тип столбца

Описание

dbid oid (ссылается на pg_database.oid)

OID базы данных, в которой находится зависимый объект, или ноль, если это глобальный объект

classid oid (ссылается на pg_class.oid)

OID системного каталога, в котором находится зависимый объект

objid oid (ссылается на какой-либо столбец OID)

OID определённого зависимого объекта

objsubid int4

Для столбца таблицы это номер столбца (objid и classid указывают на саму таблицу). Для всех других типов объектов это поле содержит ноль.

refclassid oid (ссылается на pg_class.oid)

OID системного каталога, к которому относится вышестоящий объект (это должен быть разделяемый каталог)

refobjid oid (ссылается на какой-либо столбец OID)

OID определённого вышестоящего объекта

deptype char

Код, определяющий конкретную семантику данного отношения зависимости; см. текст


Во всех случаях запись в pg_shdepend показывает, что вышестоящий объект нельзя удалить, не удаляя подчинённый объект. Однако есть несколько подвидов зависимости, задаваемых в поле deptype:

SHARED_DEPENDENCY_OWNER (o)

Вышестоящий объект (это должна быть роль) является владельцем зависимого объекта.

SHARED_DEPENDENCY_ACL (a)

Вышестоящий объект (это должна быть роль) упоминается в ACL (списке управления доступом, то есть списке прав) подчинённого объекта. (Запись SHARED_DEPENDENCY_ACL не создаётся для владельца объекта, так как для владельца всё равно имеется запись SHARED_DEPENDENCY_OWNER.)

SHARED_DEPENDENCY_INITACL (i)

Вышестоящий объект (это должна быть роль) упоминается в записи pg_init_privs зависимого объекта.

SHARED_DEPENDENCY_POLICY (r)

Вышестоящий объект (это должна быть роль) упомянут в качестве целевого в объекте зависимой политики.

SHARED_DEPENDENCY_TABLESPACE (t)

Вышестоящий объект (это должно быть табличное пространство) упомянут в качестве табличного пространства для отношения, которое нигде не хранится.

В будущем могут появиться и другие подвиды зависимости. Заметьте в частности, что с текущим определением вышестоящими объектами могут быть только роли и табличные пространства.

Как и в каталоге pg_depend, большинство объектов, созданных во время работы initdb, считаются «закреплёнными». В pg_shdepend не добавляются никакие записи, в которых закреплённые объекты являлись бы зависимыми или зависящими.