PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 12/09/2011 11:47:57

Pascal24
Membre

Function Create Trigger...

Bonjour,
Je suis nouveau sur ce Forum et j'espère être dans la bonne rubrique
Je travaille sur la mise ne place d’une base de données PostgreSQL/PostGis.
J’ai une base de données « bdtest », un schéma «  schematest » et une table « tabletest », dans laquelle je veux que le champ « idtest » se remplisse automatiquement avec une valeur unique qui servira de champs ID spécifique à l’ensemble de la base de données (différentes tables à terme). Ce champ est défini en contrainte de clef primaire.
Pour gérer cette clef unique j’ai mis en place dans le schéma « public » une « séquence » que j’appelle « cpte_idtest », qui génère et distribue aux tables concernées le numéro auto et unique pour la base.
Dans Postgres, avec l’utilisation de la commande suivante ça fonctionne bien :
CREATE TABLE # et de la ligne « idtest integer NOT NULL DEFAULT nextval('cpte_idtest'::regclass),  # appel la valeur suivante de la séquence
Je voudrai faire la même chose en utilisant les fonctions trigger, car je vais mettre à jour la base de données depuis un logiciel externe (SIG ArcEditor/ArcSDE de la société ESRI) et celui-ci n’utilise pas les informations du CREATE TABLE lors de l’insertion d’une nouvelle donnée. L’incrémentation ne fonctionne pas.
Le support d’ESRI m’a dit qu’il fallait utiliser les fonctions trigger pour faire cela.
J’ai bien essayé de « rédiger » un CREATE OR REPLACE FUNCTION puis un CREATE TRIGGER mais sans résultat.
Bon je reconnais que je ne suis pas un spécialiste du SQL.
Le message est un peu long,...
Aussi merci d'avance au courageux qui iront jusqu'au bout ;-) et merci de votre aide ou pistes de recherches sur le sujet.
Salutations,
Pascal24

Hors ligne

#2 12/09/2011 12:10:58

gleu
Administrateur

Re : Function Create Trigger...

Il n'a pas besoin d'utiliser quoi que ce soit, il suffit qu'il ne donne pas de valeur à la colonne auto-incrémentée.

Cela étant dit, si vous tenez à passer par les triggers, il faudrait nous dire ce que vous avez essayé pour qu'on puisse vous guider. Quant à la documentation, elle est disponible sur:
* http://docs.postgresql.fr/9.0/triggers.html pour les déclarations de trigger
* http://docs.postgresql.fr/9.0/plpgsql-trigger.html pour coder une procédure stockée en PL/pgsql pour un trigger.


Guillaume.

Hors ligne

#3 12/09/2011 16:48:48

Pascal24
Membre

Re : Function Create Trigger...

Merci Guillaume,

Grace au lien que vous m'avez adressé
* http://docs.postgresql.fr/9.0/plpgsql-trigger.html pour coder une procédure stockée en PL/pgsql pour un trigger.
J'ai pu écrire correctement mon trigger et comprendre le mécanisme.
Ca semble toujours simple quand on a la solution...

-- Création de la table
CREATE TABLE sigprev.carto_cs
(
  carto_ref integer NOT NULL,
  shape st_point,
  CONSTRAINT pk_carto_cs PRIMARY KEY (carto_ref)
)

--Création de la fonction qui appelle la séquence ('cpte_carto_ref_seq')
CREATE OR REPLACE FUNCTION sigprev.test_func()
  RETURNS trigger AS
$BODY$
BEGIN
NEW.carto_ref := nextval('cpte_carto_ref_seq'::regclass);
RETURN NEW;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION sigprev.test_func() OWNER TO postgres;

--Création du trigger qui appel la fonction lors de l'insertion ou la mise à jour de la donnée
CREATE TRIGGER test_trig
  BEFORE INSERT OR UPDATE
  ON sigprev.carto_cs
  FOR EACH ROW
  EXECUTE PROCEDURE sigprev.test_func();

Hors ligne

#4 12/09/2011 17:14:21

gleu
Administrateur

Re : Function Create Trigger...

Parfait smile mais je tiens quand même à dire que ce n'est pas une bonne solution, peut-être la meilleure possible dans votre cas. Certainement pas la meilleure en règle général, notamment pour les performances.


Guillaume.

Hors ligne

Pied de page des forums