]> granicus.if.org Git - postgresql/commitdiff
DROP OWNED: don't try to drop tablespaces/databases
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Mon, 28 Jan 2013 20:46:47 +0000 (17:46 -0300)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Mon, 28 Jan 2013 21:59:55 +0000 (18:59 -0300)
My "fix" for bugs #7578 and #6116 on DROP OWNED at fe3b5eb08a1 not only
misstated that it applied to REASSIGN OWNED (which it did not affect),
but it also failed to fix the problems fully, because I didn't test the
case of owned shared objects.  Thus I created a new bug, reported by
Thomas Kellerer as #7748, which would cause DROP OWNED to fail with a
not-for-user-consumption error message.  The code would attempt to drop
the database, which not only fails to work because the underlying code
does not support that, but is a pretty dangerous and undesirable thing
to be doing as well.

This patch fixes that bug by having DROP OWNED only attempt to process
shared objects when grants on them are found, ignoring ownership.

Backpatch to 8.3, which is as far as the previous bug was backpatched.

doc/src/sgml/ref/drop_owned.sgml
src/backend/catalog/pg_shdepend.c

index a453af58d14f5d6afd97e59db06d1066101ce770..48cf0fa535bf25a5d4bc087f1de2b23d9581104f 100644 (file)
@@ -29,10 +29,11 @@ DROP OWNED BY <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCAD
   <title>Description</title>
 
   <para>
-   <command>DROP OWNED</command> drops all the objects in the current
+   <command>DROP OWNED</command> drops all the objects within the current
    database that are owned by one of the specified roles. Any
    privileges granted to the given roles on objects in the current
-   database will also be revoked.
+   database and on shared objects (databases, tablespaces) will also be
+   revoked.
   </para>
  </refsect1>
 
@@ -93,7 +94,7 @@ DROP OWNED BY <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCAD
   </para>
 
   <para>
-   Databases owned by the role(s) will not be removed.
+   Databases and tablespaces owned by the role(s) will not be removed.
   </para>
  </refsect1>
 
index 8d2d37c730a157c241453600075c8a6b3f82a186..91e26f4e159db81e8967bb149363d521cd3da8ec 100644 (file)
@@ -1235,11 +1235,14 @@ shdepDropOwned(List *roleids, DropBehavior behavior)
                                                                                        sdepForm->objid);
                                        break;
                                case SHARED_DEPENDENCY_OWNER:
-                                       /* Save it for deletion below */
-                                       obj.classId = sdepForm->classid;
-                                       obj.objectId = sdepForm->objid;
-                                       obj.objectSubId = sdepForm->objsubid;
-                                       add_exact_object_address(&obj, deleteobjs);
+                                       /* If a local object, save it for deletion below */
+                                       if (sdepForm->dbid == MyDatabaseId)
+                                       {
+                                               obj.classId = sdepForm->classid;
+                                               obj.objectId = sdepForm->objid;
+                                               obj.objectSubId = sdepForm->objsubid;
+                                               add_exact_object_address(&obj, deleteobjs);
+                                       }
                                        break;
                        }
                }