On Tue, Aug 2, 2011 at 5:05 PM, Tom Lane <[email protected]> wrote:
> Phil Sorber <[email protected]> writes:
>> I have included two patches in this email. The first
>> (dump_user_config_last_with_set_role.patch) is an extension of my
>> first patch. In addition to moving the ALTER ROLE statements after the
>> CREATE ROLE statements it also inserts a SET ROLE after every connect.
>> It takes the role parameter from the --role command line option. This
>> fixes the problem of not being able to restore to a database because
>> of lack of permissions. This is similar to the idea proposed here:
>> http://archives.postgresql.org/pgsql-hackers/2010-12/msg01046.php
>
> I don't understand why you think that that will fix anything?
>
> The problem that Florian originally pointed out is that settings
> established by ALTER DATABASE/ROLE could interfere with the restoration
> script's actions. That seems to be just as much of a risk for the
> --role role as the one originally used to connect. I don't see a way
> around that other than not applying those settings until we are done
> reconnecting to the target database.
>
> Also, given that the --role switch is only defined to select the role
> to be used at *dump* time, I'm unconvinced that forcing it to be used
> at *restore* time is a good idea. You'd really need to invent a
> separate switch if you were to go down this path.
>
> regards, tom lane
>
Ok, here is the patch that just moves the ALTER/SET pieces to the end.
Can we get this included in the next commit fest?
diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c
new file mode 100644
index b5f64e8..d3929f0
*** a/src/bin/pg_dump/pg_dumpall.c
--- b/src/bin/pg_dump/pg_dumpall.c
*************** static void dropTablespaces(PGconn *conn
*** 41,48 ****
static void dumpTablespaces(PGconn *conn);
static void dropDBs(PGconn *conn);
static void dumpCreateDB(PGconn *conn);
! static void dumpDatabaseConfig(PGconn *conn, const char *dbname);
! static void dumpUserConfig(PGconn *conn, const char *username);
static void dumpDbRoleConfig(PGconn *conn);
static void makeAlterConfigCommand(PGconn *conn, const char *arrayitem,
const char *type, const char *name, const char *type2,
--- 41,48 ----
static void dumpTablespaces(PGconn *conn);
static void dropDBs(PGconn *conn);
static void dumpCreateDB(PGconn *conn);
! static void dumpDatabaseConfig(PGconn *conn);
! static void dumpUserConfig(PGconn *conn);
static void dumpDbRoleConfig(PGconn *conn);
static void makeAlterConfigCommand(PGconn *conn, const char *arrayitem,
const char *type, const char *name, const char *type2,
*************** main(int argc, char *argv[])
*** 500,517 ****
/* Dump CREATE DATABASE commands */
if (!globals_only && !roles_only && !tablespaces_only)
dumpCreateDB(conn);
! /* Dump role/database settings */
! if (!tablespaces_only && !roles_only)
{
if (server_version >= 90000)
dumpDbRoleConfig(conn);
}
}
- if (!globals_only && !roles_only && !tablespaces_only)
- dumpDatabases(conn);
-
PQfinish(conn);
if (verbose)
--- 500,524 ----
/* Dump CREATE DATABASE commands */
if (!globals_only && !roles_only && !tablespaces_only)
dumpCreateDB(conn);
+ }
! if (!globals_only && !roles_only && !tablespaces_only)
! dumpDatabases(conn);
!
! if (!data_only && !tablespaces_only && server_version >= 70300)
! {
! dumpUserConfig(conn);
!
! if (!roles_only)
{
+ if (!globals_only)
+ dumpDatabaseConfig(conn);
+
if (server_version >= 90000)
dumpDbRoleConfig(conn);
}
}
PQfinish(conn);
if (verbose)
*************** dumpRoles(PGconn *conn)
*** 804,812 ****
buf, "ROLE", rolename);
fprintf(OPF, "%s", buf->data);
-
- if (server_version >= 70300)
- dumpUserConfig(conn, rolename);
}
PQclear(res);
--- 811,816 ----
*************** dumpCreateDB(PGconn *conn)
*** 1358,1366 ****
fprintf(OPF, "%s", buf->data);
- if (server_version >= 70300)
- dumpDatabaseConfig(conn, dbname);
-
free(fdbname);
}
--- 1362,1367 ----
*************** dumpCreateDB(PGconn *conn)
*** 1375,1418 ****
* Dump database-specific configuration
*/
static void
! dumpDatabaseConfig(PGconn *conn, const char *dbname)
{
! PQExpBuffer buf = createPQExpBuffer();
! int count = 1;
! for (;;)
{
! PGresult *res;
! if (server_version >= 90000)
! printfPQExpBuffer(buf, "SELECT setconfig[%d] FROM pg_db_role_setting WHERE "
! "setrole = 0 AND setdatabase = (SELECT oid FROM pg_database WHERE datname = ", count);
! else
! printfPQExpBuffer(buf, "SELECT datconfig[%d] FROM pg_database WHERE datname = ", count);
! appendStringLiteralConn(buf, dbname, conn);
! if (server_version >= 90000)
! appendPQExpBuffer(buf, ")");
! appendPQExpBuffer(buf, ";");
! res = executeQuery(conn, buf->data);
! if (PQntuples(res) == 1 &&
! !PQgetisnull(res, 0, 0))
! {
! makeAlterConfigCommand(conn, PQgetvalue(res, 0, 0),
! "DATABASE", dbname, NULL, NULL);
! PQclear(res);
! count++;
! }
! else
! {
! PQclear(res);
! break;
}
}
! destroyPQExpBuffer(buf);
}
--- 1376,1450 ----
* Dump database-specific configuration
*/
static void
! dumpDatabaseConfig(PGconn *conn)
{
! PGresult *dbres;
! int i;
! bool shown_header = false;
! if (server_version >= 70100)
! dbres = executeQuery(conn,
! "SELECT datname "
! "FROM pg_database d "
! "WHERE datallowconn ORDER BY 1");
! else
! dbres = executeQuery(conn,
! "SELECT datname "
! "FROM pg_database d "
! "ORDER BY 1");
!
! for (i = 0; i < PQntuples(dbres); i++)
{
! char *dbname = PQgetvalue(dbres, i, 0);
! PQExpBuffer buf = createPQExpBuffer();
! int count = 1;
! for (;;)
! {
! PGresult *res;
! if (server_version >= 90000)
! printfPQExpBuffer(buf, "SELECT setconfig[%d] FROM pg_db_role_setting WHERE "
! "setrole = 0 AND setdatabase = (SELECT oid FROM pg_database WHERE datname = ", count);
! else
! printfPQExpBuffer(buf, "SELECT datconfig[%d] FROM pg_database WHERE datname = ", count);
! appendStringLiteralConn(buf, dbname, conn);
! if (server_version >= 90000)
! appendPQExpBuffer(buf, ")");
!
! appendPQExpBuffer(buf, ";");
!
! res = executeQuery(conn, buf->data);
! if (PQntuples(res) == 1 &&
! !PQgetisnull(res, 0, 0))
! {
! if (!shown_header)
! {
! shown_header = true;
! fprintf(OPF, "--\n-- Database Config\n--\n\n");
! }
!
! makeAlterConfigCommand(conn, PQgetvalue(res, 0, 0),
! "DATABASE", dbname, NULL, NULL);
! PQclear(res);
! count++;
! }
! else
! {
! PQclear(res);
! break;
! }
}
+
+ destroyPQExpBuffer(buf);
}
! PQclear(dbres);
!
! if (shown_header)
! fprintf(OPF, "\n\n");
}
*************** dumpDatabaseConfig(PGconn *conn, const c
*** 1421,1464 ****
* Dump user-specific configuration
*/
static void
! dumpUserConfig(PGconn *conn, const char *username)
{
! PQExpBuffer buf = createPQExpBuffer();
! int count = 1;
! for (;;)
{
! PGresult *res;
! if (server_version >= 90000)
! printfPQExpBuffer(buf, "SELECT setconfig[%d] FROM pg_db_role_setting WHERE "
! "setdatabase = 0 AND setrole = "
! "(SELECT oid FROM pg_authid WHERE rolname = ", count);
! else if (server_version >= 80100)
! printfPQExpBuffer(buf, "SELECT rolconfig[%d] FROM pg_authid WHERE rolname = ", count);
! else
! printfPQExpBuffer(buf, "SELECT useconfig[%d] FROM pg_shadow WHERE usename = ", count);
! appendStringLiteralConn(buf, username, conn);
! if (server_version >= 90000)
! appendPQExpBuffer(buf, ")");
! res = executeQuery(conn, buf->data);
! if (PQntuples(res) == 1 &&
! !PQgetisnull(res, 0, 0))
! {
! makeAlterConfigCommand(conn, PQgetvalue(res, 0, 0),
! "ROLE", username, NULL, NULL);
! PQclear(res);
! count++;
! }
! else
{
! PQclear(res);
! break;
}
}
! destroyPQExpBuffer(buf);
}
--- 1453,1535 ----
* Dump user-specific configuration
*/
static void
! dumpUserConfig(PGconn *conn)
{
! PGresult *userres;
! int i_rolname;
! int i;
! bool shown_header = false;
! if (server_version >= 80100)
! userres = executeQuery(conn,
! "SELECT rolname "
! "FROM pg_authid "
! "ORDER BY 1");
! else
! userres = executeQuery(conn,
! "SELECT usename as rolname "
! "FROM pg_shadow "
! "UNION "
! "SELECT groname as rolname "
! "FROM pg_group "
! "ORDER BY 1");
!
! i_rolname = PQfnumber(userres, "rolname");
!
! for (i = 0; i < PQntuples(userres); i++)
{
! const char *username;
! username = PQgetvalue(userres, i, i_rolname);
! PQExpBuffer buf = createPQExpBuffer();
! int count = 1;
!
! for (;;)
{
! PGresult *res;
!
! if (server_version >= 90000)
! printfPQExpBuffer(buf, "SELECT setconfig[%d] FROM pg_db_role_setting WHERE "
! "setdatabase = 0 AND setrole = "
! "(SELECT oid FROM pg_authid WHERE rolname = ", count);
! else if (server_version >= 80100)
! printfPQExpBuffer(buf, "SELECT rolconfig[%d] FROM pg_authid WHERE rolname = ", count);
! else
! printfPQExpBuffer(buf, "SELECT useconfig[%d] FROM pg_shadow WHERE usename = ", count);
! appendStringLiteralConn(buf, username, conn);
! if (server_version >= 90000)
! appendPQExpBuffer(buf, ")");
!
! res = executeQuery(conn, buf->data);
! if (PQntuples(res) == 1 &&
! !PQgetisnull(res, 0, 0))
! {
! if (!shown_header)
! {
! shown_header = true;
! fprintf(OPF, "--\n-- Role Config\n--\n\n");
! }
!
! makeAlterConfigCommand(conn, PQgetvalue(res, 0, 0),
! "ROLE", username, NULL, NULL);
! PQclear(res);
! count++;
! }
! else
! {
! PQclear(res);
! break;
! }
}
+
+ destroyPQExpBuffer(buf);
}
! PQclear(userres);
!
! if (shown_header)
! fprintf(OPF, "\n\n");
}
--
Sent via pgsql-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers