Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3011 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [Postgresql]Trigger à partir d'une liste

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Postgresql]Trigger à partir d'une liste

n°2443763
Zim_zum63
Ni en pedo !!!
Posté le 29-03-2023 à 15:28:28  profilanswer
 

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.
 
 
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


---------------
Vous voulez pas un whisky d'abord ?
mood
Publicité
Posté le 29-03-2023 à 15:28:28  profilanswer
 

n°2443774
pluj
Posté le 29-03-2023 à 17:29:46  profilanswer
 

Lu,
 

Citation :

IF NEW.DATE > cast(now() as date)


 
Tu dois pouvoir le mettre directement en condition de déclenchement de ton trigger (mot clé WHEN)
 

Citation :

NEW.B4


 
Je ne sais pas pourquoi il y a NEW ici ?
 

Citation :

A2 = B2

et

Citation :

A2 = B3


 
Ne peuvent pas être vraies. Par exemple 'X;Y;Z' ne peut être égal à 'Y'
 

Code :
  1. UPDATE B
  2. SET B4 = 'true'
  3. FROM (
  4.    SELECT regexp_split_to_table(A2, ';')
  5.    FROM A
  6. ) AS t(A)
  7. WHERE t.A IN(B2, B3)
  8. ;


? (c'est normal qu'elle ne dépend pas de NEW ? - ie ça MàJ potentiellement toute la table)
 
PS : je ne ferai pas de commentaire sur la structure (des chaînes au lieu de booléens, première forme normale non respectée), pour en être à ce point
 
PPS : mon jeu de test, si jamais, à défaut d'en avoir fourni un
 

Code :
  1. DROP TABLE A;
  2. DROP TABLE B;
  3.  
  4. CREATE TABLE A(
  5.    A1 INT NOT NULL,
  6.    A2 VARCHAR NOT NULL,
  7.    DATE DATE NOT NULL
  8. );
  9.  
  10. INSERT INTO A VALUES(1, 'X;Y;Z', '2023-03-29');
  11. INSERT INTO A VALUES(2, 'K;L;M', '2023-04-21');
  12.  
  13. CREATE TABLE B(
  14.    B1 INT NOT NULL,
  15.    B2 VARCHAR NULL,
  16.    B3 VARCHAR NULL,
  17.    B4 VARCHAR NOT NULL
  18. );
  19.  
  20. INSERT INTO B VALUES(1, 'X', NULL, 'true');
  21. INSERT INTO B VALUES(2, 'Y', NULL, 'true');
  22. INSERT INTO B VALUES(3, NULL, 'Z', 'true');
  23. INSERT INTO B VALUES(4, NULL, 'K', 'false');
  24. INSERT INTO B VALUES(5, NULL, 'L', 'false');
  25. INSERT INTO B VALUES(6, 'M', NULL, 'false');


Message édité par pluj le 29-03-2023 à 17:52:20
n°2443897
Zim_zum63
Ni en pedo !!!
Posté le 31-03-2023 à 09:18:28  profilanswer
 

Merci beaucoup pour ton retour qui m'a permis d'arriver à mes fins !
 
En effet la structure de la table est perfectible notamment sur le principe même de liste au sein d'un champ, mais je dois reprendre un tableau de suivi existant qui est fait comme cela et qui n'a pas vocation à être modifié.  
Par contre le champ booléen est un vrai booléen, j'avais mis la chaine juste pour l'exemple.  
 


---------------
Vous voulez pas un whisky d'abord ?

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [Postgresql]Trigger à partir d'une liste

 

Sujets relatifs
En Java, vous pouvez convertir une liste en tableau.Requete SQL (PostgreSQL)
[Powershell] [RESOLU] Lire caractères à partir du 17eme d'une chaineRegex récupérer valeur à partir d'un caractère
statistique liste avec elements fauxComportement champ liste sélection multiple différent entre PHP5 et 8
Comment tester une liste d'URLs en batch ou PS avec log ?Quel hébergeur pour BDD POSTGRESQL ?
Alimenter une base de données Postgresql[PostgreSQL] Requête hiérarchique
Plus de sujets relatifs à : [Postgresql]Trigger à partir d'une liste


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR