IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes PostgreSQL Discussion :

Trigger à partir d'une liste


Sujet :

Requêtes PostgreSQL

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2023
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2023
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Trigger à partir d'une liste
    Bonjour à tout le monde.

    Alors voilà, étant novice dans le monde des triggers, je butte sur un problème...

    J'ai deux tables :


    Table A :

    A1 A2 DATE

    1 X;Y;Z 29/03/2023
    2 K;L;M 01/04/2023
    Table B

    B1 B2 B3 B4
    1 X true
    2 Y true
    3 Z true
    4 K false
    5 L false
    6 M false

    L'idée, ce que le champ A2 contient une liste d'identifiants séparés par ;
    Le champ DATE est mis à jour, c'est de cette mise à jour que le trigger doit se déclencher (si DATE > cast(now() as date) )

    Une fois le trigger déclenché, c'est le champ B4 qui doit être modifié.
    Si la condition au-dessus est vérifié, alors le champ (booléen) passe à true, sinon ça reste par défaut en false.
    Et, puisque sinon c'est pas assez tordu, les identifiants du champ A2 ont une référence tantôt dans le champ B2 tantôt dans le champ B3.


    J'ai fait un trigger, qui ne semble pas poser de problème de code en soit (j'arrive à le sauvegarder sans que pgadmin me saute dessus), mais quand je vais les mises à jour, rien ne se passe...
    Il est déclaré en AFTER, FOR EACH ROW, et autant en INSERT qu'en UPDATE.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    BEGIN
     
    IF NEW.DATE > cast(now() as date)
    THEN
     
    UPDATE B
    SET NEW.B4 = 'true'
    where B2 in (select regexp_split_to_table(A2,';')from A INNER JOIN B on A2 = B2) or B3 in (select regexp_split_to_table(A2,';')from A INNER JOIN B on A2 = B3);
     
    END IF ;
    RETURN NEW;
    END ;
    Est-ce que quelqu'un aurait une idée ?

    Merci d'avance smile

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    J'écrirais l'UPDATE plutôt comme ça :

    B4 n'est pas en cours de modification donc pas de NEW, et il faut récupérer le A2 de la ligne modifiée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    update B 
       set B4 = true
     where position(concat(';',B2,';') in concat(';',new.A2,';')) >= 1
        or position(concat(';',B3,';') in concat(';',new.A2,';')) >= 1;
    PS : J'ai fait un test avec db-fiddle, mais il faut mettre en quote le code de création de la fonction, et doubler les quotes dans le code.... pas nécessaire hors db-fiddle
    https://www.db-fiddle.com/f/rsWkpaJtuzZSexBrcGZUZ1/0

Discussions similaires

  1. Nouveau "recordset" a partir d'une liste !!!
    Par AngelsGuardian dans le forum Access
    Réponses: 1
    Dernier message: 01/11/2005, 20h46
  2. Réponses: 32
    Dernier message: 22/09/2005, 10h40
  3. Réponses: 3
    Dernier message: 19/05/2005, 17h52
  4. Réponses: 3
    Dernier message: 25/04/2005, 15h26
  5. Trouver equation à partir d'une liste de points
    Par scarabee dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 27/05/2004, 17h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo