]> granicus.if.org Git - postgresql/commitdiff
REASSIGN OWNED: handle shared objects, too
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Mon, 28 Jan 2013 21:03:23 +0000 (18:03 -0300)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Mon, 28 Jan 2013 21:45:50 +0000 (18:45 -0300)
Give away ownership of shared objects (databases, tablespaces) along
with local objects, per original code intention.  Try to make the
documentation clearer, too.

Per discussion about DROP OWNED's brokenness, in bug #7748.

This is not backpatched because it'd require some refactoring of the
ALTER/SET OWNER code for databases and tablespaces.

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

index 57f2e59996c630554026da53d2f89d6d4b448935..0d6b1787e29da459f15d7d89a20dd3a405f58799 100644 (file)
@@ -30,7 +30,7 @@ REASSIGN OWNED BY <replaceable class="PARAMETER">old_role</replaceable> [, ...]
 
   <para>
    <command>REASSIGN OWNED</command> instructs the system to change
-   the ownership of the database objects owned by one of the
+   the ownership of database objects owned by one of the
    old_roles, to new_role.
   </para>
  </refsect1>
@@ -43,8 +43,9 @@ REASSIGN OWNED BY <replaceable class="PARAMETER">old_role</replaceable> [, ...]
     <term><replaceable class="PARAMETER">old_role</replaceable></term>
     <listitem>
      <para>
-      The name of a role. The ownership of all the objects in the
-      current database owned by this role will be reassigned to
+      The name of a role. The ownership of all the objects within the
+      current database, and of all shared objects (databases, tablespaces),
+      owned by this role will be reassigned to
       <replaceable class="PARAMETER">new_role</replaceable>.
      </para>
     </listitem>
@@ -68,7 +69,7 @@ REASSIGN OWNED BY <replaceable class="PARAMETER">old_role</replaceable> [, ...]
   <para>
    <command>REASSIGN OWNED</command> is often used to prepare for the
    removal of one or more roles. Because <command>REASSIGN
-   OWNED</command> only affects the objects in the current database,
+   OWNED</command> does not affect objects within other databases,
    it is usually necessary to execute this command in each database
    that contains objects owned by a role that is to be removed.
   </para>
@@ -92,12 +93,6 @@ REASSIGN OWNED BY <replaceable class="PARAMETER">old_role</replaceable> [, ...]
    privileges.
   </para>
 
-  <para>
-   The <command>REASSIGN OWNED</command> command does not affect the
-   ownership of any databases owned by the role.  Use
-   <xref linkend="sql-alterdatabase"> to reassign that ownership.
-  </para>
-
  </refsect1>
 
  <refsect1>
index 4a85438ff5edb7e8c9a86cdfafd79d89f1a43b7d..e411372fec2f24a378b1b4da75bcf8f7c721c6a8 100644 (file)
@@ -1325,8 +1325,12 @@ shdepReassignOwned(List *roleids, Oid newrole)
                {
                        Form_pg_shdepend sdepForm = (Form_pg_shdepend) GETSTRUCT(tuple);
 
-                       /* We only operate on objects in the current database */
-                       if (sdepForm->dbid != MyDatabaseId)
+                       /*
+                        * We only operate on shared objects and objects in the current
+                        * database
+                        */
+                       if (sdepForm->dbid != MyDatabaseId &&
+                               sdepForm->dbid != InvalidOid)
                                continue;
 
                        /* Unexpected because we checked for pins above */
@@ -1388,6 +1392,8 @@ shdepReassignOwned(List *roleids, Oid newrole)
                                case OperatorFamilyRelationId:
                                case OperatorClassRelationId:
                                case ExtensionRelationId:
+                               case TableSpaceRelationId:
+                               case DatabaseRelationId:
                                        {
                                                Oid                     classId = sdepForm->classid;
                                                Relation        catalog;