diff options
-rw-r--r-- | doc/src/sgml/ref/initdb.sgml | 266 | ||||
-rw-r--r-- | src/bin/initdb/initdb.sh | 319 | ||||
-rw-r--r-- | src/include/catalog/pg_shadow.h | 38 |
3 files changed, 257 insertions, 366 deletions
diff --git a/doc/src/sgml/ref/initdb.sgml b/doc/src/sgml/ref/initdb.sgml index 200c030ed48..2e235c082c9 100644 --- a/doc/src/sgml/ref/initdb.sgml +++ b/doc/src/sgml/ref/initdb.sgml @@ -1,5 +1,5 @@ <!-- -$Header: /cvsroot/pgsql/doc/src/sgml/ref/initdb.sgml,v 1.5 1999/07/22 15:09:12 thomas Exp $ +$Header: /cvsroot/pgsql/doc/src/sgml/ref/initdb.sgml,v 1.6 1999/12/17 01:05:29 momjian Exp $ Postgres documentation --> @@ -15,24 +15,26 @@ Postgres documentation <application>initdb</application> </refname> <refpurpose> - Create a new <productname>Postgres</productname> database installation + Create a new <productname>PostgreSQL</productname> database installation </refpurpose> </refnamediv> <refsynopsisdiv> <refsynopsisdivinfo> - <date>1999-07-20</date> + <date>1999-12-17</date> </refsynopsisdivinfo> <synopsis> -initdb [ --pgdata=<replaceable class="parameter">dbdir</replaceable> | -r <replaceable class="parameter">dbdir</replaceable> ] - [ --pglib=<replaceable class="parameter">libdir</replaceable> | -l <replaceable class="parameter">libdir</replaceable> ] - [ --template=<replaceable class="parameter">template</replaceable> | -t <replaceable class="parameter">template</replaceable> ] - [ --username=<replaceable class="parameter">name</replaceable> | -u <replaceable class="parameter">name</replaceable> ] - [ --noclean | -n ] [ --debug | -d ] +initdb [ --pgdata|-D <replaceable class="parameter">dbdir</replaceable> ] + [ --sysid|-i <replaceable class="parameter">sysid</replaceable> ] + [ --password|-W <replaceable class="parameter">password</replaceable> ] + [ --pgencoding|-e <replaceable class="parameter">encoding</replaceable> ] + [ --pglib|-L <replaceable class="parameter">libdir</replaceable> ] + [ --username|-u <replaceable class="parameter">name</replaceable> ] + [ --noclean | -n ] [ --debug | -d ] [ --template | -t ] </synopsis> <refsect2 id="R2-APP-INITDB-1"> <refsect2info> - <date>1998-10-02</date> + <date>1999-11-17</date> </refsect2info> <title> Inputs @@ -41,62 +43,61 @@ initdb [ --pgdata=<replaceable class="parameter">dbdir</replaceable> | -r <repla <variablelist> <varlistentry> - <term>--pglib=<replaceable class="parameter">libdir</replaceable></term> - <term>-l <replaceable class="parameter">libdir</replaceable></term> - <term><envar>PGLIB</envar></term> + <term>--pgdata=<replaceable class="parameter">dbdir</replaceable></term> + <term>-D <replaceable class="parameter">dbdir</replaceable></term> + <term><envar>PGDATA</envar></term> <listitem> <para> - Where are the files that make up <productname>Postgres</productname>? - Apart from files that - have to go in particular directories because of their function, the - files that make up the <productname>Postgres</productname> software - were installed in a directory - called the <replaceable class="parameter">libdir</replaceable> directory. - An example of a file that will be found - there that <application>initdb</application> - needs is <filename>global1.bki.source</filename>, - which contains all the information that goes - into the shared catalog tables. + This option specifies where in the file system the database should be + stored. This is the only information required by initdb, but you can avoid + it by setting the <envar>PGDATA</envar> environment variable, which + can be convenient since the database server (<filename>postmaster</filename>) + can find the database directory later by the same variable. </para> </listitem> </varlistentry> <varlistentry> - <term>--pgdata=<replaceable class="parameter">dbdir</replaceable></term> - <term>-r <replaceable class="parameter">dbdir</replaceable></term> - <term><envar>PGDATA</envar></term> + <term>--sysid=<replaceable class="parameter">sysid</replaceable></term> + <term>-i <replaceable class="parameter">sysid</replaceable></term> <listitem> <para> - Where in your Unix filesystem do you want the database data to go? - The top level directory is called the <envar>PGDATA</envar> directory. + Selects the system id of the database superuser. This defaults to + the effective user id of the user running initdb. It is really + not important what the superuser's sysid is, but one might choose + to start the numbering at some number like 0 or 1. </para> </listitem> </varlistentry> - + <varlistentry> - <term>--username=<replaceable class="parameter">name</replaceable></term> - <term>-u <replaceable class="parameter">name</replaceable></term> - <term><envar>PGUSER</envar></term> + <term>--password=<replaceable class="parameter">password</replaceable></term> + <term>-W <replaceable class="parameter">password</replaceable></term> <listitem> <para> - Who will be the <productname>Postgres</productname> superuser - for this database system? The - <productname>Postgres</productname> superuser is a Unix user - who owns all files that store the database - system and also owns the postmaster and backend processes that access them. - Or just let it default to you (the Unix user who runs - <application>initdb</application>). + Sets the password of the database superuser. If you don't plan + on using password authentication, this is not important. If you + do, you can save yourself a trip by specifying it here, but you + can always change it later. The default password is empty. </para> - <note> - <para> - Only the Unix superuser (<literal>root</literal>) - can create a database system with an owner - different from the <productname>Postgres</productname> superuser. - </para> - </note> </listitem> </varlistentry> - </variablelist> + + <varlistentry> + <term>--pgencoding=<replaceable class="parameter">encoding</replaceable></term> + <term>-e <replaceable class="parameter">encoding</replaceable></term> + <listitem> + <para> + Selects the multibyte encoding of the template database. This will also + be the default encoding of any database you create later, unless you + override it there. To use the multibyte encoding feature, you must + specify so at build time, at which time you also select the default + for this option. + </para> + </listitem> + </varlistentry> + + </variablelist> </para> <para> @@ -104,15 +105,46 @@ initdb [ --pgdata=<replaceable class="parameter">dbdir</replaceable> | -r <repla <variablelist> <varlistentry> - <term>--template=<replaceable class="parameter">template</replaceable></term> - <term>-t <replaceable class="parameter">template</replaceable></term> + <term>--pglib=<replaceable class="parameter">libdir</replaceable></term> + <term>-l <replaceable class="parameter">libdir</replaceable></term> + <listitem> + <para> + initdb needs a few input files to initialize the database. This option + tells where to find them. You normally don't have to worry about this + since initdb knows about the most common installation layouts and will + find the files itself. You will be told if you need to specify their + location explicitly. If that happens, one of the files is called + <filename>global1.bki.source</filename> and is traditionally installed + along with the others in the library directory (e.g., + <filename>/usr/local/pgsql/lib</filename>). + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>--username=<replaceable class="parameter">name</replaceable></term> + <term>-u <replaceable class="parameter">name</replaceable></term> + <listitem> + <para> + The database system will be initialized with the username that is + running initdb. That is a requirement. If for some unimaginable + reason initdb cannot find out what the current user's name is, + you have to use this option. Normally, this will not be necessary + and initdb will tell you when it is. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>--template</term> + <term>-t</term> <listitem> <para> Replace the <literal>template1</literal> database in an existing database system, and don't touch anything else. This is useful when you need to upgrade your <literal>template1</literal> database using <application>initdb</application> - from a newer release of <productname>Postgres</productname>, + from a newer release of <productname>PostgreSQL</productname>, or when your <literal>template1</literal> database has become corrupted by some system problem. Normally the contents of <literal>template1</literal> @@ -133,8 +165,7 @@ initdb [ --pgdata=<replaceable class="parameter">dbdir</replaceable> | -r <repla By default, when <application>initdb</application> determines that error prevent it from completely creating the database system, it removes any files it may have created before determining - that it can't finish the job. That includes any core files left by - the programs it invokes. This option inhibits any tidying-up and is + that it can't finish the job. This option inhibits any tidying-up and is thus useful for debugging. </para> </listitem> @@ -145,10 +176,11 @@ initdb [ --pgdata=<replaceable class="parameter">dbdir</replaceable> | -r <repla <term>-d</term> <listitem> <para> - Print debugging output from the bootstrap backend. + Print debugging output from the bootstrap backend and a few other + messages of lesser interest for the general public. The bootstrap backend is the program <application>initdb</application> uses to create the catalog tables. This option generates a tremendous - amount of output. It also turns off the final vacuuming step. + amount of output. </para> </listitem> </varlistentry> @@ -156,56 +188,17 @@ initdb [ --pgdata=<replaceable class="parameter">dbdir</replaceable> | -r <repla </variablelist> </para> - <para> - Files are also input to <application>initdb</application>: - - <variablelist> - <varlistentry> - <term><application>postconfig</application></term> - <listitem> - <para> - If appearing somewhere in the Unix command search path - (defined by the PATH environment variable). - This is a program that specifies defaults for some of the - command options. See below. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><filename><envar>PGLIB</envar>/global1.bki.source</filename></term> - <listitem> - <para> - Contents for the shared catalog tables in the new database system. This - file is part of the <productname>Postgres</productname> software. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><filename><envar>PGLIB</envar>/local1_template1.bki.source</filename></term> - <listitem> - <para> - Contents for the template1 tables in the new database system. This - file is part of the <productname>Postgres</productname> software. - </para> - </listitem> - </varlistentry> - - </variablelist> - </para> </refsect2> <refsect2 id="R2-APP-INITDB-2"> <refsect2info> - <date>1998-09-26</date> + <date>1999-12-17</date> </refsect2info> <title> Outputs </title> <para> - <application>initdb</application> will create files in the - <envar>PGDATA</envar> + <application>initdb</application> will create files in the specified data area which are the system tables and framework for a complete installation. </para> @@ -214,14 +207,14 @@ initdb [ --pgdata=<replaceable class="parameter">dbdir</replaceable> | -r <repla <refsect1 id="R1-APP-INITDB-1"> <refsect1info> - <date>1998-09-26</date> + <date>1999-12-17</date> </refsect1info> <title> Description </title> <para> <application>initdb</application> creates a new - <productname>Postgres</productname> database system. + <productname>PostgreSQL</productname> database system. A database system is a collection of databases that are all administered by the same Unix user and managed by a single postmaster. @@ -231,74 +224,37 @@ initdb [ --pgdata=<replaceable class="parameter">dbdir</replaceable> | -r <repla the database data will live, generating the shared catalog tables (tables that don't belong to any particular database), and creating the <literal>template1</literal> - database. What is the <literal>template1</literal> - database? When you create a database, <productname>Postgres</productname> - does it by copying - everything from the <literal>template1</literal> - database. It contains catalog tables filled in for things like the + database. When you create a new database, everything in the + <literal>template1</literal> database is copied. + It contains catalog tables filled in for things like the builtin types. </para> - <para> - After <application>initdb</application> - creates the database, it completes the initialization by running - <application>vacuum</application>, which resets some optimization parameters. - </para> - <para> - There are three ways to give parameters to <application>initdb</application>. - <itemizedlist> - <listitem> - <para> - You can use <application>initdb</application> command options. - </para> - </listitem> - <listitem> - <para> - You can set environment - variables before invoking <application>initdb</application>. - </para> - </listitem> - - <listitem> - <para> - You can have a program called <application>postconfig</application> - in your Unix command search path. - <application>initdb</application> invokes that program and that program then writes - <application>initdb</application> parameters to its standard output stream. - This third option is not a common thing to do, however. - </para> - </listitem> - </itemizedlist> + <para> + You must not execute <application>initdb</application> as root. This is + because you cannot run the database server as root either, but the + server needs to have access to the files <application>initdb</application> + creates. Furthermore, during the initialization phase, when there are no + users and no access controls installed, postgres will only connect with + the name of the current Unix user, so you must log in under the account + that will own the server process. </para> <para> - Command options always override parameters specified any other way. - The values returned by <application>postconfig</application> - override any environment variables, but your - <application>postconfig</application> - program may base its output on the environment variables if you want - their values to be used. + Although <application>initdb</application> will attempt to create the respective + data directory, chances are that it won't have the permission to do so. Thus + it is a good idea to create the data directory before running <application>initdb</application> + <emphasis>and</emphasis> to hand over the ownership of it to the database superuser. </para> <para> - The value that <application>postconfig</application> - outputs must have the format - <synopsis> -<replaceable>var1</replaceable>=<replaceable class="parameter">value1</replaceable> <replaceable class="parameter">var2</replaceable>=<replaceable class="parameter">value2</replaceable> ... - </synopsis> - - It can output nothing if it doesn't want to supply any parameters. - The <replaceable>var</replaceable> values are equal to - the corresponding environment variable - names. For example, - <programlisting> -PGDATA=/tmp/postgres_test - </programlisting> - has the - same effect as invoking <application>initdb</application> - with an environment variable called <envar>PGDATA</envar> whose value is - <filename>/tmp/postgres_test</filename>. + Note that if you use the <option>--username</option> you must give correct + information about the name of the <emphasis>current</emphasis> user. If you don't + this will usually manifest itself in an error message about <literal>chmod</literal> + failing on a file <filename>pg_pwd</filename>, because the backend silently + refuses to create it. </para> + </refsect1> </refentry> diff --git a/src/bin/initdb/initdb.sh b/src/bin/initdb/initdb.sh index 4ccd718fc73..245f3455f94 100644 --- a/src/bin/initdb/initdb.sh +++ b/src/bin/initdb/initdb.sh @@ -26,7 +26,7 @@ # # # IDENTIFICATION -# $Header: /cvsroot/pgsql/src/bin/initdb/Attic/initdb.sh,v 1.65 1999/12/16 20:09:56 momjian Exp $ +# $Header: /cvsroot/pgsql/src/bin/initdb/Attic/initdb.sh,v 1.66 1999/12/17 01:05:30 momjian Exp $ # #------------------------------------------------------------------------- @@ -291,38 +291,31 @@ umask 077 if [ -f "$PGDATA/PG_VERSION" ]; then if [ $template_only -eq 0 ]; then - echo "$CMDNAME: error: File $PGDATA/PG_VERSION already exists." - echo "This probably means initdb has already been run and the " + echo "$CMDNAME: The file $PGDATA/PG_VERSION already exists." + echo "This probably means initdb has already been run and the" echo "database system already exists." echo - echo "If you want to create a new database system, either remove " - echo "the directory $PGDATA or run initdb with a --pgdata option " + echo "If you want to create a new database system, either remove" + echo "the directory $PGDATA or run initdb with a --pgdata argument" echo "other than $PGDATA." exit 1 fi else if [ ! -d $PGDATA ]; then - echo "Creating Postgres database system directory $PGDATA" - echo - mkdir $PGDATA - if [ $? -ne 0 ]; then exit 5; fi - else - echo "Fixing permissions on pre-existing $PGDATA" - echo - chmod go-rwx $PGDATA - if [ $? -ne 0 ]; then exit 5; fi + echo "Creating database system directory $PGDATA" + mkdir $PGDATA || exit_nicely + else + echo "Fixing permissions on pre-existing data directory $PGDATA" + chmod go-rwx $PGDATA || exit_nicely fi + if [ ! -d $PGDATA/base ]; then - echo "Creating Postgres database system directory $PGDATA/base" - echo - mkdir $PGDATA/base - if [ $? -ne 0 ]; then exit 5; fi + echo "Creating database system directory $PGDATA/base" + mkdir $PGDATA/base || exit_nicely fi if [ ! -d $PGDATA/pg_xlog ]; then - echo "Creating Postgres database XLOG directory $PGDATA/pg_xlog" - echo - mkdir $PGDATA/pg_xlog - if [ $? -ne 0 ]; then exit 5; fi + echo "Creating database XLOG directory $PGDATA/pg_xlog" + mkdir $PGDATA/pg_xlog || exit_nicely fi fi @@ -330,8 +323,8 @@ fi # Create the template1 database #---------------------------------------------------------------------------- -rm -rf $PGDATA/base/template1 -mkdir $PGDATA/base/template1 +rm -rf $PGDATA/base/template1 || exit_nicely +mkdir $PGDATA/base/template1 || exit_nicely if [ "$debug" -eq 1 ]; then BACKEND_TALK_ARG="-d" @@ -343,82 +336,51 @@ BACKENDARGS="-boot -C -F -D$PGDATA $BACKEND_TALK_ARG" FIRSTRUN="-boot -x -C -F -D$PGDATA $BACKEND_TALK_ARG" echo "Creating template database in $PGDATA/base/template1" -[ "$debug" -ne 0 ] && echo "Running: postgres $BACKENDARGS template1" +[ "$debug" -ne 0 ] && echo "Running: $PGPATH/postgres $FIRSTRUN template1" cat $TEMPLATE \ -| sed -e "s/postgres PGUID/$POSTGRES_SUPERUSERNAME $POSTGRES_SUPERUID/" \ - -e "s/PGUID/$POSTGRES_SUPERUID/" \ -| postgres $FIRSTRUN template1 +| sed -e "s/PGUID/$POSTGRES_SUPERUSERID/g" \ +| $PGPATH/postgres $FIRSTRUN template1 \ +|| exit_nicely -if [ $? -ne 0 ]; then - echo "$CMDNAME: could not create template database" - if [ $noclean -eq 0 ]; then - echo "$CMDNAME: cleaning up by wiping out $PGDATA/base/template1" - rm -rf $PGDATA/base/template1 - else - echo "$CMDNAME: cleanup not done because noclean options was used." - fi - exit 1; -fi - -echo - -pg_version $PGDATA/base/template1 +$PGPATH/pg_version $PGDATA/base/template1 || exit_nicely #---------------------------------------------------------------------------- # Create the global classes, if requested. #---------------------------------------------------------------------------- if [ $template_only -eq 0 ]; then - echo "Creating global classes in $PGDATA/base" - [ "$debug" -ne 0 ] && echo "Running: postgres $BACKENDARGS template1" + echo "Creating global relations in $PGDATA/base" + [ "$debug" -ne 0 ] && echo "Running: $PGPATH/postgres $BACKENDARGS template1" cat $GLOBAL \ - | sed -e "s/postgres PGUID/$POSTGRES_SUPERUSERNAME $POSTGRES_SUPERUID/" \ - -e "s/PGUID/$POSTGRES_SUPERUID/" \ - | postgres $BACKENDARGS template1 - - if (test $? -ne 0) - then - echo "$CMDNAME: could not create global classes." - if (test $noclean -eq 0); then - echo "$CMDNAME: cleaning up." - rm -rf $PGDATA - else - echo "$CMDNAME: cleanup not done (noclean mode set)." - fi - exit 1; - fi + | sed -e "s/POSTGRES/$POSTGRES_SUPERUSERNAME/g" \ + -e "s/PGUID/$POSTGRES_SUPERUSERID/g" \ + -e "s/PASSWORD/$Password/g" \ + | $PGPATH/postgres $BACKENDARGS template1 \ + || exit_nicely - echo - - pg_version $PGDATA - - cp $PG_HBA_SAMPLE $PGDATA/pg_hba.conf - cp $PG_GEQO_SAMPLE $PGDATA/pg_geqo.sample + $PGPATH/pg_version $PGDATA || exit_nicely - echo "Adding template1 database to pg_database..." + cp $PG_HBA_SAMPLE $PGDATA/pg_hba.conf || exit_nicely + cp $PG_GEQO_SAMPLE $PGDATA/pg_geqo.sample || exit_nicely - echo "open pg_database" > /tmp/create.$$ - echo "insert (template1 $POSTGRES_SUPERUID $MULTIBYTEID template1)" >> /tmp/create.$$ - #echo "show" >> /tmp/create.$$ - echo "close pg_database" >> /tmp/create.$$ + echo "Adding template1 database to pg_database" - [ "$debug" -ne 0 ] && echo "Running: postgres $BACKENDARGS template1 < /tmp/create.$$" + echo "open pg_database" > $TEMPFILE + echo "insert (template1 $POSTGRES_SUPERUSERID $MULTIBYTEID template1)" >> $TEMPFILE + #echo "show" >> $TEMPFILE + echo "close pg_database" >> $TEMPFILE - postgres $BACKENDARGS template1 < /tmp/create.$$ + [ "$debug" -ne 0 ] && echo "Running: $PGPATH/postgres $BACKENDARGS template1 < $TEMPFILE" - if [ $? -ne 0 ]; then - echo "$CMDNAME: could not log template database" - if [ $noclean -eq 0 ]; then - echo "$CMDNAME: cleaning up." - rm -rf $PGDATA - else - echo "$CMDNAME: cleanup not done (noclean mode set)." - fi - exit 1; + $PGPATH/postgres $BACKENDARGS template1 < $TEMPFILE + # Gotta remove that temp file before exiting on error. + retval=$? + if [ $noclean -eq 0 ]; then + rm -f $TEMPFILE || exit_nicely fi - rm -f /tmp/create.$$ + [ $retval -ne 0 ] && exit_nicely fi echo @@ -427,102 +389,103 @@ PGSQL_OPT="-o /dev/null -O -F -Q -D$PGDATA" # Create a trigger so that direct updates to pg_shadow will be written # to the flat password file pg_pwd -echo "CREATE TRIGGER pg_sync_pg_pwd AFTER INSERT OR UPDATE OR DELETE ON pg_shadow FOR EACH ROW EXECUTE PROCEDURE update_pg_pwd()" | postgres $PGSQL_OPT template1 > /dev/null +echo "CREATE TRIGGER pg_sync_pg_pwd AFTER INSERT OR UPDATE OR DELETE ON pg_shadow" \ + "FOR EACH ROW EXECUTE PROCEDURE update_pg_pwd()" \ + | $PGPATH/postgres $PGSQL_OPT template1 > /dev/null || exit_nicely # Create the initial pg_pwd (flat-file copy of pg_shadow) -echo "COPY pg_shadow TO '$PGDATA/pg_pwd' USING DELIMITERS '\\t'" | \ - postgres $PGSQL_OPT template1 > /dev/null +echo "Writing password file." +echo "COPY pg_shadow TO '$PGDATA/pg_pwd' USING DELIMITERS '\\t'" \ + | $PGPATH/postgres $PGSQL_OPT template1 > /dev/null || exit_nicely + # An ordinary COPY will leave the file too loosely protected. -chmod go-rw $PGDATA/pg_pwd - -echo "Creating public pg_user view" -echo "CREATE TABLE pg_user ( \ - usename name, \ - usesysid int4, \ - usecreatedb bool, \ - usetrace bool, \ - usesuper bool, \ - usecatupd bool, \ - passwd text, \ - valuntil abstime);" | postgres $PGSQL_OPT template1 > /dev/null - - -echo "CREATE RULE \"_RETpg_user\" AS ON SELECT TO pg_user DO INSTEAD \ - SELECT usename, usesysid, usecreatedb, usetrace, \ - usesuper, usecatupd, '********'::text as passwd, \ - valuntil FROM pg_shadow;" | \ - postgres $PGSQL_OPT template1 > /dev/null -echo "REVOKE ALL on pg_shadow FROM public" | \ - postgres $PGSQL_OPT template1 > /dev/null - -echo "Creating view pg_rules" -echo "CREATE TABLE pg_rules ( \ - tablename name, \ - rulename name, \ - definition text);" | postgres $PGSQL_OPT template1 > /dev/null - -echo "CREATE RULE \"_RETpg_rules\" AS ON SELECT TO pg_rules DO INSTEAD \ - SELECT C.relname AS tablename, \ - R.rulename AS rulename, \ - pg_get_ruledef(R.rulename) AS definition \ - FROM pg_rewrite R, pg_class C \ - WHERE R.rulename !~ '^_RET' \ - AND C.oid = R.ev_class;" | \ - postgres $PGSQL_OPT template1 > /dev/null - -echo "Creating view pg_views" -echo "CREATE TABLE pg_views ( \ - viewname name, \ - viewowner name, \ - definition text);" | postgres $PGSQL_OPT template1 > /dev/null - -echo "CREATE RULE \"_RETpg_views\" AS ON SELECT TO pg_views DO INSTEAD \ - SELECT C.relname AS viewname, \ - pg_get_userbyid(C.relowner) AS viewowner, \ - pg_get_viewdef(C.relname) AS definition \ - FROM pg_class C WHERE C.relhasrules AND \ - EXISTS (SELECT rulename FROM pg_rewrite R \ - WHERE ev_class = C.oid AND ev_type = '1');" | \ - postgres $PGSQL_OPT template1 > /dev/null - -echo "Creating view pg_tables" -echo "CREATE TABLE pg_tables ( \ - tablename name, \ - tableowner name, \ - hasindexes bool, \ - hasrules bool, \ - hastriggers bool);" | postgres $PGSQL_OPT template1 > /dev/null - -echo "CREATE RULE \"_RETpg_tables\" AS ON SELECT TO pg_tables DO INSTEAD \ - SELECT C.relname AS tablename, \ - pg_get_userbyid(C.relowner) AS tableowner, \ - C.relhasindex AS hasindexes, \ - C.relhasrules AS hasrules, \ - (C.reltriggers > 0) AS hastriggers \ - FROM pg_class C WHERE C.relkind IN ('r', 's') \ - AND NOT EXISTS (SELECT rulename FROM pg_rewrite \ - WHERE ev_class = C.oid AND ev_type = '1');" | \ - postgres $PGSQL_OPT template1 > /dev/null - -echo "Creating view pg_indexes" -echo "CREATE TABLE pg_indexes ( \ - tablename name, \ - indexname name, \ - indexdef text);" | postgres $PGSQL_OPT template1 > /dev/null - -echo "CREATE RULE \"_RETpg_indexes\" AS ON SELECT TO pg_indexes DO INSTEAD \ - SELECT C.relname AS tablename, \ - I.relname AS indexname, \ - pg_get_indexdef(X.indexrelid) AS indexdef \ - FROM pg_index X, pg_class C, pg_class I \ - WHERE C.oid = X.indrelid \ - AND I.oid = X.indexrelid;" | \ - postgres $PGSQL_OPT template1 > /dev/null - -echo "Loading pg_description" -echo "copy pg_description from '$TEMPLATE_DESCR'" | \ - postgres $PGSQL_OPT template1 > /dev/null -echo "copy pg_description from '$GLOBAL_DESCR'" | \ - postgres $PGSQL_OPT template1 > /dev/null -echo "vacuum analyze" | \ - postgres $PGSQL_OPT template1 > /dev/null +# Note: If you lied above and specified a --username different from the one +# you really are, this will manifest itself in this command failing because +# of a missing file, since the COPY command above failed. It would perhaps +# be better if postgres returned an error code. +chmod go-rw $PGDATA/pg_pwd || exit_nicely + +echo "Creating view pg_user." +echo "CREATE VIEW pg_user AS + SELECT + usename, + usesysid, + usecreatedb, + usetrace, + usesuper, + usecatupd, + '********'::text as passwd, + valuntil + FROM pg_shadow" \ + | $PGPATH/postgres $PGSQL_OPT template1 > /dev/null || exit_nicely + +echo "REVOKE ALL on pg_shadow FROM public" \ + | $PGPATH/postgres $PGSQL_OPT template1 > /dev/null || exit_nicely + +echo "Creating view pg_rules." +echo "CREATE VIEW pg_rules AS + SELECT + C.relname AS tablename, + R.rulename AS rulename, + pg_get_ruledef(R.rulename) AS definition + FROM pg_rewrite R, pg_class C + WHERE R.rulename !~ '^_RET' + AND C.oid = R.ev_class;" \ + | $PGPATH/postgres $PGSQL_OPT template1 > /dev/null || exit_nicely + +echo "Creating view pg_views." +echo "CREATE VIEW pg_views AS + SELECT + C.relname AS viewname, + pg_get_userbyid(C.relowner) AS viewowner, + pg_get_viewdef(C.relname) AS definition + FROM pg_class C + WHERE C.relhasrules + AND EXISTS ( + SELECT rulename FROM pg_rewrite R + WHERE ev_class = C.oid AND ev_type = '1' + )" \ + | $PGPATH/postgres $PGSQL_OPT template1 > /dev/null || exit_nicely + +echo "Creating view pg_tables." +echo "CREATE VIEW pg_tables AS + SELECT + C.relname AS tablename, + pg_get_userbyid(C.relowner) AS tableowner, + C.relhasindex AS hasindexes, + C.relhasrules AS hasrules, + (C.reltriggers > 0) AS hastriggers + FROM pg_class C + WHERE C.relkind IN ('r', 's') + AND NOT EXISTS ( + SELECT rulename FROM pg_rewrite + WHERE ev_class = C.oid AND ev_type = '1' + )" \ + | $PGPATH/postgres $PGSQL_OPT template1 > /dev/null || exit_nicely + +echo "Creating view pg_indexes." +echo "CREATE VIEW pg_indexes AS + SELECT + C.relname AS tablename, + I.relname AS indexname, + pg_get_indexdef(X.indexrelid) AS indexdef + FROM pg_index X, pg_class C, pg_class I + WHERE C.oid = X.indrelid + AND I.oid = X.indexrelid" \ + | $PGPATH/postgres $PGSQL_OPT template1 > /dev/null || exit_nicely + +echo "Loading pg_description." +echo "COPY pg_description FROM '$TEMPLATE_DESCR'" \ + | $PGPATH/postgres $PGSQL_OPT template1 > /dev/null || exit_nicely +echo "COPY pg_description FROM '$GLOBAL_DESCR'" \ + | $PGPATH/postgres $PGSQL_OPT template1 > /dev/null || exit_nicely +echo "Vacuuming database." +echo "VACUUM ANALYZE" \ + | $PGPATH/postgres $PGSQL_OPT template1 > /dev/null || exit_nicely + +echo +echo "$CMDNAME completed successfully. You can now start the database server." +echo "($PGPATH/postmaster -D $PGDATA)" +echo + +exit 0 diff --git a/src/include/catalog/pg_shadow.h b/src/include/catalog/pg_shadow.h index 1a54a92070f..781caca899b 100644 --- a/src/include/catalog/pg_shadow.h +++ b/src/include/catalog/pg_shadow.h @@ -8,7 +8,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: pg_shadow.h,v 1.4 1999/02/13 23:21:14 momjian Exp $ + * $Id: pg_shadow.h,v 1.5 1999/12/17 01:05:31 momjian Exp $ * * NOTES * the genbki.sh script reads this file and generates .bki @@ -67,39 +67,11 @@ typedef FormData_pg_shadow *Form_pg_shadow; /* ---------------- * initial contents of pg_shadow + * + * The uppercase quantities will be replaced at initdb time with + * user choices. * ---------------- */ -DATA(insert OID = 0 ( postgres PGUID t t t t _null_ 2116994400 )); - -BKI_BEGIN -#ifdef ALLOW_PG_GROUP -BKI_END - -DATA(insert OID = 0 ( mike 799 t t t t _null_ 2116994400 )); -DATA(insert OID = 0 ( mao 1806 t t t t _null_ 2116994400 )); -DATA(insert OID = 0 ( hellers 1089 t t t t _null_ 2116994400 )); -DATA(insert OID = 0 ( joey 5209 t t t t _null_ 2116994400 )); -DATA(insert OID = 0 ( jolly 5443 t t t t _null_ 2116994400 )); -DATA(insert OID = 0 ( sunita 6559 t t t t _null_ 2116994400 )); -DATA(insert OID = 0 ( paxson 3029 t t t t _null_ 2116994400 )); -DATA(insert OID = 0 ( marc 2435 t t t t _null_ 2116994400 )); -DATA(insert OID = 0 ( jiangwu 6124 t t t t _null_ 2116994400 )); -DATA(insert OID = 0 ( aoki 2360 t t t t _null_ 2116994400 )); -DATA(insert OID = 0 ( avi 31080 t t t t _null_ 2116994400 )); -DATA(insert OID = 0 ( kristin 1123 t t t t _null_ 2116994400 )); -DATA(insert OID = 0 ( andrew 5229 t t t t _null_ 2116994400 )); -DATA(insert OID = 0 ( nobuko 5493 t t t t _null_ 2116994400 )); -DATA(insert OID = 0 ( hartzell 6676 t t t t _null_ 2116994400 )); -DATA(insert OID = 0 ( devine 6724 t t t t _null_ 2116994400 )); -DATA(insert OID = 0 ( boris 6396 t t t t _null_ 2116994400 )); -DATA(insert OID = 0 ( sklower 354 t t t t _null_ 2116994400 )); -DATA(insert OID = 0 ( marcel 31113 t t t t _null_ 2116994400 )); -DATA(insert OID = 0 ( ginger 3692 t t t t _null_ 2116994400 )); -DATA(insert OID = 0 ( woodruff 31026 t t t t _null_ 2116994400 )); -DATA(insert OID = 0 ( searcher 8261 t t t t _null_ 2116994400 )); - -BKI_BEGIN -#endif /* ALLOW_PG_GROUP */ -BKI_END +DATA(insert OID = 0 ( POSTGRES PGUID t t t t PASSWORD _null_ )); #endif /* PG_SHADOW_H */ |