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 Re : PL/pgSQL » TG_TABLE_NAME Undefined table » 26/07/2014 02:27:39

Merci bien.

Pour ceux que cela intéresse, la page Instructions de base de la doc détaillant les commandes dynamiques.

J'ai abouti à

EXECUTE 'SELECT MIN(spr_date_entree_en_vigueur) FROM ' || TG_TABLE_SCHEMA || '.' || TG_TABLE_NAME || ' WHERE svc_id=$1' INTO date_prix_initial USING OLD.svc_id;

L'utilisation de EXECUTE est quelque peu contraignante au regard de mon objectif. Ma requête n'a rien de dynamique, je souhaitais seulement profiter des variables disponibles dans une fonction trigger. Maintenant je me dis qu'il est plus pertinent/efficace dans ce cas de saisir directement le nom de la table. Mais j'en sais un peu plus...

#2 PL/pgSQL » TG_TABLE_NAME Undefined table » 25/07/2014 21:55:12

pyd001
Réponses : 2

Salut,
J'ai ces quelques lignes dans une fonction pour un trigger 'DELETE'

DECLARE
date_prix_initial date;
BEGIN
    date_prix_initial = (SELECT MIN(spr_date_entree_en_vigueur) FROM TG_TABLE_NAME WHERE svc_id=OLD.svc_id);

j 'ai cette erreur :
    SQLSTATE[42P01]: Undefined table: 7 ERROR:  relation "tg_table_name" does not exist

1. Est-ce parce que TG_TABLE_NAME n'est pas visible depuis la requête?

2. Sans parenthèses autour du SELECT j'avais une erreur de syntaxe. Les parenthèses sont-elles requises?

Merci pour vos lumières.

#4 Général » Comparaison de dates entre tables via un trigger » 13/12/2011 16:38:28

pyd001
Réponses : 5

Bonjour,
j'ai créé 3 tables pour "historiser" les  adresses de facturation:

t_address                             t_invoice_address               t_invoice_address_history                   
adr_id   PK                           cli_id    PK                          iah__id    PK
cli_id                                     adr_id                                 adr_id
....                                         iva_date_begin                  iah_date_begin
adr_date_create                                                             iah_date_end

Pour info, t_invoice_address référence l'adresse de facturation courante et t_invoice_address_history les adresses de facturation pour l'édition de factures avec d'anciennes adresses.

Je suis en train de créer des jeux de test et je pensais renforcer la cohérence du modèle de données.
Par ex, lors de l'INSERT/UPDATE d'un record dans t_invoice_address la valeur de iva_date_begin ne devra pas être antérieure à t_address.adr_date_create

J'ai quelques questions concernant la mise en place de ces vérifications:

1. Je pense utiliser un trigger pour les réaliser. Existe-t-il une alternative?
2. Si j'utilise un trigger, je ne peut pas y effectuer la comparaison. Je dois utiliser une procédure pour le faire?
2. J'aurai besoin de la valeur de t_invoice_address.iva_date_begin dans la procédure. Je peux:
    - la passer en paramètre depuis le trigger;
    - utiliser une "procédure trigger" afin de disposer de la variable NEW directement.
    2.1. La seconde solution semble la plus simple mais y a-t-il des inconvénients à utiliser une "procédure trigger" plutôt qu'une "procédure"?
    2.2. Si j'utilise la seconde, suis-je certain que la valeur de NEW sera celle du trigger qui a appelé la procédure et pas d'un autre (appelé entre temps) ou faudra-t-il
           vérifier le nom du trigger appelant?
3. Si la comparaison échoue (date non conforme), la procédure génère une erreur. Dois-je me soucier de la valeur de retour de la procédure? L'erreur arrête-t-elle son exécution comme dans d'autres langages?
4. S'il n'y a pas d'erreur est-ce que la procédure doit retourner NULL ou les données à insérer/modifier - dans le cas d'une "procédure trigger"?

Bon je m'arrête là - pour l'instant. Merci d'avance pour votre aide.

Pied de page des forums

Propulsé par FluxBB