mirror of
https://github.com/postgres/postgres.git
synced 2025-05-01 01:04:50 +03:00
Refine rules for altering publication owner
Previously, the new owner had to be a superuser. The new rules are more refined similar to other objects. Reviewed-by: Petr Jelinek <petr.jelinek@2ndquadrant.com>
This commit is contained in:
parent
96a7128b7b
commit
4cfc9484d4
@ -48,8 +48,11 @@ ALTER PUBLICATION <replaceable class="PARAMETER">name</replaceable> DROP TABLE <
|
||||
</para>
|
||||
|
||||
<para>
|
||||
To alter the owner, you must also be a direct or indirect member of the
|
||||
new owning role. The new owner has to be a superuser
|
||||
To alter the owner, you must also be a direct or indirect member of the new
|
||||
owning role. The new owner must have <literal>CREATE</literal> privilege on
|
||||
the database. Also, the new owner of a <literal>FOR ALL TABLES</literal>
|
||||
publication must be a superuser. However, a superuser can change the
|
||||
ownership of a publication while circumventing these restrictions.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
|
@ -670,17 +670,31 @@ AlterPublicationOwner_internal(Relation rel, HeapTuple tup, Oid newOwnerId)
|
||||
if (form->pubowner == newOwnerId)
|
||||
return;
|
||||
|
||||
if (!pg_publication_ownercheck(HeapTupleGetOid(tup), GetUserId()))
|
||||
aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_PUBLICATION,
|
||||
NameStr(form->pubname));
|
||||
if (!superuser())
|
||||
{
|
||||
AclResult aclresult;
|
||||
|
||||
/* New owner must be a superuser */
|
||||
if (!superuser_arg(newOwnerId))
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
|
||||
errmsg("permission denied to change owner of publication \"%s\"",
|
||||
NameStr(form->pubname)),
|
||||
errhint("The owner of a publication must be a superuser.")));
|
||||
/* Must be owner */
|
||||
if (!pg_publication_ownercheck(HeapTupleGetOid(tup), GetUserId()))
|
||||
aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_PUBLICATION,
|
||||
NameStr(form->pubname));
|
||||
|
||||
/* Must be able to become new owner */
|
||||
check_is_member_of_role(GetUserId(), newOwnerId);
|
||||
|
||||
/* New owner must have CREATE privilege on database */
|
||||
aclresult = pg_database_aclcheck(MyDatabaseId, newOwnerId, ACL_CREATE);
|
||||
if (aclresult != ACLCHECK_OK)
|
||||
aclcheck_error(aclresult, ACL_KIND_DATABASE,
|
||||
get_database_name(MyDatabaseId));
|
||||
|
||||
if (form->puballtables && !superuser_arg(newOwnerId))
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
|
||||
errmsg("permission denied to change owner of publication \"%s\"",
|
||||
NameStr(form->pubname)),
|
||||
errhint("The owner of a FOR ALL TABLES publication must be a superuser.")));
|
||||
}
|
||||
|
||||
form->pubowner = newOwnerId;
|
||||
CatalogTupleUpdate(rel, &tup->t_self, tup);
|
||||
|
@ -182,6 +182,14 @@ ALTER PUBLICATION testpub_default RENAME TO testpub_foo;
|
||||
|
||||
-- rename back to keep the rest simple
|
||||
ALTER PUBLICATION testpub_foo RENAME TO testpub_default;
|
||||
ALTER PUBLICATION testpub_default OWNER TO regress_publication_user2;
|
||||
\dRp testpub_default
|
||||
List of publications
|
||||
Name | Owner | Inserts | Updates | Deletes
|
||||
-----------------+---------------------------+---------+---------+---------
|
||||
testpub_default | regress_publication_user2 | t | t | t
|
||||
(1 row)
|
||||
|
||||
DROP PUBLICATION testpub_default;
|
||||
DROP PUBLICATION testpib_ins_trunct;
|
||||
DROP PUBLICATION testpub_fortbl;
|
||||
|
@ -108,6 +108,10 @@ ALTER PUBLICATION testpub_default RENAME TO testpub_foo;
|
||||
-- rename back to keep the rest simple
|
||||
ALTER PUBLICATION testpub_foo RENAME TO testpub_default;
|
||||
|
||||
ALTER PUBLICATION testpub_default OWNER TO regress_publication_user2;
|
||||
|
||||
\dRp testpub_default
|
||||
|
||||
DROP PUBLICATION testpub_default;
|
||||
DROP PUBLICATION testpib_ins_trunct;
|
||||
DROP PUBLICATION testpub_fortbl;
|
||||
|
Loading…
x
Reference in New Issue
Block a user