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 :

Debugging de trigger


Sujet :

Développement SQL Server

  1. #1
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut Debugging de trigger
    Bonjour à tous,

    Je rencontre actuellement un problème avec une procédure stockée qui fait une insertion dans une vue portant sur 2 tables.

    J'ai bien sûr un trigger instead of insert sur la vue pour permettre l'insertion correctement dans chacune des tables et l'une des tables a également un trigger instead of update mais sql server m'informe qu'il y a une erreur dans le trigger mais les informations fournies ne sont pas d'une grande aide...

    Voici le message d'erreur retourner lors de l'exécution de la procédure :
    Msg 50000, Level 16, State 1, Procedure TR_INSTEAD_OF_INSERT_SSE, Line 31
    Erreur dans trigger
    Msg 3616, Level 16, State 1, Procedure TR_INSTEAD_OF_INSERT_VSS, Line 7
    An error was raised during trigger execution. The batch has been aborted and the user transaction, if any, has been rolled back.
    D'après ce message, j'en conclus donc qu'il y a une erreur dans le trigger de la table (TR_INSTEAD_OF_INSERT_SSE) qui fait que du coup, le trigger de la vue (TR_INSTEAD_OF_INSERT_VSS) plante aussi (logique).

    Voici le trigger en question (réalisé à l'aide sqlpro sur ce même forum) :
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    USE [GIFT_MANAGEMENT_TEST_ICT]
    GO
    /****** Object:  Trigger [dbo].[TR_INSTEAD_OF_INSERT_SSE]    Script Date: 01/29/2013 13:11:31 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
     
     
    ALTER TRIGGER [dbo].[TR_INSTEAD_OF_INSERT_SSE] ON [dbo].[T_STORE_STOCK_ENTREE_SSE]
    INSTEAD OF INSERT
    AS
    BEGIN
        SET NOCOUNT ON;    
        SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
     
        BEGIN TRY;
            WITH T0 AS (SELECT GFT_ID, STR_ID, SSE_DATE_IN, ROW_NUMBER() OVER(PARTITION BY GFT_ID ORDER BY GFT_ID) AS 'ROW_NUM'
                        FROM INSERTED)
            INSERT INTO [T_STORE_STOCK_ENTREE_SSE] (GFT_ID, SSE_ID, STR_ID, SSE_DATE_IN)
            SELECT    T0.GFT_ID,
                    COALESCE(MAX(SSE.SSE_ID),0) + ROW_NUM,
                    T0.STR_ID,
                    T0.SSE_DATE_IN
            FROM    [T_STORE_STOCK_ENTREE_SSE] AS SSE
                        RIGHT OUTER JOIN T0
                            ON    SSE.GFT_ID = T0.GFT_ID
            GROUP BY T0.GFT_ID,
                     T0.STR_ID,
                     T0.SSE_DATE_IN,
                     T0.ROW_NUM
     
            SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
        END TRY
     
        BEGIN CATCH
            SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
            RAISERROR('Erreur dans trigger', 16, 1)
        END CATCH    
    END
    Le souci est que la ligne 31 est la dernier de la clause SELECT et je ne vois ce qui cloche avec cette dernière...
    Est-il possible de remplacer le message harcodé "Erreur dans trigger" par un genre de variable propre à sql server qui contiendrait le "vrai" message d'erreur de manière à en savoir un peu plus ?

    Cela existe-t-il ?

  2. #2
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 623
    Par défaut
    Bonjour,
    D'après la doc http://msdn.microsoft.com/fr-fr/library/ms175976.aspx
    Tu peux faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    USE AdventureWorks2012;
    GO
     
    BEGIN TRY
        -- Table does not exist; object name resolution
        -- error not caught.
        SELECT * FROM NonexistentTable;
    END TRY
    BEGIN CATCH
        SELECT 
            ERROR_NUMBER() AS ErrorNumber
            ,ERROR_MESSAGE() AS ErrorMessage;
    END CATCH
    Donc je pense que ceci foncitonnerait :
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    USE [GIFT_MANAGEMENT_TEST_ICT]
    GO
    /****** Object:  Trigger [dbo].[TR_INSTEAD_OF_INSERT_SSE]    Script Date: 01/29/2013 13:11:31 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
     
     
    ALTER TRIGGER [dbo].[TR_INSTEAD_OF_INSERT_SSE] ON [dbo].[T_STORE_STOCK_ENTREE_SSE]
    INSTEAD OF INSERT
    AS
    BEGIN
        SET NOCOUNT ON;    
        SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
     
        BEGIN TRY;
            WITH T0 AS (SELECT GFT_ID, STR_ID, SSE_DATE_IN, ROW_NUMBER() OVER(PARTITION BY GFT_ID ORDER BY GFT_ID) AS 'ROW_NUM'
                        FROM INSERTED)
            INSERT INTO [T_STORE_STOCK_ENTREE_SSE] (GFT_ID, SSE_ID, STR_ID, SSE_DATE_IN)
            SELECT    T0.GFT_ID,
                    COALESCE(MAX(SSE.SSE_ID),0) + ROW_NUM,
                    T0.STR_ID,
                    T0.SSE_DATE_IN
            FROM    [T_STORE_STOCK_ENTREE_SSE] AS SSE
                        RIGHT OUTER JOIN T0
                            ON    SSE.GFT_ID = T0.GFT_ID
            GROUP BY T0.GFT_ID,
                     T0.STR_ID,
                     T0.SSE_DATE_IN,
                     T0.ROW_NUM
     
            SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
        END TRY
     
        BEGIN CATCH
            SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
            RAISERROR(ERROR_MESSAGE() , 16, 1)
        END CATCH    
    END

  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 995
    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 995
    Billets dans le blog
    6
    Par défaut
    Tu as mis un ligne entre le END TRY et le BEGIN CATCH....
    Enlève là !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Citation Envoyé par darkelend Voir le message
    Merci pour ERROR_MESSAGE(), c'est ce que je cherchais.


    Citation Envoyé par SQLpro Voir le message
    Tu as mis un ligne entre le END TRY et le BEGIN CATCH....
    Enlève là !

    A +
    C'est sérieux ça ?? Cela a vraiment une importance ? Cela expliquerait le fait que j'ai jamais réussi à faire un try..catch qui fonctionne...

    Pourtant avec ERROR_MESSAGE(), je sais maintenant où est l'erreur (et ce n'est pas ligne en trop qu'il signale ).

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Citation Envoyé par Kropernic Voir le message
    Le souci est que la ligne 31 est la dernier de la clause SELECT et je ne vois ce qui cloche avec cette dernière...
    En fait, la ligne 31 correspond à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    RAISERROR(ERROR_MESSAGE() , 16, 1)
    En effet, il s'agit de la ligne 31 du lot, et il y a un GO plus haut, qui "remet à zéro" la numérotation des lignes

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Citation Envoyé par Kropernic Voir le message
    C'est sérieux ça ?? Cela a vraiment une importance ? Cela expliquerait le fait que j'ai jamais réussi à faire un try..catch qui fonctionne...
    Si la ligne est vide, cela ne devrait pas poser de problème. Par contre il ne faut pas mettre d'instruction entre le END TRY et le BEGIN CATCH

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

Discussions similaires

  1. DEBUG SQL TRIGGER
    Par Seth_75 dans le forum Développement
    Réponses: 3
    Dernier message: 02/09/2008, 19h29
  2. Debug dans un trigger
    Par awalter1 dans le forum PL/SQL
    Réponses: 4
    Dernier message: 27/06/2008, 17h39
  3. Debuger un Trigger
    Par danisam dans le forum Développement
    Réponses: 2
    Dernier message: 24/03/2007, 01h32
  4. debug trigger et ps
    Par free07 dans le forum Outils
    Réponses: 2
    Dernier message: 22/08/2006, 10h35
  5. [Debug] [Trigger] erreur d'exe pas très précise
    Par viena dans le forum Langage SQL
    Réponses: 4
    Dernier message: 19/08/2005, 11h36

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