Suite

Comment créer un déclencheur pour plusieurs schémas ?

Comment créer un déclencheur pour plusieurs schémas ?


Une de mes bases de données PostgreSQL contient différents schémas qui partagent la même structure.

-- schema region_a CREATE TABLE region_a.point ( gid serial NOT NULL, geom geometry(point, SRID), attribute_sample varchar(255), CONSTRAINT point_pkey PRIMARY KEY (gid) ); CREATE TABLE region_a.polygon ( gid serial NOT NULL, geom geometry(polygon, SRID), attribut varchar(255), CONSTRAINT polygon_pkey PRIMARY KEY (gid) ); -- schema region_b CREATE TABLE region_b.point ( gid serial NOT NULL, geom geometry(point, SRID), attribute_sample varchar(255), CONSTRAINT point_pkey PRIMARY KEY (gid) ); CREATE TABLE region_b.polygon ( gid serial NOT NULL, geom geometry(polygon, SRID), attribut varchar(255), CONSTRAINT polygon_pkey PRIMARY KEY (gid) ); -- schéma region_c --…

Maintenant, je me demande comment créer un déclencheur pour ajouter des exemples de points sur les entités surfaciques dans un schéma.

CRÉER OU REMPLACER UNE FONCTION sample_attribute_from_polygon() RETOURNE le déclencheur AS $body$ BEGIN NEW.attribute_sample = (SELECT attribut FROM polygon WHERE ST_Within(NEW.geom, polygon.geom)); RETOUR NEUF ; FINIR; $body$ LANGUE plpgsql; CREATE TRIGGER sample_attribute_from_polygon_tg AVANT L'INSERTION OU LA MISE A JOUR SUR le point POUR CHAQUE LIGNE EXECUTER LA PROCEDURE sample_attribute_from_polygon();

Existe-t-il un moyen d'utiliser le même déclencheur pour tous les schémas ? Je recherche une solution qui fonctionne également lors du renommage d'un schéma.


Vous pouvez lier une fonction de déclenchement à autant de tables que vous le souhaitez ; il suffit d'exécuter unCRÉER UN DÉCLENCHEURdéclaration pour chaque liaison. Assurez-vous de qualifier le nom de la table dans votre déclaration (AVANT L'INSERTION OU LA MISE A JOUR SUR a.pointetc.) Si vous avez un grand nombre de schémas, vous pouvez générer le SQL dynamiquement en itérant sur les lignes dansinformation_schema.schemata.

Si la fonction de déclenchement doit faire quelque chose de différent selon la table sur laquelle elle s'exécute, vous pouvez accéder au schéma et au nom de la table viaTG_TABLE_SCHEMAetTG_TABLE_NAME. (Voir la doc pour toutes les variables disponibles).

Dans votre cas, une fonction de déclenchement dynamique pourrait ressembler à ceci :

CRÉER OU REMPLACER UNE FONCTION sample_attribute_from_polygon() RETOURNE le déclencheur AS $body$ BEGIN EXECUTE 'SELECT attribut FROM ' || TG_TABLE_SCHEMA || '.polygon WHERE ST_Within($1, polygon.geom) LIMIT 1' USING NEW.geom INTO NEW.attribute_sample; RETOUR NEUF ; FINIR; $body$ LANGUE plpgsql;

Voir la vidéo: Miten tehdään #YouTube kanava? TUBETTAJAKSI 2021