1 /*-------------------------------------------------------------------------
4 * Routines to support inter-object dependencies.
7 * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
8 * Portions Copyright (c) 1994, Regents of the University of California
12 *-------------------------------------------------------------------------
17 #include "nodes/parsenodes.h" /* for DropBehavior */
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:
29 * DEPENDENCY_NORMAL ('n'): normal relationship between separately-created
30 * objects. The dependent object may be dropped without affecting the
31 * referenced object. The referenced object may only be dropped by
32 * specifying CASCADE, in which case the dependent object is dropped too.
33 * Example: a table column has a normal dependency on its datatype.
35 * DEPENDENCY_AUTO ('a'): the dependent object can be dropped separately
36 * from the referenced object, and should be automatically dropped
37 * (regardless of RESTRICT or CASCADE mode) if the referenced object
39 * Example: a named constraint on a table is made auto-dependent on
40 * the table, so that it will go away if the table is dropped.
42 * DEPENDENCY_INTERNAL ('i'): the dependent object was created as part
43 * of creation of the referenced object, and is really just a part of
44 * its internal implementation. A DROP of the dependent object will be
45 * disallowed outright (we'll tell the user to issue a DROP against the
46 * referenced object, instead). A DROP of the referenced object will be
47 * propagated through to drop the dependent object whether CASCADE is
49 * Example: a trigger that's created to enforce a foreign-key constraint
50 * is made internally dependent on the constraint's pg_constraint entry.
52 * DEPENDENCY_PIN ('p'): there is no dependent object; this type of entry
53 * is a signal that the system itself depends on the referenced object,
54 * and so that object must never be deleted. Entries of this type are
55 * created only during initdb. The fields for the dependent object
58 * Other dependency flavors may be needed in future.
61 typedef enum DependencyType
63 DEPENDENCY_NORMAL
= 'n',
64 DEPENDENCY_AUTO
= 'a',
65 DEPENDENCY_INTERNAL
= 'i',
70 * There is also a SharedDependencyType enum type that determines the exact
71 * semantics of an entry in pg_shdepend. Just like regular dependency entries,
72 * any pg_shdepend entry means that the referenced object cannot be dropped
73 * unless the dependent object is dropped at the same time. There are some
74 * additional rules however:
76 * (a) For a SHARED_DEPENDENCY_PIN entry, there is no dependent object --
77 * rather, the referenced object is an essential part of the system. This
78 * applies to the initdb-created superuser. Entries of this type are only
79 * created by initdb; objects in this category don't need further pg_shdepend
80 * entries if more objects come to depend on them.
82 * (b) a SHARED_DEPENDENCY_OWNER entry means that the referenced object is
83 * the role owning the dependent object. The referenced object must be
86 * (c) a SHARED_DEPENDENCY_ACL entry means that the referenced object is
87 * a role mentioned in the ACL field of the dependent object. The referenced
88 * object must be a pg_authid entry. (SHARED_DEPENDENCY_ACL entries are not
89 * created for the owner of an object; hence two objects may be linked by
90 * one or the other, but not both, of these dependency types.)
92 * SHARED_DEPENDENCY_INVALID is a value used as a parameter in internal
93 * routines, and is not valid in the catalog itself.
95 typedef enum SharedDependencyType
97 SHARED_DEPENDENCY_PIN
= 'p',
98 SHARED_DEPENDENCY_OWNER
= 'o',
99 SHARED_DEPENDENCY_ACL
= 'a',
100 SHARED_DEPENDENCY_INVALID
= 0
101 } SharedDependencyType
;
105 * The two objects related by a dependency are identified by ObjectAddresses.
107 typedef struct ObjectAddress
109 Oid classId
; /* Class Id from pg_class */
110 Oid objectId
; /* OID of the object */
111 int32 objectSubId
; /* Subitem within the object (column of table) */
114 /* expansible list of ObjectAddresses (private in dependency.c) */
115 typedef struct ObjectAddresses ObjectAddresses
;
118 * This enum covers all system catalogs whose OIDs can appear in
119 * pg_depend.classId or pg_shdepend.classId.
121 typedef enum ObjectClass
123 OCLASS_CLASS
, /* pg_class */
124 OCLASS_PROC
, /* pg_proc */
125 OCLASS_TYPE
, /* pg_type */
126 OCLASS_CAST
, /* pg_cast */
127 OCLASS_CONSTRAINT
, /* pg_constraint */
128 OCLASS_CONVERSION
, /* pg_conversion */
129 OCLASS_DEFAULT
, /* pg_attrdef */
130 OCLASS_LANGUAGE
, /* pg_language */
131 OCLASS_OPERATOR
, /* pg_operator */
132 OCLASS_OPCLASS
, /* pg_opclass */
133 OCLASS_OPFAMILY
, /* pg_opfamily */
134 OCLASS_AMOP
, /* pg_amop */
135 OCLASS_AMPROC
, /* pg_amproc */
136 OCLASS_REWRITE
, /* pg_rewrite */
137 OCLASS_TRIGGER
, /* pg_trigger */
138 OCLASS_SCHEMA
, /* pg_namespace */
139 OCLASS_TSPARSER
, /* pg_ts_parser */
140 OCLASS_TSDICT
, /* pg_ts_dict */
141 OCLASS_TSTEMPLATE
, /* pg_ts_template */
142 OCLASS_TSCONFIG
, /* pg_ts_config */
143 OCLASS_ROLE
, /* pg_authid */
144 OCLASS_DATABASE
, /* pg_database */
145 OCLASS_TBLSPACE
, /* pg_tablespace */
146 MAX_OCLASS
/* MUST BE LAST */
150 /* in dependency.c */
152 extern void performDeletion(const ObjectAddress
*object
,
153 DropBehavior behavior
);
155 extern void performMultipleDeletions(const ObjectAddresses
*objects
,
156 DropBehavior behavior
);
158 extern void deleteWhatDependsOn(const ObjectAddress
*object
,
161 extern void recordDependencyOnExpr(const ObjectAddress
*depender
,
162 Node
*expr
, List
*rtable
,
163 DependencyType behavior
);
165 extern void recordDependencyOnSingleRelExpr(const ObjectAddress
*depender
,
166 Node
*expr
, Oid relId
,
167 DependencyType behavior
,
168 DependencyType self_behavior
);
170 extern ObjectClass
getObjectClass(const ObjectAddress
*object
);
172 extern char *getObjectDescription(const ObjectAddress
*object
);
174 extern ObjectAddresses
*new_object_addresses(void);
176 extern void add_exact_object_address(const ObjectAddress
*object
,
177 ObjectAddresses
*addrs
);
179 extern bool object_address_present(const ObjectAddress
*object
,
180 const ObjectAddresses
*addrs
);
182 extern void record_object_address_dependencies(const ObjectAddress
*depender
,
183 ObjectAddresses
*referenced
,
184 DependencyType behavior
);
186 extern void free_object_addresses(ObjectAddresses
*addrs
);
190 extern void recordDependencyOn(const ObjectAddress
*depender
,
191 const ObjectAddress
*referenced
,
192 DependencyType behavior
);
194 extern void recordMultipleDependencies(const ObjectAddress
*depender
,
195 const ObjectAddress
*referenced
,
197 DependencyType behavior
);
199 extern long deleteDependencyRecordsFor(Oid classId
, Oid objectId
);
201 extern long changeDependencyFor(Oid classId
, Oid objectId
,
202 Oid refClassId
, Oid oldRefObjectId
,
205 extern bool sequenceIsOwned(Oid seqId
, Oid
*tableId
, int32
*colId
);
207 extern void markSequenceUnowned(Oid seqId
);
209 extern List
*getOwnedSequences(Oid relid
);
211 extern Oid
get_constraint_index(Oid constraintId
);
213 extern Oid
get_index_constraint(Oid indexId
);
215 /* in pg_shdepend.c */
217 extern void recordSharedDependencyOn(ObjectAddress
*depender
,
218 ObjectAddress
*referenced
,
219 SharedDependencyType deptype
);
221 extern void deleteSharedDependencyRecordsFor(Oid classId
, Oid objectId
);
223 extern void recordDependencyOnOwner(Oid classId
, Oid objectId
, Oid owner
);
225 extern void changeDependencyOnOwner(Oid classId
, Oid objectId
,
228 extern void updateAclDependencies(Oid classId
, Oid objectId
,
229 Oid ownerId
, bool isGrant
,
230 int noldmembers
, Oid
*oldmembers
,
231 int nnewmembers
, Oid
*newmembers
);
233 extern bool checkSharedDependencies(Oid classId
, Oid objectId
,
234 char **detail_msg
, char **detail_log_msg
);
236 extern void copyTemplateDependencies(Oid templateDbId
, Oid newDbId
);
238 extern void dropDatabaseDependencies(Oid databaseId
);
240 extern void shdepDropOwned(List
*relids
, DropBehavior behavior
);
242 extern void shdepReassignOwned(List
*relids
, Oid newrole
);
244 #endif /* DEPENDENCY_H */