aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlvaro Herrera <alvherre@alvh.no-ip.org>2013-01-28 17:46:47 -0300
committerAlvaro Herrera <alvherre@alvh.no-ip.org>2013-01-28 19:02:26 -0300
commitfe738d77f136a230d1d11310a4290e31a9fafb5c (patch)
tree4d26ab8457fa253b555857157e918a76d16fdac2
parent060e2435f2ee5eb053c8e9a75983fbe3f9a138f6 (diff)
downloadpostgresql-fe738d77f136a230d1d11310a4290e31a9fafb5c.tar.gz
postgresql-fe738d77f136a230d1d11310a4290e31a9fafb5c.zip
DROP OWNED: don't try to drop tablespaces/databases
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.
-rw-r--r--doc/src/sgml/ref/drop_owned.sgml9
-rw-r--r--src/backend/catalog/pg_shdepend.c13
2 files changed, 15 insertions, 7 deletions
diff --git a/doc/src/sgml/ref/drop_owned.sgml b/doc/src/sgml/ref/drop_owned.sgml
index 9dd4184916d..a7fce5f64d5 100644
--- a/doc/src/sgml/ref/drop_owned.sgml
+++ b/doc/src/sgml/ref/drop_owned.sgml
@@ -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>
@@ -92,6 +93,10 @@ DROP OWNED BY <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCAD
reassigns the ownership of all the database objects owned by one or
more roles.
</para>
+
+ <para>
+ Databases and tablespaces owned by the role(s) will not be removed.
+ </para>
</refsect1>
<refsect1>
diff --git a/src/backend/catalog/pg_shdepend.c b/src/backend/catalog/pg_shdepend.c
index 02e8d7c62e5..98248ac3ee0 100644
--- a/src/backend/catalog/pg_shdepend.c
+++ b/src/backend/catalog/pg_shdepend.c
@@ -1239,11 +1239,14 @@ shdepDropOwned(List *roleids, DropBehavior behavior)
ExecGrantStmt_oids(&istmt);
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;
}
}