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

PL/SQL Oracle Discussion :

Trigger sysdate et clé primaire


Sujet :

PL/SQL Oracle

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Par défaut Trigger sysdate et clé primaire
    Bonjour,

    Dans le cadre de l'utilisation de SQL Loader (voir mon topic ici) j'ai crée un trigger qui met à jour la date de création de l'enregistrement inséré.

    Le souci est que j'ai une clé primaire sur le couple (date_creation, nom) et mon trigger insère la même date pour toutes les lignes Je pensais avoir un décalage au niveau des millièmes de secondes mais non :
    DATE_CREA NOM_FILLE
    ---------------------- ------------
    2009-01-27 11:14:57.0 DUPONT
    2009-01-27 11:14:57.0 MARTEAU
    2009-01-27 11:14:57.0 MACHIN

    Comment puis-je faire pour que la date diffère ? J'aimerais qqch comme ça :

    DATE_CREA NOM_FILLE
    ---------------------- ------------
    2009-01-27 11:14:57.0 DUPONT
    2009-01-27 11:14:58.1 MARTEAU
    2009-01-27 11:14:59.2 MACHIN

    ou comme ça :

    DATE_CREA NOM_FILLE
    ---------------------- ------------
    2009-01-27 11:14:57.0 DUPONT
    2009-01-27 11:14:58.0 MARTEAU
    2009-01-27 11:14:59.0 MACHIN

    Comment puis-je faire ?

    D'avance merci

  2. #2
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Cela aurait été plus simple d'utiliser une séquence.

  3. #3
    Membre expérimenté
    Inscrit en
    Janvier 2009
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 162
    Par défaut
    Bonjour,

    As-tu essayé un TIMESTAMP au lieu d'un champ DATE ?

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par babylone7 Voir le message
    Bonjour,

    Dans le cadre de l'utilisation de SQL Loader (voir mon topic ici) j'ai crée un trigger qui met à jour la date de création de l'enregistrement inséré.

    Le souci est que j'ai une clé primaire sur le couple (date_creation, nom) et mon trigger insère la même date pour toutes les lignes Je pensais avoir un décalage au niveau des millièmes de secondes mais non :
    DATE_CREA NOM_FILLE
    ---------------------- ------------
    2009-01-27 11:14:57.0 DUPONT
    2009-01-27 11:14:57.0 MARTEAU
    2009-01-27 11:14:57.0 MACHIN

    Comment puis-je faire pour que la date diffère ? J'aimerais qqch comme ça :

    DATE_CREA NOM_FILLE
    ---------------------- ------------
    2009-01-27 11:14:57.0 DUPONT
    2009-01-27 11:14:58.1 MARTEAU
    2009-01-27 11:14:59.2 MACHIN

    ou comme ça :

    DATE_CREA NOM_FILLE
    ---------------------- ------------
    2009-01-27 11:14:57.0 DUPONT
    2009-01-27 11:14:58.0 MARTEAU
    2009-01-27 11:14:59.0 MACHIN

    Comment puis-je faire ?

    D'avance merci
    changer de primary key !

    espérer que le cas d'un éventuel homonyme soit résolu uniquement par le hasard d'un timestamp différent n'est pas une très bonne idée …

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Par défaut
    JeitEmgie , mon exemple ici est avec des noms, mais mon cas réel concernera des numéros de commande, on ne doit pas traiter 2 fois la même commande à un instant t en principe

    Mathias44 je vais essayer merci

    SheikYerbouti oui j'en suis arrivée là, à me dire que je vais créer un id mais ca remet en cause tout le reste du développement déjà accompli

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Par défaut
    Mathias44 ça fait pareil avec un timestamp

  7. #7
    Membre expérimenté
    Inscrit en
    Janvier 2009
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 162
    Par défaut
    Alors là babylone7 tu m'étonnes

    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
    SQL> create table matable (madate timestamp);
     
    Table created.
     
    SQL> insert into matable select sysdate from dual;
     
    1 row created.
     
    SQL> insert into matable select systimestamp from dual;
     
    1 row created.
     
    SQL> select * from matable;
     
    MADATE
    ---------------------------------------------------------------------------
    27-JAN-09 02.54.01.000000 PM
    27-JAN-09 02.54.07.748736 PM

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Par défaut
    En effet j'ai testé les 2 select
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT sysdate FROM dual;
     
    SELECT sytimestamp FROM dual;
    et j'obtiens comme toi !

    Mais tu parles d'utiliser sytimestamp dans le trigger ?
    Car en fait pour mon test j'ai modifié ma colonne DATE_CREA en TIMESTAMP, j'ai supprimé le trigger et j'ai fait mon sql loader en ajoutant "DATE_CREA TIMESTAMP"

    mais je vais modifier ca au niveau du trigger

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Par défaut
    Ca marche Mathias44

    Merci beaucoup !!

    Tu serais pas doué en SqlLoader aussi par hasard ? J'ai des soucis sur mon topic mais j'ai pas de réponse

  10. #10
    Membre expérimenté
    Inscrit en
    Janvier 2009
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 162
    Par défaut
    Le timestamp est + précis mais il y a une contrepartie en termes de stockage : 7 octets pour un champ DATE contre jusqu'à 11 pour un TIMESTAMP.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Par défaut
    Oui je ne vais l'utiliser que pour cette date là, les autres resteront en DATE, en espérant que les développements deja en place seront compatible

    Merci bcp !!

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Par défaut
    Par contre avant, quand mon champ était une date, pour avoir les données du jour je mettais dans ma clause WHERE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE DATE_CREA LIKE SYSDATE
    Maintenant avec un timestamp, j'ai tenté un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE DATE_CREA LIKE SYSTIMESTAMP
    mais cela ne fonctionne pas.

    Du coup, je n'ai rien trouvé de mieux que cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE  TO_DATE(TO_CHAR(DATE_CREA,'yyyy-MM-dd'), 'yyyy-MM-dd')  LIKE TO_DATE(TO_CHAR(SYSTIMESTAMP,'yyyy-MM-dd'), 'yyyy-MM-dd')
    Qu'en pensez-vous ?

  13. #13
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Essayez la fonction TRUNC()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select SYSTIMESTAMP, trunc(SYSTIMESTAMP) from dual

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Par défaut
    Merci SheikYerbouti ça marche super bien c'est exactement ce que je cherchais

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 11
    Dernier message: 19/07/2010, 23h48
  2. trigger clé primaire
    Par claire13 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/11/2008, 10h06
  3. Lister clés primaires, etrangères et triggers d'un base
    Par Oliveuh dans le forum Requêtes
    Réponses: 1
    Dernier message: 26/05/2008, 23h26
  4. Clefs primaires assignées par trigger
    Par Costalfy dans le forum Hibernate
    Réponses: 8
    Dernier message: 10/08/2007, 11h59
  5. trigger pour tester une clé primaire
    Par keumlebarbare dans le forum PL/SQL
    Réponses: 3
    Dernier message: 15/04/2007, 10h29

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