Re: [GENERAL] Table Update Systems (was: chosing a database name)

2005-07-13 Thread Karsten Hilbert
On Wed, Jul 13, 2005 at 05:23:06PM -0500, Jeffrey Melloy wrote:

> I'm currently looking at implementing a system almost exactly like this, 
> and I was wondering if there is anything around that does this.

Attached find how GNUmed does it based on recent discussion
here on the list.

Karsten
-- 
GPG key ID E4071346 @ wwwkeys.pgp.net
E167 67FD A291 2BEA 73BD  4537 78B9 A9F9 E407 1346
-- =
-- project: GNUmed
-- $Source: /cvsroot/gnumed/gnumed/gnumed/server/sql/gmSchemaRevision.sql,v $
-- $Id$
-- license: GPL
-- author: [EMAIL PROTECTED]

-- =
-- import this file into any database you create and
-- add the revision of your schema files into the revision table,
-- this will allow for a simplistic manual database schema revision control,
-- that may come in handy when debugging live production databases,

-- TODO: add log_script_insertion(text, text, boolean)

-- for your convenience, just copy/paste the following lines:
-- (don't worry about the filename/revision that's in there, it will
--  be replaced automagically with the proper data by "cvs commit")

-- do simple schema revision tracking
-- INSERT INTO gm_schema_revision (filename, version, is_core) 
VALUES('$RCSfile: gmSchemaRevision.sql,v $', '$Revision: 1.12 $', True/False);

-- =
-- force terminate + exit(3) on errors if non-interactive
\set ON_ERROR_STOP 1

-- -
create table gm_schema_revision (
pk serial primary key,
filename text
not null,
version text
not null,
is_core boolean
not null,
imported timestamp with time zone
not null
DEFAULT CURRENT_TIMESTAMP,
unique (filename, version)
);

-- -
create table gm_database_revision (
pk serial primary key,
single_row_enforcer boolean
unique
check (single_row_enforcer is True),
identity_hash text
not null
);

-- -
create function calc_db_identity_hash() returns string as '
declare
_row record;
_total text;
begin
total := ;
for _row in (select filename, version from gm_schema_revision where 
is_core order by filename, version) loop
_total := total || select _row.filename || _row.version;
end loop;
select into _tmp select md5(_total);
return _tmp;
end;' language 'plpgsql';

-- =
GRANT SELECT on
gm_schema_revision
, gm_database_revision
TO group "gm-public";

-- =
-- $Log: gmSchemaRevision.sql,v $
-- Revision 1.12  2005/03/01 20:38:19  ncq
-- - varchar -> text
--
-- Revision 1.11  2003/06/10 08:56:59  ncq
-- - schema_revision -> gm_schema_revision
--
-- Revision 1.10  2003/05/12 12:43:39  ncq
-- - gmI18N, gmServices and gmSchemaRevision are imported globally at the
--   database level now, don't include them in individual schema file anymore
--
-- Revision 1.9  2003/01/20 09:15:30  ncq
-- - unique (file, version)
--
-- Revision 1.8  2003/01/17 00:41:33  ncq
-- - grant select rights to all
--
-- Revision 1.7  2003/01/02 01:25:23  ncq
-- - GnuMed internal tables should be named gm_*
--
-- Revision 1.6  2002/12/01 13:53:09  ncq
-- - missing ; at end of schema tracking line
--
-- Revision 1.5  2002/11/17 08:24:55  ncq
-- - store timestamp not just date
--
-- Revision 1.4  2002/11/17 08:22:44  ncq
-- - forgot DEFAULT
--
-- Revision 1.3  2002/11/17 08:20:15  ncq
-- - added timestamp field
--
-- Revision 1.2  2002/11/16 00:25:59  ncq
-- - added some clarification
--
-- Revision 1.1  2002/11/16 00:23:20  ncq
-- - provisions for simple database schema revision tracking
-- - read the source for instructions
--

---(end of broadcast)---
TIP 3: Have you checked our extensive FAQ?

   http://www.postgresql.org/docs/faq


[GENERAL] Table Update Systems (was: chosing a database name)

2005-07-13 Thread Jeffrey Melloy



I think a better approach is to handle configuration management with a
table in each schema.  Update the schema, update the table.  This works
well with automating database upgrades as well, where upgrades are written
as scripts, and applied in a given order to upgrade a database from release
A to C, or A to X, depending on when it was archived.  A script naming
convention (e.g. numerical) can determine order, and each script can
register in (write a line to) the configuration management table.  This
allows for error analysis, among other things.

Rick


I'm currently looking at implementing a system almost exactly like this, 
and I was wondering if there is anything around that does this.


Jeff

---(end of broadcast)---
TIP 5: don't forget to increase your free space map settings