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 :

Trigger et erreurs.


Sujet :

Développement SQL Server

  1. #1
    Expert confirmé
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 093
    Billets dans le blog
    20
    Par défaut Trigger et erreurs.
    Bonjour,
    A partir d'un site web j'insert une ligne (L) dans une table (A).
    Sur cette table (A) j'ai un trigger "after insert" qui exécute une procédure stockée (PS) venant alimenter une table (B) d'une autre base.

    S'il y a une erreur par exemple une violation de contrainte unique key dans (PS), ma première ligne (L) n'est pas insérée dans (A) .

    Qui plus est l'erreur ne remonte pas jusqu'à la page web.

    Comment faire pour que dans tous les cas ma ligne soit bien insérée ?

    J'ai mis un if @@error<>0 GOTO lbl_error après l'insert vers (B) mais il ne se declenche pas.
    Have a nice day. Oliv'
    Votre réponse est peut être dans mon blog !
    https://www.developpez.net/forums/blogs/191381-oliv-/

  2. #2
    Membre expérimenté
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 193
    Par défaut
    tu ne peux pas.

    Je me suis confronté a ce problème il y a peu et j'ai du le contourner car effectivement je n'étais pas logique.

    Un trigger est une transaction en soit, il inclut donc que soit tout le trigger se déroule correctement, soit rien ne se passe.

    En gros si le trigger ne se déroule pas bien, la ligne n'est pas ajoutée a la table. Principe d'unicité des transaction (euh non c'est pas unicité.... enfin sqlpro viendra surement donner le terme exact j'suis pas bon en théorie)

    Ce que j'ai fait pour contourner le problème de mon coté (j'ai essayé try catch avant, d'intercepter l'erreur, mais je n'ai pas trouvé de moyen de masquer mon erreur.... il y a peut être moyen).

    Mais donc dans ma base, j'ai ajouté un champs sur l'état de ma ligne dans la table, je veux savoir si elle a été synchronisée, si elle a échoué, si elle est en train de se faire, ou si elle est a faire.
    Ensuite j'ai mis dans mon trigger un commande qui exécute un job de type "once".
    Ce job va qd a lui synchronisé ma table avec l'autre table, en faisant un select sur l'état de mes lignes (je ne prends que celle a faire ou qui avait échoué)
    Je place mon code dans un try catch et la je peux faire un update en bien déroulé dans le try, et erreur dans le catch.

    Je n'ai pas trop de problème de concurrence dans ce que j'ai fait, je synchronise des articles et des clients... ils sont nettement moins souvent mis a jour que des commandes. Mais il pourrait avoir des soucis de concurrence dans des jobs qui se croise.
    D'ou l'utilité d'un champs état dans ma table. Et bien vérifier l'état d'une ligne avant d'y toucher, voir même relancer une transaction entre la lecture de l'état et l'écriture dans l'autre base.

  3. #3
    Expert confirmé
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 093
    Billets dans le blog
    20
    Par défaut
    Merci pour ta réponse,
    Ce que je voudrais au minimum c'est avoir un message d'erreur qui remonte sur ma page asp via adodb, mais dans le cas d'une violation de primary key que dalle ?!!

    et en lançant une function à la place d'une procédure ?

    Quelle est la syntaxe de ta commande "qui exécute un job de type "once"." ?

    ps as possible d'utiliser try catch suis en SQL2000
    Have a nice day. Oliv'
    Votre réponse est peut être dans mon blog !
    https://www.developpez.net/forums/blogs/191381-oliv-/

  4. #4
    Membre expérimenté
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 193
    Par défaut
    euh j'utilise la procédure voir http://msdn2.microsoft.com/en-us/library/ms186757.aspx

    je sais pas si elle existe en sql 2000, j'ai jamais fait bcp de sql 2000 a part des select

    J'utilise aussi le code suivant qui m'indique si un job est en train de fonctionner ou pas

    Et euh pour le type once.... c'est qd tu crées ton job, tu lui dis simplement de s'exécuter une seule fois immédiatement dans la planification et non pas de se répéter

    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
    -- Si nous avons modifié le nom du site ou l'état du job il faut avant tout vérifier
    			-- que le job n'est pas en train de s'exécuter et si c'est le cas d'abord arrêter le job
    			-- code récupérer des procédures systèmes
     
    if(@DSIT02 <> @DSIT02OLD OR @DSIT07 <> @DSIT07OLD)
    BEGIN			
     
    DECLARE @can_see_all_running_jobs INT  
    DECLARE @job_owner   sysname  
    DECLARE @job_id uniqueidentifier
     
    SELECT @can_see_all_running_jobs = ISNULL(IS_SRVROLEMEMBER(N'sysadmin'), 0)  
    IF (@can_see_all_running_jobs = 0)  
    BEGIN  
    SELECT @can_see_all_running_jobs = ISNULL(IS_MEMBER(N'SQLAgentReaderRole'), 0)  
    END  
    SELECT @job_owner = SUSER_SNAME()  
     
    select @job_id = job_id  from msdb.dbo.sysjobs where [name] = @DSIT02OLD
     
    DECLARE @xp_results TABLE (	job_id                UNIQUEIDENTIFIER NOT NULL,  
    last_run_date         INT              NOT NULL,  
    last_run_time         INT              NOT NULL,  
    next_run_date         INT              NOT NULL,  
    next_run_time         INT              NOT NULL,  
    next_run_schedule_id  INT              NOT NULL,  
    requested_to_run      INT              NOT NULL, -- BOOL  
    request_source        INT              NOT NULL,  
    request_source_id     sysname          COLLATE database_default NULL,  
    running               INT              NOT NULL, -- BOOL  
    current_step          INT              NOT NULL,  
    current_retry_attempt INT              NOT NULL,  
    job_state             INT              NOT NULL)  
     
    -- SQL Server 8.0 or greater required (Sql 2000)
    INSERT INTO @xp_results  
    EXECUTE master.dbo.xp_sqlagent_enum_jobs @can_see_all_running_jobs, @job_owner, @job_id
     
    -- Arrête le job si son état est considéré comme actif, voir doc de msdn pour les valeur 1,2,7  
    if(exists(select * from @xp_results where job_state in (1,2,7)))
    et après le exists dans ce code la, j'arrête mon job, mais il y a moyen de l'utiliser a d'autres fin, simplement de savoir si il s'exécute déjà


    J'ai pas essayer sinon avec une fonction, mais procédure ou fonction, la transaction restera une opération atomique (j'susi retombé sur le terme ) donc si qqch se déroule mal, il annulera tout

  5. #5
    Expert confirmé
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 093
    Billets dans le blog
    20
    Par défaut

    Je crois avoir trouvé une solution quand tu executes une ps par "command" un paramétre @RETURN_VALUE est renvoyé dont la valeur est à 0 si l'exécution était OK sinon dans mon cas elle est vide.

    J'avais aussi essayé avec un parametre output ce qui donne un résultat équivalent.
    Have a nice day. Oliv'
    Votre réponse est peut être dans mon blog !
    https://www.developpez.net/forums/blogs/191381-oliv-/

Discussions similaires

  1. Trigger : gestion erreur
    Par bdf94 dans le forum Adaptive Server Enterprise
    Réponses: 1
    Dernier message: 25/02/2010, 16h08
  2. Trigger Syntaxe Erreur
    Par hajarussa dans le forum Langage SQL
    Réponses: 3
    Dernier message: 22/07/2009, 14h43
  3. [SQL Serveur 2000] - Trigger gestion erreur
    Par Silvia12 dans le forum Développement
    Réponses: 7
    Dernier message: 12/06/2007, 11h08
  4. Erreur ORA-04082 sur un trigger
    Par elcaro92 dans le forum Oracle
    Réponses: 2
    Dernier message: 31/01/2005, 21h30
  5. Trigger : Message d'erreur
    Par Ricardeau dans le forum InterBase
    Réponses: 9
    Dernier message: 10/03/2004, 13h10

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