On Tue, Apr 15, 2025 at 9:31 AM Adrian Klaver <adrian.kla...@aklaver.com>
wrote:

> On 4/15/25 09:21, Igor Korot wrote:
> >
> >
>
> > Hi, David,
> >
> > On Tue, Apr 15, 2025 at 9:56 AM David G. Johnston
> > <david.g.johns...@gmail.com <mailto:david.g.johns...@gmail.com>> wrote:
> >
> >     On Tuesday, April 15, 2025, Igor Korot <ikoro...@gmail.com
> >     <mailto:ikoro...@gmail.com>> wrote:
> >
> >         Hi, ALL,
> >         Is there a field in the pg_databases table which indicates that
> >         particular DB is a system one?
> >
> >
> >     What is a system database?
> >
> >
> > I consider system database a database that is created by default when
> > the server is run for the first time.
>
> Agreed.
>
> The fact that initdb creates the template0, template1 and postgres
> databases and you can't change that makes them system not user databases.
>

Based on that definition there is a boundary in the system where OIDs are
considered bootstrap/system OIDs versus user OIDs.  Key off of that.
Though since the names never change, and there are always/only three, it
seems pointless to use the OID aspect of initdb as a basis.

My definition of a "system database" would be a database that, if it didn't
exist, would cause the system to break.  i.e., is a database whose presence
is integral to the operations of the system.  None of these qualify under
that definition.  Which is why there is no column in pg_database
identifying system databases - there are none.

The system will continue to operate if you do:

initdb
createdb newdb
psql -c 'alter database template0 is_template false;'
dropdb template0
psql -c 'alter database template1 is_template false;'
dropdb template1
dropdb --maintenance-db newdb postgres


An operational definition worth considering, though, is that any database
owned by the bootstrap superuser is a system database.  After all, the
system owner created/owns them?  If you want non-system databases for your
application, assign their ownership to a non-system role.

David J.

Reply via email to