]> granicus.if.org Git - postgresql/blob - src/include/catalog/dependency.h
Create an ALTER DEFAULT PRIVILEGES command, which allows users to adjust
[postgresql] / src / include / catalog / dependency.h
1 /*-------------------------------------------------------------------------
2  *
3  * dependency.h
4  *        Routines to support inter-object dependencies.
5  *
6  *
7  * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
8  * Portions Copyright (c) 1994, Regents of the University of California
9  *
10  * $PostgreSQL: pgsql/src/include/catalog/dependency.h,v 1.41 2009/10/05 19:24:48 tgl Exp $
11  *
12  *-------------------------------------------------------------------------
13  */
14 #ifndef DEPENDENCY_H
15 #define DEPENDENCY_H
16
17 #include "nodes/parsenodes.h"   /* for DropBehavior */
18
19
20 /*
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).
24  *
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:
28  *
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.
34  *
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
38  * is dropped.
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.
41  *
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
48  * specified or not.
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.
51  *
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
56  * contain zeroes.
57  *
58  * Other dependency flavors may be needed in future.
59  */
60
61 typedef enum DependencyType
62 {
63         DEPENDENCY_NORMAL = 'n',
64         DEPENDENCY_AUTO = 'a',
65         DEPENDENCY_INTERNAL = 'i',
66         DEPENDENCY_PIN = 'p'
67 } DependencyType;
68
69 /*
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:
75  *
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.
81  *
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
84  * a pg_authid entry.
85  *
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.)
91  *
92  * SHARED_DEPENDENCY_INVALID is a value used as a parameter in internal
93  * routines, and is not valid in the catalog itself.
94  */
95 typedef enum SharedDependencyType
96 {
97         SHARED_DEPENDENCY_PIN = 'p',
98         SHARED_DEPENDENCY_OWNER = 'o',
99         SHARED_DEPENDENCY_ACL = 'a',
100         SHARED_DEPENDENCY_INVALID = 0
101 } SharedDependencyType;
102
103
104 /*
105  * The two objects related by a dependency are identified by ObjectAddresses.
106  */
107 typedef struct ObjectAddress
108 {
109         Oid                     classId;                /* Class Id from pg_class */
110         Oid                     objectId;               /* OID of the object */
111         int32           objectSubId;    /* Subitem within object (eg column), or 0 */
112 } ObjectAddress;
113
114 /* expansible list of ObjectAddresses (private in dependency.c) */
115 typedef struct ObjectAddresses ObjectAddresses;
116
117 /*
118  * This enum covers all system catalogs whose OIDs can appear in
119  * pg_depend.classId or pg_shdepend.classId.
120  */
121 typedef enum ObjectClass
122 {
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         OCLASS_FDW,                                     /* pg_foreign_data_wrapper */
147         OCLASS_FOREIGN_SERVER,          /* pg_foreign_server */
148         OCLASS_USER_MAPPING,            /* pg_user_mapping */
149         OCLASS_DEFACL,                          /* pg_default_acl */
150         MAX_OCLASS                                      /* MUST BE LAST */
151 } ObjectClass;
152
153
154 /* in dependency.c */
155
156 extern void performDeletion(const ObjectAddress *object,
157                                 DropBehavior behavior);
158
159 extern void performMultipleDeletions(const ObjectAddresses *objects,
160                                                  DropBehavior behavior);
161
162 extern void deleteWhatDependsOn(const ObjectAddress *object,
163                                         bool showNotices);
164
165 extern void recordDependencyOnExpr(const ObjectAddress *depender,
166                                            Node *expr, List *rtable,
167                                            DependencyType behavior);
168
169 extern void recordDependencyOnSingleRelExpr(const ObjectAddress *depender,
170                                                                 Node *expr, Oid relId,
171                                                                 DependencyType behavior,
172                                                                 DependencyType self_behavior);
173
174 extern ObjectClass getObjectClass(const ObjectAddress *object);
175
176 extern char *getObjectDescription(const ObjectAddress *object);
177
178 extern ObjectAddresses *new_object_addresses(void);
179
180 extern void add_exact_object_address(const ObjectAddress *object,
181                                                  ObjectAddresses *addrs);
182
183 extern bool object_address_present(const ObjectAddress *object,
184                                            const ObjectAddresses *addrs);
185
186 extern void record_object_address_dependencies(const ObjectAddress *depender,
187                                                                    ObjectAddresses *referenced,
188                                                                    DependencyType behavior);
189
190 extern void free_object_addresses(ObjectAddresses *addrs);
191
192 /* in pg_depend.c */
193
194 extern void recordDependencyOn(const ObjectAddress *depender,
195                                    const ObjectAddress *referenced,
196                                    DependencyType behavior);
197
198 extern void recordMultipleDependencies(const ObjectAddress *depender,
199                                                    const ObjectAddress *referenced,
200                                                    int nreferenced,
201                                                    DependencyType behavior);
202
203 extern long deleteDependencyRecordsFor(Oid classId, Oid objectId);
204
205 extern long changeDependencyFor(Oid classId, Oid objectId,
206                                         Oid refClassId, Oid oldRefObjectId,
207                                         Oid newRefObjectId);
208
209 extern bool sequenceIsOwned(Oid seqId, Oid *tableId, int32 *colId);
210
211 extern void markSequenceUnowned(Oid seqId);
212
213 extern List *getOwnedSequences(Oid relid);
214
215 extern Oid      get_constraint_index(Oid constraintId);
216
217 extern Oid      get_index_constraint(Oid indexId);
218
219 /* in pg_shdepend.c */
220
221 extern void recordSharedDependencyOn(ObjectAddress *depender,
222                                                  ObjectAddress *referenced,
223                                                  SharedDependencyType deptype);
224
225 extern void deleteSharedDependencyRecordsFor(Oid classId, Oid objectId,
226                                                                  int32 objectSubId);
227
228 extern void recordDependencyOnOwner(Oid classId, Oid objectId, Oid owner);
229
230 extern void changeDependencyOnOwner(Oid classId, Oid objectId,
231                                                 Oid newOwnerId);
232
233 extern void updateAclDependencies(Oid classId, Oid objectId, int32 objectSubId,
234                                           Oid ownerId, bool isGrant,
235                                           int noldmembers, Oid *oldmembers,
236                                           int nnewmembers, Oid *newmembers);
237
238 extern bool checkSharedDependencies(Oid classId, Oid objectId,
239                                                 char **detail_msg, char **detail_log_msg);
240
241 extern void copyTemplateDependencies(Oid templateDbId, Oid newDbId);
242
243 extern void dropDatabaseDependencies(Oid databaseId);
244
245 extern void shdepDropOwned(List *relids, DropBehavior behavior);
246
247 extern void shdepReassignOwned(List *relids, Oid newrole);
248
249 #endif   /* DEPENDENCY_H */