CREATE OR REPLACE FUNCTION make_plpgsql() RETURNS VOID AS $$ CREATE LANGUAGE plpgsql; $$ LANGUAGE SQL; SELECT CASE WHEN EXISTS( SELECT 1 FROM pg_catalog.pg_language WHERE lanname='plpgsql' ) THEN NULL ELSE make_plpgsql() END; DROP FUNCTION make_plpgsql(); CREATE OR REPLACE FUNCTION create_deploy_table() RETURNS VOID AS $$ BEGIN CREATE TABLE _deploy ( app VARCHAR(40) NOT NULL PRIMARY KEY, seq INTEGER NOT NULL DEFAULT 0, ctime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, type VARCHAR(20), data VARCHAR ); EXCEPTION WHEN duplicate_table THEN -- Do nothing END; $$ LANGUAGE plpgsql; SELECT create_deploy_table(); DROP FUNCTION create_deploy_table(); CREATE OR REPLACE FUNCTION deploy_autoinc() RETURNS trigger AS $$ BEGIN NEW.seq := NEW.seq + 1; RETURN NEW; END; $$ LANGUAGE plpgsql; DROP TRIGGER IF EXISTS au__deploy ON _deploy; CREATE TRIGGER au__deploy BEFORE UPDATE ON _deploy FOR EACH ROW EXECUTE PROCEDURE deploy_autoinc();