Обсуждение: default database creation with initdb
As per discussion on -hackers the attached patch creates the 'default'
database at initdb time as a default target for initial connections to
keep template1 free from connections and available as template source.
I consider this DB a system object, so it's created before
make_template0 sets the last_system_oid (wondering why template0 isn't
considered a system db too)
Regards,
Andreas
Index: src/bin/initdb/initdb.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/initdb/initdb.c,v
retrieving revision 1.83
diff -u -r1.83 initdb.c
--- src/bin/initdb/initdb.c 30 Apr 2005 08:08:51 -0000 1.83
+++ src/bin/initdb/initdb.c 18 Jun 2005 08:37:16 -0000
@@ -177,6 +177,7 @@
static void set_info_version(void);
static void setup_schema(void);
static void vacuum_db(void);
+static void make_default(void);
static void make_template0(void);
static void trapsig(int signum);
static void check_ok(void);
@@ -1828,6 +1829,38 @@
}
/*
+ * copy template1 to pg_system
+ */
+static void
+make_default(void)
+{
+ PG_CMD_DECL;
+ char **line;
+ static char *pg_system_setup[] = {
+ "CREATE DATABASE \"default\";\n",
+ "REVOKE CREATE,TEMPORARY ON DATABASE \"default\" FROM public;\n",
+ NULL
+ };
+
+ fputs(_("copying template1 to default ... "), stdout);
+ fflush(stdout);
+
+ snprintf(cmd, sizeof(cmd),
+ "\"%s\" %s template1 >%s",
+ backend_exec, backend_options,
+ DEVNULL);
+
+ PG_CMD_OPEN;
+
+ for (line = pg_system_setup; *line; line++)
+ PG_CMD_PUTS(*line);
+
+ PG_CMD_CLOSE;
+
+ check_ok();
+}
+
+/*
* copy template1 to template0
*/
static void
@@ -2606,6 +2639,8 @@
vacuum_db();
+ make_default();
+
make_template0();
if (authwarning != NULL)
Umm. Tiny item, but your comment still refers to the database as pg_system ;-) //Magnus > -----Original Message----- > From: pgsql-patches-owner@postgresql.org > [mailto:pgsql-patches-owner@postgresql.org] On Behalf Of Andreas Pflug > Sent: Saturday, June 18, 2005 10:42 AM > To: PostgreSQL-patches > Subject: [PATCHES] default database creation with initdb > > As per discussion on -hackers the attached patch creates the > 'default' > database at initdb time as a default target for initial > connections to keep template1 free from connections and > available as template source. > > I consider this DB a system object, so it's created before > make_template0 sets the last_system_oid (wondering why > template0 isn't considered a system db too) > > Regards, > Andreas >
Magnus Hagander wrote:
> Umm. Tiny item, but your comment still refers to the database as
> pg_system ;-)
:-)
Regards,
Andreas
Index: src/bin/initdb/initdb.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/initdb/initdb.c,v
retrieving revision 1.83
diff -u -r1.83 initdb.c
--- src/bin/initdb/initdb.c 30 Apr 2005 08:08:51 -0000 1.83
+++ src/bin/initdb/initdb.c 18 Jun 2005 08:54:07 -0000
@@ -177,6 +177,7 @@
static void set_info_version(void);
static void setup_schema(void);
static void vacuum_db(void);
+static void make_default(void);
static void make_template0(void);
static void trapsig(int signum);
static void check_ok(void);
@@ -1828,6 +1829,38 @@
}
/*
+ * copy template1 to default
+ */
+static void
+make_default(void)
+{
+ PG_CMD_DECL;
+ char **line;
+ static char *default_setup[] = {
+ "CREATE DATABASE \"default\";\n",
+ "REVOKE CREATE,TEMPORARY ON DATABASE \"default\" FROM public;\n",
+ NULL
+ };
+
+ fputs(_("copying template1 to default ... "), stdout);
+ fflush(stdout);
+
+ snprintf(cmd, sizeof(cmd),
+ "\"%s\" %s template1 >%s",
+ backend_exec, backend_options,
+ DEVNULL);
+
+ PG_CMD_OPEN;
+
+ for (line = default_setup; *line; line++)
+ PG_CMD_PUTS(*line);
+
+ PG_CMD_CLOSE;
+
+ check_ok();
+}
+
+/*
* copy template1 to template0
*/
static void
@@ -2606,6 +2639,8 @@
vacuum_db();
+ make_default();
+
make_template0();
if (authwarning != NULL)
On Saturday 18 June 2005 04:55, Andreas Pflug wrote:
> Magnus Hagander wrote:
> > Umm. Tiny item, but your comment still refers to the database as
> > pg_system ;-)
> >
What is the purpose of this database? A generalized, shared resource for tool
makers and add-on packages to store information in PostgreSQL, or a working
database that is usable (and to be used) out of the box for new users? I
really don't think we want the latter... I can see users connecting via psql
and then playing around with different add/create type statements. It is all
too common a question from newbies... "does postgresql have a default
database to get started with?" They'll see this database and begin creating
schema and using this as thier main database, and I think we ought to avoid
that. If people don't like pg_system, pg_addons seem like a much safer name
to go with imho.
--
Robert Treat
Build A Brighter Lamp :: Linux Apache {middleware} PostgreSQL
Andreas Pflug <pgadmin@pse-consulting.de> writes:
> + "CREATE DATABASE \"default\";\n",
> + "REVOKE CREATE,TEMPORARY ON DATABASE \"default\" FROM public;\n",
Uh, why the rights revocation? That makes the thing essentially useless
... except to superusers, who will not be affected anyway. I don't
think this is a sane default.
In any case, fixing initdb for this is trivial. I count something north
of 160 other references to template1 in the current sources, scattered
across 60+ files. Every one of those has to be looked at and possibly
changed.
regards, tom lane
Robert Treat wrote: >On Saturday 18 June 2005 04:55, Andreas Pflug wrote: > > >>Magnus Hagander wrote: >> >> >>>Umm. Tiny item, but your comment still refers to the database as >>>pg_system ;-) >>> >>> >>> > >What is the purpose of this database? A generalized, shared resource for tool >makers and add-on packages to store information in PostgreSQL, or a working >database that is usable (and to be used) out of the box for new users? I >really don't think we want the latter... I can see users connecting via psql >and then playing around with different add/create type statements. It is all >too common a question from newbies... "does postgresql have a default >database to get started with?" > A sample DB would be nice... > They'll see this database and begin creating >schema and using this as thier main database, and I think we ought to avoid >that. If people don't like pg_system, pg_addons seem like a much safer name >to go with imho. > > To avoid people creating stuff in it, the patch revokes CREATE from public (won't help against admins), which in turn Tom thinks is "not a sane default". Regards, Andreas
On Sat, Jun 18, 2005 at 09:27:49 -0400, Robert Treat <xzilla@users.sourceforge.net> wrote: > On Saturday 18 June 2005 04:55, Andreas Pflug wrote: > > Magnus Hagander wrote: > > > Umm. Tiny item, but your comment still refers to the database as > > > pg_system ;-) > > > > > What is the purpose of this database? A generalized, shared resource for tool > makers and add-on packages to store information in PostgreSQL, or a working > database that is usable (and to be used) out of the box for new users? I > really don't think we want the latter... I can see users connecting via psql > and then playing around with different add/create type statements. It is all > too common a question from newbies... "does postgresql have a default > database to get started with?" They'll see this database and begin creating > schema and using this as thier main database, and I think we ought to avoid > that. If people don't like pg_system, pg_addons seem like a much safer name > to go with imho. I believe the intention is that things that need to connect to some database to do their work (e.g. psql -l, createuser) will connect to that database. createdb will still connect to template1, but now will be less likely to have a conflict with another user being connected to template1 at the same time. I didn't check the patch to see if the behavior of the psql -l and createuser were changed or if just the initdb behavior was changed. I don't think it will be a big deal if people put stuff in that database.