1 /*-------------------------------------------------------------------------
4 * Routines to support inter-object dependencies.
7 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
8 * Portions Copyright (c) 1994, Regents of the University of California
10 * src/include/catalog/dependency.h
12 *-------------------------------------------------------------------------
17 #include "catalog/objectaddress.h"
21 * Precise semantics of a dependency relationship are specified by the
22 * DependencyType code (which is stored in a "char" field in pg_depend,
23 * so we assign ASCII-code values to the enumeration members).
25 * In all cases, a dependency relationship indicates that the referenced
26 * object may not be dropped without also dropping the dependent object.
27 * However, there are several subflavors; see the description of pg_depend
28 * in catalogs.sgml for details.
31 typedef enum DependencyType
33 DEPENDENCY_NORMAL
= 'n',
34 DEPENDENCY_AUTO
= 'a',
35 DEPENDENCY_INTERNAL
= 'i',
36 DEPENDENCY_PARTITION_PRI
= 'P',
37 DEPENDENCY_PARTITION_SEC
= 'S',
38 DEPENDENCY_EXTENSION
= 'e',
39 DEPENDENCY_AUTO_EXTENSION
= 'x',
43 * There is also a SharedDependencyType enum type that determines the exact
44 * semantics of an entry in pg_shdepend. Just like regular dependency entries,
45 * any pg_shdepend entry means that the referenced object cannot be dropped
46 * unless the dependent object is dropped at the same time. There are some
47 * additional rules however:
49 * (a) a SHARED_DEPENDENCY_OWNER entry means that the referenced object is
50 * the role owning the dependent object. The referenced object must be
53 * (b) a SHARED_DEPENDENCY_ACL entry means that the referenced object is
54 * a role mentioned in the ACL field of the dependent object. The referenced
55 * object must be a pg_authid entry. (SHARED_DEPENDENCY_ACL entries are not
56 * created for the owner of an object; hence two objects may be linked by
57 * one or the other, but not both, of these dependency types.)
59 * (c) a SHARED_DEPENDENCY_INITACL entry means that the referenced object is
60 * a role mentioned in a pg_init_privs entry for the dependent object.
61 * The referenced object must be a pg_authid entry. (Unlike the case for
62 * SHARED_DEPENDENCY_ACL, we make an entry for such a role whether or not
63 * it is the object's owner.)
65 * (d) a SHARED_DEPENDENCY_POLICY entry means that the referenced object is
66 * a role mentioned in a policy object. The referenced object must be a
69 * (e) a SHARED_DEPENDENCY_TABLESPACE entry means that the referenced
70 * object is a tablespace mentioned in a relation without storage. The
71 * referenced object must be a pg_tablespace entry. (Relations that have
72 * storage don't need this: they are protected by the existence of a physical
73 * file in the tablespace.)
75 * SHARED_DEPENDENCY_INVALID is a value used as a parameter in internal
76 * routines, and is not valid in the catalog itself.
78 typedef enum SharedDependencyType
80 SHARED_DEPENDENCY_OWNER
= 'o',
81 SHARED_DEPENDENCY_ACL
= 'a',
82 SHARED_DEPENDENCY_INITACL
= 'i',
83 SHARED_DEPENDENCY_POLICY
= 'r',
84 SHARED_DEPENDENCY_TABLESPACE
= 't',
85 SHARED_DEPENDENCY_INVALID
= 0,
86 } SharedDependencyType
;
88 /* expansible list of ObjectAddresses (private in dependency.c) */
89 typedef struct ObjectAddresses ObjectAddresses
;
91 /* flag bits for performDeletion/performMultipleDeletions: */
92 #define PERFORM_DELETION_INTERNAL 0x0001 /* internal action */
93 #define PERFORM_DELETION_CONCURRENTLY 0x0002 /* concurrent drop */
94 #define PERFORM_DELETION_QUIETLY 0x0004 /* suppress notices */
95 #define PERFORM_DELETION_SKIP_ORIGINAL 0x0008 /* keep original obj */
96 #define PERFORM_DELETION_SKIP_EXTENSIONS 0x0010 /* keep extensions */
97 #define PERFORM_DELETION_CONCURRENT_LOCK 0x0020 /* normal drop with
98 * concurrent lock mode */
101 /* in dependency.c */
103 extern void AcquireDeletionLock(const ObjectAddress
*object
, int flags
);
105 extern void ReleaseDeletionLock(const ObjectAddress
*object
);
107 extern void performDeletion(const ObjectAddress
*object
,
108 DropBehavior behavior
, int flags
);
110 extern void performMultipleDeletions(const ObjectAddresses
*objects
,
111 DropBehavior behavior
, int flags
);
113 extern void recordDependencyOnExpr(const ObjectAddress
*depender
,
114 Node
*expr
, List
*rtable
,
115 DependencyType behavior
);
117 extern void recordDependencyOnSingleRelExpr(const ObjectAddress
*depender
,
118 Node
*expr
, Oid relId
,
119 DependencyType behavior
,
120 DependencyType self_behavior
,
123 extern ObjectAddresses
*new_object_addresses(void);
125 extern void add_exact_object_address(const ObjectAddress
*object
,
126 ObjectAddresses
*addrs
);
128 extern bool object_address_present(const ObjectAddress
*object
,
129 const ObjectAddresses
*addrs
);
131 extern void record_object_address_dependencies(const ObjectAddress
*depender
,
132 ObjectAddresses
*referenced
,
133 DependencyType behavior
);
135 extern void sort_object_addresses(ObjectAddresses
*addrs
);
137 extern void free_object_addresses(ObjectAddresses
*addrs
);
141 extern void recordDependencyOn(const ObjectAddress
*depender
,
142 const ObjectAddress
*referenced
,
143 DependencyType behavior
);
145 extern void recordMultipleDependencies(const ObjectAddress
*depender
,
146 const ObjectAddress
*referenced
,
148 DependencyType behavior
);
150 extern void recordDependencyOnCurrentExtension(const ObjectAddress
*object
,
153 extern void checkMembershipInCurrentExtension(const ObjectAddress
*object
);
155 extern long deleteDependencyRecordsFor(Oid classId
, Oid objectId
,
156 bool skipExtensionDeps
);
158 extern long deleteDependencyRecordsForClass(Oid classId
, Oid objectId
,
159 Oid refclassId
, char deptype
);
161 extern long deleteDependencyRecordsForSpecific(Oid classId
, Oid objectId
,
163 Oid refclassId
, Oid refobjectId
);
165 extern long changeDependencyFor(Oid classId
, Oid objectId
,
166 Oid refClassId
, Oid oldRefObjectId
,
169 extern long changeDependenciesOf(Oid classId
, Oid oldObjectId
,
172 extern long changeDependenciesOn(Oid refClassId
, Oid oldRefObjectId
,
175 extern Oid
getExtensionOfObject(Oid classId
, Oid objectId
);
176 extern List
*getAutoExtensionsOfObject(Oid classId
, Oid objectId
);
178 extern bool sequenceIsOwned(Oid seqId
, char deptype
, Oid
*tableId
, int32
*colId
);
179 extern List
*getOwnedSequences(Oid relid
);
180 extern Oid
getIdentitySequence(Relation rel
, AttrNumber attnum
, bool missing_ok
);
182 extern Oid
get_index_constraint(Oid indexId
);
184 extern List
*get_index_ref_constraints(Oid indexId
);
186 /* in pg_shdepend.c */
188 extern void recordSharedDependencyOn(ObjectAddress
*depender
,
189 ObjectAddress
*referenced
,
190 SharedDependencyType deptype
);
192 extern void deleteSharedDependencyRecordsFor(Oid classId
, Oid objectId
,
195 extern void recordDependencyOnOwner(Oid classId
, Oid objectId
, Oid owner
);
197 extern void changeDependencyOnOwner(Oid classId
, Oid objectId
,
200 extern void recordDependencyOnTablespace(Oid classId
, Oid objectId
,
203 extern void changeDependencyOnTablespace(Oid classId
, Oid objectId
,
204 Oid newTablespaceId
);
206 extern void updateAclDependencies(Oid classId
, Oid objectId
, int32 objsubId
,
208 int noldmembers
, Oid
*oldmembers
,
209 int nnewmembers
, Oid
*newmembers
);
211 extern void updateInitAclDependencies(Oid classId
, Oid objectId
, int32 objsubId
,
212 int noldmembers
, Oid
*oldmembers
,
213 int nnewmembers
, Oid
*newmembers
);
215 extern bool checkSharedDependencies(Oid classId
, Oid objectId
,
216 char **detail_msg
, char **detail_log_msg
);
218 extern void shdepLockAndCheckObject(Oid classId
, Oid objectId
);
220 extern void copyTemplateDependencies(Oid templateDbId
, Oid newDbId
);
222 extern void dropDatabaseDependencies(Oid databaseId
);
224 extern void shdepDropOwned(List
*roleids
, DropBehavior behavior
);
226 extern void shdepReassignOwned(List
*roleids
, Oid newrole
);
228 #endif /* DEPENDENCY_H */