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

Développement SQL Server Discussion :

Limiter l'execution d'un Trigger


Sujet :

Développement SQL Server

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Limiter l'execution d'un Trigger
    Bonjour,

    Je dois écrire un trigger concaténant dans une colonne les valeurs provenant de différente colonnes de différentes tables lors de l’insert ou de l’update de l’enregistrement.
    Il s’agit d’une table gérant un agenda. Et remplie via une application web (en intranet) propriétaire. Je ne peut donc pas modifié l’application.
    Le trigger fonctionne parfaitement sauf lors de rendez-vous récurrents (update en bloque).
    Dans ce cas, il génère un plantage de l’application.
    Il y a une colonne « Recurrence » dans la table, ayant la valeur nulle sauf en cas de récurrence.
    Est-il possible d’empêcher l’execution du trigger si cette colonne n’est pas nulle ?
    J’ai essayé ces différentes méthodes mais aucune ne m’évite l’erreur.
    1) if select recurrence from inserted
    begin
    action
    end
    2) if select recurrence from inserted rollback
    3) if select recurrence from inserted return
    Sous PL/SQL il y aurait la clause « when » mais sous sql server elle n’existe pas

    Merci d'avance

  2. #2
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Solution partielle
    J'ai pus rendre mon trigger fonctionnel en utilisant un curseur ou j'enregistre les valeur de la table inserted qui m'intéresse et en fessant un boucle pour traité ligne par ligne.
    Mais ça alourdit inutilement le traitement vus que je n’ai plusieurs lignes qu’en cas de rendez-vous récurrent et que le traitement appliqué ‘est pas justifié dans le cas des rendez-vous récurrents.
    Dés lors il serait malgré tout utile de pouvoir simplement ne pas exécuter le trigger en cas de récurrence.
    Merci d’avance pour vos idées

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 882
    Points : 53 073
    Points
    53 073
    Billets dans le blog
    6
    Par défaut
    Postez le code de votre trigger on y verra plus clair !

    A +

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Effectivement avec le code, ce serait un peu plus simple ...

    Ecrivez WHERE maColonneRecurrence IS NULL, tout simplement ...

    Oubliez les curseurs !

    Vous pouvez également jeter un œil ici

    @++

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Voici le code de mon Trigger

    ALTER trigger [dbo].[update_comm_detail] on [dbo].[table1]
    for Update
    as

    declare @table1ID int
    declare @CH1TBL1 nvarchar(40)
    declare @CH2TBL1 nvarchar(40)
    declare @CH3TBL1 nvarchar(40)
    declare @CH4TBL1t nvarchar(40)
    declare @CH5TBL1 nvarchar(50)
    declare @recurrenceid int
    declare @CH1TBL3 int
    declare @CH2TBL3 nvarchar(10)
    declare @CH3TBL3 nvarchar(40)
    declare @CH1TBL4 int
    declare @CH2TBL4 nvarchar(30)
    declare @CH4TBL3 nvarchar(65)
    declare @CH5TBL3 nvarchar(40)
    declare @CH3TBL4 nvarchar(max)
    declare @CH3TBL4 nvarchar(40)
    declare @CH4TBL4 nvarchar(10)

    declare @fetch int
    declare TB1_cursorr cursor for select ID,CH1,CH2,CH3,CH4,CH5,RECCURENCEID from inserted

    open TB1_cursorr

    fetch from TB1_cursorr into @table1ID,@CH1TBL1,@CH2TBL1,@CH3TBL1,@CH4TBL1t,@CH5TBL1,@recurrenceid

    set @fetch = @@FETCH_STATUS
    while @fetch = 0
    begin
    set @CH1TBL3 = (select Link_TB2_TB3 from Table2 where Link_TB1_TB2=@table1ID)
    set @CH1TBL3 = isnull(@CH1TBL3,-1)
    set @CH2TBL3 = (select champs2 from Table3 where TB3ID=@CH1TBL3)
    set @CH2TBL3 = isnull(@CH2TBL3,'')
    set @CH3TBL3 = (select champs3 from Table3 where TB3ID=@CH1TBL3)
    set @CH3TBL3 = isnull(@CH3TBL3,'')
    set @CH4TBL3 = ltrim(rtrim(@CH2TBL3)) + ' ' + ltrim(rtrim(@CH3TBL3))

    set @CH5TBL3 = (select champs5 from Table3 where TB3ID=@CH1TBL3)
    set @CH5TBL3 = isnull(@CH5TBL3,'')
    set @CH5TBL3 = ltrim(rtrim(@CH5TBL3))
    if @CH5TBL3 <> '' set @CH4TBL3 = @CH4TBL3 + ' & ' + @CH5TBL3

    set @CH1TBL4 = (select Link_TB4_TB5 from Table5 where Link_TB3_TB5=@CH1TBL3)
    set @CH2TBL4 = (select champs2 from Table4 where addr_addressid=@CH1TBL4)
    set @CH3TBL4 = (select champs3 from Table4 where addr_addressid=@CH1TBL4)
    set @CH4TBL4 = (select champs4 from Table4 where addr_addressid=@CH1TBL4)
    set @CH3TBL4 = ltrim(rtrim(isnull(@CH3TBL4,''))) + ' ' + ltrim(rtrim(isnull(@CH4TBL4,''))) + ' ' + ltrim(rtrim(isnull(@CH2TBL4,'')))
    if @CH5TBL1 = 'Val1' set @CH3TBL4 = @CH3TBL4 + ' Val2'

    set @CH2TBL1 = isnull(@CH2TBL1,'')
    set @CH2TBL1 = ltrim(rtrim(@CH2TBL1))
    if @CH2TBL1 = 'val3' set @CH2TBL1 = ' '
    if @CH2TBL1 = 'val4' set @CH2TBL1 = 'val5'
    if @CH2TBL1 = 'val6' set @CH2TBL1 = 'val7'

    set @CH1TBL1 = ltrim(rtrim(isnull(@CH1TBL1,'?')))
    set @CH4TBL1t = ltrim(rtrim(isnull(@CH4TBL1t,'?')))
    set @CH3TBL4 = ltrim(rtrim(isnull(@CH3TBL4,'?')))
    set @CH3TBL1 = ltrim(rtrim(isnull(@CH3TBL1,'?')))

    update dbo.table1
    set comm_note=@CH1TBL1 + ' - ' + @CH2TBL1 + ' - ' + @CH4TBL1t + ' - ' + @CH4TBL3 + ' - ' + @CH3TBL4 + ' - ' + @CH3TBL1
    where ID=@table1ID
    fetch from TB1_cursorr into @table1ID,@CH1TBL1,@CH2TBL1,@CH3TBL1,@CH4TBL1t,@CH5TBL1,@recurrenceid
    set @fetch = @@FETCH_STATUS
    end

    close TB1_cursorr

    deallocate TB1_cursorr

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Ecrivez WHERE maColonneRecurrence IS NULL, tout simplement ...
    Je ne vois pas en quoi un WHERE vas m'aider. Par contre je pourrait effectivement faire un if @recurrenceid is not null roolback pour mettre un terme au trigger. Mais cela ne fonctionne de toute façon que si je remplis @recurrenceid via un curseur. Mais le curseur sera-t-il fermé et déallouer si je fais un rollback pour quitter le trigger

    Citation Envoyé par elsuket Voir le message
    Oubliez les curseurs !
    Comment puis-je me passé d'un curseur pour traité la table inserted multi-ligne.

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Voici le code de mon Trigger avnt l'utilisation d'un curseur

    ALTER trigger [dbo].[update_comm_detail] on [dbo].[table1]
    for Update
    as

    declare @table1ID int
    declare @CH1TBL1 nvarchar(40)
    declare @CH2TBL1 nvarchar(40)
    declare @CH3TBL1 nvarchar(40)
    declare @CH4TBL1t nvarchar(40)
    declare @CH5TBL1 nvarchar(50)
    declare @recurrenceid int
    declare @CH1TBL3 int
    declare @CH2TBL3 nvarchar(10)
    declare @CH3TBL3 nvarchar(40)
    declare @CH1TBL4 int
    declare @CH2TBL4 nvarchar(30)
    declare @CH4TBL3 nvarchar(65)
    declare @CH5TBL3 nvarchar(40)
    declare @CH3TBL4 nvarchar(max)
    declare @CH3TBL4 nvarchar(40)
    declare @CH4TBL4 nvarchar(10)
    declare @table1ID int
    declare @CH1TBL1 nvarchar(40)
    declare @CH2TBL1 nvarchar(40)
    declare @CH3TBL1 nvarchar(40)
    declare @CH4TBL1 nvarchar(40)
    declare @CH5TBL1 nvarchar(40)
    declare @recurrenceid int

    set @table1id = (select ID from inserted)
    set @CH1TBL1 = (select champs1 from inserted)
    set @CH2TBL1 = (select champs2 from inserted)
    set @CH3TBL1 = (select champs3 from inserted)
    set @CH4TBL1 = (select champs4 from inserted)
    set @CH5TBL1 = (select champs5 from inserted)
    set @recurrenceid = (select recurrenceid from inserted)

    set @CH1TBL3 = (select Link_TB2_TB3 from Table2 where Link_TB1_TB2=@table1ID)
    set @CH1TBL3 = isnull(@CH1TBL3,-1)
    set @CH2TBL3 = (select champs2 from Table3 where TB3ID=@CH1TBL3)
    set @CH2TBL3 = isnull(@CH2TBL3,'')
    set @CH3TBL3 = (select champs3 from Table3 where TB3ID=@CH1TBL3)
    set @CH3TBL3 = isnull(@CH3TBL3,'')
    set @CH4TBL3 = ltrim(rtrim(@CH2TBL3)) + ' ' + ltrim(rtrim(@CH3TBL3))

    set @CH5TBL3 = (select champs5 from Table3 where TB3ID=@CH1TBL3)
    set @CH5TBL3 = isnull(@CH5TBL3,'')
    set @CH5TBL3 = ltrim(rtrim(@CH5TBL3))
    if @CH5TBL3 <> '' set @CH4TBL3 = @CH4TBL3 + ' & ' + @CH5TBL3

    set @CH1TBL4 = (select Link_TB4_TB5 from Table5 where Link_TB3_TB5=@CH1TBL3)
    set @CH2TBL4 = (select champs2 from Table4 where addr_addressid=@CH1TBL4)
    set @CH3TBL4 = (select champs3 from Table4 where addr_addressid=@CH1TBL4)
    set @CH4TBL4 = (select champs4 from Table4 where addr_addressid=@CH1TBL4)
    set @CH3TBL4 = ltrim(rtrim(isnull(@CH3TBL4,''))) + ' ' + ltrim(rtrim(isnull(@CH4TBL4,''))) + ' ' + ltrim(rtrim(isnull(@CH2TBL4,'')))
    if @CH5TBL1 = 'Val1' set @CH3TBL4 = @CH3TBL4 + ' Val2'

    set @CH2TBL1 = isnull(@CH2TBL1,'')
    set @CH2TBL1 = ltrim(rtrim(@CH2TBL1))
    if @CH2TBL1 = 'val3' set @CH2TBL1 = ' '
    if @CH2TBL1 = 'val4' set @CH2TBL1 = 'val5'
    if @CH2TBL1 = 'val6' set @CH2TBL1 = 'val7'

    set @CH1TBL1 = ltrim(rtrim(isnull(@CH1TBL1,'?')))
    set @CH4TBL1t = ltrim(rtrim(isnull(@CH4TBL1t,'?')))
    set @CH3TBL4 = ltrim(rtrim(isnull(@CH3TBL4,'?')))
    set @CH3TBL1 = ltrim(rtrim(isnull(@CH3TBL1,'?')))

    update dbo.table1
    set comm_note=@CH1TBL1 + ' - ' + @CH2TBL1 + ' - ' + @CH4TBL1t + ' - ' + @CH4TBL3 + ' - ' + @CH3TBL4 + ' - ' + @CH3TBL1
    where ID=@table1ID

    Il fonctionnait bien tant que l'application ne met à jour qu'un seul rendez-vous et provoque un bug de l'application lors de modification de rendez-vous multiple (cas des rendez-vous récurrents)

Discussions similaires

  1. Execution d'un Trigger
    Par ninsekh dans le forum Toad
    Réponses: 3
    Dernier message: 14/08/2014, 15h51
  2. problème de l'execution d'un trigger
    Par rezguiinfo dans le forum SQL Procédural
    Réponses: 14
    Dernier message: 10/09/2012, 20h57
  3. Réponses: 3
    Dernier message: 08/02/2010, 11h03
  4. [c#]threads : ou est la limite d'execution du thread ?
    Par zax-tfh dans le forum Windows Forms
    Réponses: 4
    Dernier message: 21/11/2006, 19h41
  5. Problème d'execution d'un trigger
    Par berceker united dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 25/06/2006, 04h22

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