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

SQL Oracle Discussion :

Trigger update automatique suivant la date


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Avril 2013
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 148
    Points : 58
    Points
    58
    Par défaut Trigger update automatique suivant la date
    Bonjour à tous,

    voici mon problème, j'ai une table (MaTable) comportant plusieurs champs, dont un qui est une date (champs_date), et un autre qui est un texte (champs_text, par défaut "Prévision").
    J'aimerai qu'automatiquement, lorsque la date du champs est inférieur à la date actuelle, le champs texte devienne "Validé".

    D'après mes recherches il faudrait créer un trigger, mais je n'ai aucune idée de comment le réaliser.

    Merci de votre aide !

  2. #2
    Membre du Club
    Inscrit en
    Avril 2013
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 148
    Points : 58
    Points
    58
    Par défaut
    J'ai essayé de faire ça mais ça ne fonctionne pas, je ne sais pas comment exprimer si "champs_date <= sysdate() " ALORS champs_texte = 'VALIDE'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE OR REPLACE TRIGGER S03.update_etat
    AFTER UPDATE
    ON S03.MaTable
        FOR EACH ROW
        WHEN champs_date <= sysdate() 
        champs_texte = 'VALIDE';
    Merci de votre aide

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    1. On ne parle pas de champs mais de colonnes dans une base de données
    2. Il vaut mieux passer par une vue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE OR REPLACE VIEW v_MaTable
    AS
    select ...
         , case
             when col_date <= sysdate
             then 'Validé'
             else 'Prévision'
           end as col_texte
      from MaTable;
    Le trigger ne se déclenche que si vous modifiez une ligne dans la table.
    La vue modifiera "automatiquement" la valeur de col_texte en fonction de la date à laquelle la vue sera interrogée.

  4. #4
    Membre du Club
    Inscrit en
    Avril 2013
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 148
    Points : 58
    Points
    58
    Par défaut
    Merci, mais je ne comprend pas ce que je dois mettre à la place des "..." "," ?

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Les colonnes de votre table.

  6. #6
    Membre du Club
    Inscrit en
    Avril 2013
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 148
    Points : 58
    Points
    58
    Par défaut
    J'ai donc fait ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE OR REPLACE VIEW v_MaTable
    AS
    select col_date, 
           case
             when col_date <= sysdate
             then 'Validé'
             else 'Prévision'
           end as col_texte
      from MaTable;
    Mais ça ne fait rien...
    Qu'est ce que je peux faire d'autre ? merci

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Et bien...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from v_MaTable
    Et non les données ne changent pas, c'est bien le but.

    Votre donnée dépendant d'un facteur temporel n'a pas à être physiquement stocké.

  8. #8
    Membre du Club
    Inscrit en
    Avril 2013
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 148
    Points : 58
    Points
    58
    Par défaut
    En sélectionnant la vue j'ai le résultat.
    Mais justement ce n'est pas ce que je veux (créer une vue), je veux que les données soient directement changées dans la table (un update quoi).

    Merci encore de l'aide !!

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Et j'essaie de vous expliquer que changer les données dans la table n'est pas la bonne façon de faire.
    Votre sysdate est modifié à chaque seconde.
    Afin de respecter votre règle de gestion, il faut que votre déclencheur soit exécuté chaque seconde, 24h/24 et 7j/7.
    C'est un travail 100% inutile et contre performant.
    Au choix :
    1. vous êtes en froid avec votre employeur et vous voulez lui coller quelques déclencheurs de la sorte afin de lui mettre sa base à genou
    2. vous voulez des données fausses
    3. vous m'écoutez et vous utilisez la vue

  10. #10
    Membre du Club
    Inscrit en
    Avril 2013
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 148
    Points : 58
    Points
    58
    Par défaut
    D'accord.
    Je veux juste que la table soit mise à jour toute les 24h.
    Il ne faut surement pas utiliser sysdate, qui change toutes les secondes, mais un truc du genre format( sysdate, "dd/mm/yyyy").

    Col_date représente un jour au format ("dd/mm/yyyy")
    Il faut donc juste que la table fasse une mise à jour toutes les 24h.
    Ce que je demande n'est pas réalisable ?

  11. #11
    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
    Quel est le SGBD ?
    Si sysdate c'est pour oracle (déjà il n'y a pas de ()) ensuite il faut utiliser un job planifié avec :
    DBMS_SCHEDULER ou DBMS_JOB

    Si c'est un autre SGBD il faut regarder les équivalents ou passer par le planificateur de l'OS s'il n'y en a pas.

  12. #12
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    @skuatamad, en fait il y a une petite blague avec sysdate :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') as sysday from dual;
     
    SYSDAY
    -------------------
    2013-07-31 09:10:43
     
    select to_char(sysdate(), 'yyyy-mm-dd hh24:mi:ss') as sysday from dual;
    -- ORA-00907: missing right parenthesis
     
    declare
      v$_sysday   varchar2(19);
    begin
      select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') into v$_sysday from dual;
      dbms_output.put_line('Sysdate   : ' || v$_sysday);
      select to_char(sysdate(), 'yyyy-mm-dd hh24:mi:ss') into v$_sysday from dual;
      dbms_output.put_line('Sysdate() : ' || v$_sysday);
    end;
    /
     
    Sysdate   : 2013-07-31 09:11:25
    Sysdate() : 2013-07-31 09:11:25
     
    Statement processed.

  13. #13
    Membre du Club
    Inscrit en
    Avril 2013
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 148
    Points : 58
    Points
    58
    Par défaut
    Merci de votre réponse.
    Pour le SGBD c'est TOAD pour le moment.

    Et si on fait un udapte à chaque fois que quelqu'un va dans la table c'est pareil il faudra un planificateur ?

  14. #14
    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
    Citation Envoyé par Waldar Voir le message
    en fait il y a une petite blague avec sysdate :
    Effectivement

    Citation Envoyé par sasafca Voir le message
    Pour le SGBD c'est TOAD pour le moment.
    Toad est un outil pas une base de donnée.
    Citation Envoyé par sasafca Voir le message
    Et si on fait un udapte à chaque fois que quelqu'un va dans la table c'est pareil il faudra un planificateur ?
    Si le besoin est de déclencher une action à intervalle régulier automatiquement, on utilise un job.
    Si le besoin est de déclencher une action à chaque modification d'une table, on utilise un trigger.

    Dans votre cas il faut utiliser un job et non un trigger.

  15. #15
    Membre du Club
    Inscrit en
    Avril 2013
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 148
    Points : 58
    Points
    58
    Par défaut
    Base oracle, Carl Master.
    Un trigger pour qu'à chaque actualisation/ouverture de la table ça existe ?

  16. #16
    Membre habitué

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Septembre 2008
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2008
    Messages : 110
    Points : 167
    Points
    167
    Par défaut
    les triggers sont seulement pour ajout/modif/suppression

    mots clés ici : tâche planifiée.

Discussions similaires

  1. UPDATE automatique dès la date passée
    Par davok dans le forum Langage SQL
    Réponses: 10
    Dernier message: 01/05/2015, 11h53
  2. Ajout d'une colonne automatiquement suivant date
    Par paflolo dans le forum Access
    Réponses: 7
    Dernier message: 07/03/2006, 17h51
  3. [trigger] update inserted?
    Par cosminutza dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 01/06/2005, 09h37
  4. Réponses: 2
    Dernier message: 10/05/2005, 18h15
  5. Trigger Update et Column_Updated
    Par Pm dans le forum Développement
    Réponses: 2
    Dernier message: 16/06/2004, 09h07

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