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

MS SQL Server Discussion :

Problème avec l'utilisation de TRY/CATCH à l'intérieure d'un trigger


Sujet :

MS SQL Server

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développement Informatique : Première année
    Inscrit en
    Janvier 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30

    Informations professionnelles :
    Activité : Développement Informatique : Première année

    Informations forums :
    Inscription : Janvier 2013
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Problème avec l'utilisation de TRY/CATCH à l'intérieure d'un trigger
    Salut tout le monde !!
    comme le titre du sujet l'indique j'ai un problème avec un TRY/CATCH que j'utilise à l'intérieur d'un trigger, j'utilise un trigger de type 'instead of insert' pour vérifié que l'age et la date de naissance d'une personne sont cohérent et j'utilise un Try/catch pour traité le cas de la clé primaire Voici le code que j'utilise :

    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
    Create Trigger Trigger_Age_Date
    on Personne instead of insert
    as
    	begin
    		declare c scroll cursor
    		for(select Code,dateN,Age from inserted)
     
    		open c;
     
    		declare @Code int,@Age int,@DateN date;
    		fetch from c into @Code,@dateN,@Age
    		while(@@FETCH_STATUS = 0)
    			begin
    				if (@Age <> datediff(year,@dateN,getdate()))
    					print 'L"age et la date doivent être cohérent'
    				Else 
    					begin
    							Begin try
    								insert into Personne select * from inserted where code = @Code
    							End Try
     
    							Begin Catch
    								if ERROR_NUMBER() = 2627
    									print 'Le code '+cast(@Code as varchar(50))+' existe déjà.'
    							End Catch
    					end
    				fetch from c into @Code,@dateN,@Age
    			end		
    		Close C;
    		Deallocate C;
    	End
    Le code avec le quel je teste le trigger :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set dateformat dmy
    	Insert into Personne values (10,'Nom2','15/02/2012',2),(12,'Nom2','15/02/2012',2),(5,'Nom10','15/02/2010',4)
    les clés primaire ajouté existent déjà dans la table personne alors je dois tout simplement avoir les messages qui indique que la clé(code) existe déjà, mais voila ce que je reçois :

    (0 row(s) affected)
    Le code 10 existe déjà.

    (0 row(s) affected)

    (0 row(s) affected)
    Msg 3616, Level 16, State 1, Line 2
    An error was raised during trigger execution. The batch has been aborted and the user transaction, if any, has been rolled back.
    "Une erreur est survenue lors de l’exécution du déclencheur. Le lot a été abandonné et la transaction utilisateur éventuelle a été restaurée."
    Le message est affiché seulement pour la première insertion fausse, ensuite il a le message d'erreur (Msg 3616).

    Merci d'avance !!

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 848
    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 848
    Points : 52 966
    Points
    52 966
    Billets dans le blog
    6
    Par défaut
    1) il est stupide de stocker un age puisqu'il change tout le temps et que vous pouvez le calculer par la date de naissance. Cela provoque de la redondance et viole les principes même de modélisation de base des relations..
    2) vous ne capturez pas le message d'erreur intial via errormsg(). Ajoutez le pour le concaténer à votre propre message d'erreur dans le catch.

    A +

Discussions similaires

  1. Réponses: 6
    Dernier message: 07/05/2010, 10h48
  2. problème utilisation de try catch
    Par leovenus dans le forum MATLAB
    Réponses: 1
    Dernier message: 16/03/2008, 16h47
  3. Problème avec l'utilisation de librairies
    Par Aradesh dans le forum MFC
    Réponses: 3
    Dernier message: 01/08/2005, 15h00
  4. [debutant] problème avec type à utiliser
    Par mlequim dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 15/07/2005, 16h08
  5. Problème avec l'utilisation de la fonction clock
    Par Matgic95 dans le forum C++Builder
    Réponses: 13
    Dernier message: 09/05/2005, 19h27

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