In pg_upgrade, verify that the install user has the same oid on both
clusters, and make sure the new cluster has no additional users. Backpatch to 9.1.
This commit is contained in:
parent
c0a6f9c84b
commit
b9212e379c
@ -121,17 +121,36 @@ check_new_cluster(void)
|
|||||||
{
|
{
|
||||||
set_locale_and_encoding(&new_cluster);
|
set_locale_and_encoding(&new_cluster);
|
||||||
|
|
||||||
|
check_locale_and_encoding(&old_cluster.controldata, &new_cluster.controldata);
|
||||||
|
|
||||||
get_db_and_rel_infos(&new_cluster);
|
get_db_and_rel_infos(&new_cluster);
|
||||||
|
|
||||||
check_new_cluster_is_empty();
|
check_new_cluster_is_empty();
|
||||||
check_for_prepared_transactions(&new_cluster);
|
|
||||||
|
|
||||||
check_loadable_libraries();
|
check_loadable_libraries();
|
||||||
|
|
||||||
check_locale_and_encoding(&old_cluster.controldata, &new_cluster.controldata);
|
|
||||||
|
|
||||||
if (user_opts.transfer_mode == TRANSFER_MODE_LINK)
|
if (user_opts.transfer_mode == TRANSFER_MODE_LINK)
|
||||||
check_hard_link();
|
check_hard_link();
|
||||||
|
|
||||||
|
check_is_super_user(&new_cluster);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We don't restore our own user, so both clusters must match have
|
||||||
|
* matching install-user oids.
|
||||||
|
*/
|
||||||
|
if (old_cluster.install_role_oid != new_cluster.install_role_oid)
|
||||||
|
pg_log(PG_FATAL,
|
||||||
|
"Old and new cluster install users have different values for pg_authid.oid.\n");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We only allow the install user in the new cluster because other
|
||||||
|
* defined users might match users defined in the old cluster and
|
||||||
|
* generate an error during pg_dump restore.
|
||||||
|
*/
|
||||||
|
if (new_cluster.role_count != 1)
|
||||||
|
pg_log(PG_FATAL, "Only the install user can be defined in the new cluster.\n");
|
||||||
|
|
||||||
|
check_for_prepared_transactions(&new_cluster);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -580,7 +599,7 @@ create_script_for_old_cluster_deletion(char **deletion_script_file_name)
|
|||||||
/*
|
/*
|
||||||
* check_is_super_user()
|
* check_is_super_user()
|
||||||
*
|
*
|
||||||
* Make sure we are the super-user.
|
* Check we are superuser, and out user id and user count
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
check_is_super_user(ClusterInfo *cluster)
|
check_is_super_user(ClusterInfo *cluster)
|
||||||
@ -592,7 +611,7 @@ check_is_super_user(ClusterInfo *cluster)
|
|||||||
|
|
||||||
/* Can't use pg_authid because only superusers can view it. */
|
/* Can't use pg_authid because only superusers can view it. */
|
||||||
res = executeQueryOrDie(conn,
|
res = executeQueryOrDie(conn,
|
||||||
"SELECT rolsuper "
|
"SELECT rolsuper, oid "
|
||||||
"FROM pg_catalog.pg_roles "
|
"FROM pg_catalog.pg_roles "
|
||||||
"WHERE rolname = current_user");
|
"WHERE rolname = current_user");
|
||||||
|
|
||||||
@ -600,6 +619,19 @@ check_is_super_user(ClusterInfo *cluster)
|
|||||||
pg_log(PG_FATAL, "database user \"%s\" is not a superuser\n",
|
pg_log(PG_FATAL, "database user \"%s\" is not a superuser\n",
|
||||||
os_info.user);
|
os_info.user);
|
||||||
|
|
||||||
|
cluster->install_role_oid = atooid(PQgetvalue(res, 0, 1));
|
||||||
|
|
||||||
|
PQclear(res);
|
||||||
|
|
||||||
|
res = executeQueryOrDie(conn,
|
||||||
|
"SELECT COUNT(*) "
|
||||||
|
"FROM pg_catalog.pg_roles ");
|
||||||
|
|
||||||
|
if (PQntuples(res) != 1)
|
||||||
|
pg_log(PG_FATAL, "could not determine the number of users\n");
|
||||||
|
|
||||||
|
cluster->role_count = atoi(PQgetvalue(res, 0, 0));
|
||||||
|
|
||||||
PQclear(res);
|
PQclear(res);
|
||||||
|
|
||||||
PQfinish(conn);
|
PQfinish(conn);
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
* We control all assignments of pg_enum.oid because these oids are stored
|
* We control all assignments of pg_enum.oid because these oids are stored
|
||||||
* in user tables as enum values.
|
* in user tables as enum values.
|
||||||
*
|
*
|
||||||
* We control all assignments of pg_auth.oid because these oids are stored
|
* We control all assignments of pg_authid.oid because these oids are stored
|
||||||
* in pg_largeobject_metadata.
|
* in pg_largeobject_metadata.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -232,6 +232,8 @@ typedef struct
|
|||||||
char major_version_str[64]; /* string PG_VERSION of cluster */
|
char major_version_str[64]; /* string PG_VERSION of cluster */
|
||||||
uint32 bin_version; /* version returned from pg_ctl */
|
uint32 bin_version; /* version returned from pg_ctl */
|
||||||
Oid pg_database_oid; /* OID of pg_database relation */
|
Oid pg_database_oid; /* OID of pg_database relation */
|
||||||
|
Oid install_role_oid; /* OID of connected role */
|
||||||
|
Oid role_count; /* number of roles defined in the cluster */
|
||||||
char *tablespace_suffix; /* directory specification */
|
char *tablespace_suffix; /* directory specification */
|
||||||
} ClusterInfo;
|
} ClusterInfo;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user