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

Sybase Discussion :

[T-SQL]delete table declenche par trigger


Sujet :

Sybase

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Points : 103
    Points
    103
    Par défaut [T-SQL]delete table declenche par trigger
    J'ai créé ce trigger :
    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
     
    create trigger custom.tmonth on
    custom.custom_sjour for insert
    as
    begin
      declare @inserted_month integer
      declare @sjour_month integer
      select @inserted_month = max(month(bdate)) from
        inserted
      select @sjour_month = isnull(max(month(bdate)),0) from
        custom.custom_sjour
      if @inserted_month = @sjour_month
        begin
          delete from custom.custom_sjour
        end
    end
    Le but (souhaité...) de celui-ci est que lorsque j'insère des données dont le max du mois de la colonne bdate des données insérées est égal au max du mois de la colonne bdate de la table custom_sjour la table custom_sjour soit vidée. Le problème est que celui-ci ne fonctionne pas, la table est vidée dans les deux cas suivants (sachant que lors du déclenchement du trigger max(month(custom_sjour.bdate)) est égal à 6) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    insert into custom_sjour(bdate) values('2008-07-14')
     
    insert into custom_sjour(bdate) values('2008-06-14')
    Selon ma logique la table devrait etre vidée dans le second cas mais pas dans le premier !

    merci de votre aide

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Points : 1 828
    Points
    1 828
    Par défaut
    Hmmm... ça me semble assez tordu comme logique, et ne va pas marcher, pour une raison simple:

    Dans le trigger, le select sur custom_bjour va inclure les datas dans la table virtuelle "inserted" - donc ta condition est toujours vraie si le mois dans inserted est plus grand ou égal que le mois déjà dans la table.

    Même si tu réussi à faire marcher ce genre de trigger je le déconseille fortemement - le vidage de la table est trop "magique" à mon sens: un insert dans la table genère son vidage! Quelqu'un qui vient après toi pour comprendre ce qui se passe aura probablement passablement de peine...

    Michael

  3. #3
    Membre habitué
    Inscrit en
    Août 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 134
    Points : 168
    Points
    168
    Par défaut
    En mettant un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT @sjour_month = isnull(max(month(bdate)),0) FROM
        custom.custom_sjour
    where bdate not in (select bdate from inserted)
    Ca peut passer. Mais je reste réservé sur la méthode, tout comme Michael.
    Que se passe-t-il si le delete ne passe pas (syslogs full par exemple)? Peut-on se permettre de bloquer les inserts?? Il faudrait blinder la gestion des erreurs.

    Pourquoi ne pas écrire un processus de purge lancé par cron ou autre tous les soirs? C'est ce que je connais de plus fiable, tu évites l'impact sur les perfs lors de l'insert, et en faisant ça de manière générique tu réutilises mieux ton code.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Points : 103
    Points
    103
    Par défaut
    Je vérifie vos réponses un peu tard car vue que c'était urgent j'ai finalement réglé le problème autrement.

    Etant donné que c'est un programme exécutable qui fait l'inser j'ai modifié celui-ci pour qu'il fasse également le vidage de la table.

    Au départ je me suis dit que ce serait plus propre de coder ça dans un trigger et comme je fais rarement du t-sql ca aurait été l'occasion.... mais finalement je suis d'accord avec vous sur le coté "magique" du delete de la table. Au moins dans l'exe c'est clair d'autant plus que celui-ci est documenté alors que la base.....

    Merci

  5. #5
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 5
    Points : 6
    Points
    6
    Par défaut Bonjour
    J'ai déjà rencontré ce genre de problème au niveau d'un projet qui utilise un SGBD Sybase:
    _________________________
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     IF condition THEN
     BEGIN
         DROP TABLE Nom_Table
     END
    Dans ce cas il supprime toujours la table même si la condition n'est pas vérifiée.
    Et la même chose se produit si je remplace le drop par un create ou par un SELECT * INTO
    _________________________

    Dans ton cas il y a une solution alternative, c de remplacer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IF @inserted_month = @sjour_month
        BEGIN
          DELETE FROM custom.custom_sjour
        end
    par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DELETE FROM custom.custom_sjour
    WHERE @inserted_month = @sjour_month
    Et lors de la valorisation @inserted_month, il faut vérifier le cas du NULL.

Discussions similaires

  1. Création d'une table historique par trigger
    Par zemblamoh dans le forum Développement
    Réponses: 13
    Dernier message: 21/09/2017, 13h55
  2. [PL/SQL] Create table dans un trigger
    Par CrazyLiam dans le forum PL/SQL
    Réponses: 9
    Dernier message: 11/12/2007, 14h49
  3. Chargement table Oracle par SQL Loader
    Par Mike-lb dans le forum SQL*Loader
    Réponses: 1
    Dernier message: 28/08/2006, 13h30
  4. SQL : remplacer table par requête
    Par oceanediana dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 23/08/2006, 16h18
  5. Mise en forme table access par VBA ou SQL
    Par romrai dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 21/02/2006, 13h29

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