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

Reply via email to