]> granicus.if.org Git - postgresql/commitdiff
Fix pg_dumpall to work for databases flagged as read-only.
authorKevin Grittner <kgrittn@postgresql.org>
Sat, 30 Nov 2013 17:33:04 +0000 (11:33 -0600)
committerKevin Grittner <kgrittn@postgresql.org>
Sat, 30 Nov 2013 17:33:04 +0000 (11:33 -0600)
pg_dumpall's charter is to be able to recreate a database cluster's
contents in a virgin installation, but it was failing to honor that
contract if the cluster had any ALTER DATABASE SET
default_transaction_read_only settings.  By including a SET command
for the connection for each connection opened by pg_dumpall output,
errors are avoided and the source cluster is successfully
recreated.

There was discussion of whether to also set this for the connection
applying pg_dump output, but it was felt that it was both less
appropriate in that context, and far easier to work around.

Backpatch to all supported branches.

src/bin/pg_dump/pg_dumpall.c

index 12533073d810894afef1afc8fa2431b3d5e894cd..87d3b2a4ce47f7ff6769c991b72e7130ab31cc8e 100644 (file)
@@ -452,6 +452,9 @@ main(int argc, char *argv[])
         * database we're connected to at the moment is fine.
         */
 
+       /* Restore will need to write to the target cluster */
+       fprintf(OPF, "SET default_transaction_read_only = off;\n\n");
+
        /* Replicate encoding and std_strings in output */
        fprintf(OPF, "SET client_encoding = '%s';\n",
                        pg_encoding_to_char(encoding));
@@ -1600,6 +1603,17 @@ dumpDatabases(PGconn *conn)
 
                fprintf(OPF, "\\connect %s\n\n", fmtId(dbname));
 
+               /*
+                * Restore will need to write to the target cluster.  This connection
+                * setting is emitted for pg_dumpall rather than in the code also used
+                * by pg_dump, so that a cluster with databases or users which have
+                * this flag turned on can still be replicated through pg_dumpall
+                * without editing the file or stream.  With pg_dump there are many
+                * other ways to allow the file to be used, and leaving it out allows
+                * users to protect databases from being accidental restore targets.
+                */
+               fprintf(OPF, "SET default_transaction_read_only = off;\n\n");
+
                if (filename)
                        fclose(OPF);