-- création de la séquence "sequence_suivi_id"
CREATE SEQUENCE public.sequence_suivi_id
INCREMENT 1
START 1
MINVALUE 1
MAXVALUE 1000000 ;

ALTER SEQUENCE public.sequence_suivi_id OWNER TO postgres;
COMMENT ON SEQUENCE public.sequence_suivi_id IS 'Sequence sur le champ id de la table suivi';

-- création de la table "public.suivi"
CREATE TABLE public.suivi (
id integer NOT NULL DEFAULT nextval('"sequence_suivi_id"'::regclass),
schema character varying(15) NOT NULL,
nomtable character varying(50) NOT NULL,
utilisateur character varying(25),
dateheure timestamp NOT NULL DEFAULT localtimestamp,
action character varying(1) NOT NULL CHECK (action IN ('I','D','U')),
dataorigine text,
datanouvelle text,
detailmaj text,
idobjet integer,
CONSTRAINT "pk_suivi" PRIMARY KEY (id))
TABLESPACE pg_default ;

ALTER TABLE public."suivi" OWNER to postgres ;
-- création des index
CREATE INDEX index_suivi_nomtable ON public.suivi(((schema||'.'||nomtable)::TEXT) );
CREATE INDEX index_suivi_dateheure ON public.suivi(dateheure) ;
CREATE INDEX index_suivi_action ON public.suivi(action);
CREATE INDEX index_suivi_idobjet ON public.suivi(idobjet);

-- création de la fonction "fonction_suivi_maj()"
CREATE OR REPLACE FUNCTION public.fonction_suivi_maj()
RETURNS TRIGGER AS $body$
DECLARE
variable_ancienne_valeur TEXT;
variable_nouvelle_valeur TEXT;
identifiant INTEGER;
BEGIN
IF (TG_OP = 'UPDATE') THEN
variable_ancienne_valeur := ROW(OLD.*);
variable_nouvelle_valeur := ROW(NEW.*);
identifiant := OLD.gid;
INSERT INTO public.suivi (schema,nomtable, utilisateur, action, dataorigine, datanouvelle, detailmaj, idobjet)
VALUES (TG_TABLE_SCHEMA::TEXT, TG_TABLE_NAME::TEXT, session_user::TEXT, substring(TG_OP,1,1),
variable_ancienne_valeur, variable_nouvelle_valeur, current_query(), identifiant);
RETURN NEW;
ELSIF (TG_OP = 'DELETE') THEN
variable_ancienne_valeur := ROW(OLD.*);
identifiant := OLD.gid;
INSERT INTO public.suivi (schema, nomtable, utilisateur, action, dataorigine, detailmaj, idobjet)
VALUES (TG_TABLE_SCHEMA::TEXT, TG_TABLE_NAME::TEXT, session_user::TEXT, substring(TG_OP,1,1), 
variable_ancienne_valeur, current_query(), identifiant);
RETURN OLD;
ELSIF (TG_OP = 'INSERT') THEN
variable_nouvelle_valeur := ROW(NEW.*);
identifiant := NEW.gid;
INSERT INTO public.suivi (schema, nomtable, utilisateur, action, datanouvelle, detailmaj, idobjet)
VALUES (TG_TABLE_SCHEMA::TEXT, TG_TABLE_NAME::TEXT, session_user::TEXT, substring(TG_OP,1,1), 
variable_nouvelle_valeur, current_query(), identifiant);
RETURN NEW;
ELSE
RAISE WARNING '[public.fonction_suivi_maj] - Other action occurred: %, at %', TG_OP,now();
RETURN NULL;
END IF;
END;
$body$
LANGUAGE plpgsql
SECURITY DEFINER

-- création des triggers 
CREATE TRIGGER trigger_suivimaj_commune
 AFTER INSERT OR UPDATE OR DELETE ON commune
 FOR EACH ROW EXECUTE PROCEDURE public.fonction_suivi_maj();

CREATE TRIGGER trigger_suivimaj_interco
 AFTER INSERT OR UPDATE OR DELETE ON interco
 FOR EACH ROW EXECUTE PROCEDURE public.fonction_suivi_maj();