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 :

Cannot Rollback Transaction


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 29
    Par défaut Cannot Rollback Transaction
    Bonjour,
    J'ai créé un trigger instead of insert sur une vue multitable.
    Cela concerne l'insertion de project de client et de composant.

    Les 2 tables en questions ici sont:
    CUSTOMER : id_customer, customer_name
    PROJECT: id_project, project_name, id_customer#

    Voilà le bout de code de mon trigger qui pose problème.
    Code sql : 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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    BEGIN TRANSACTION CHECK_AND_INSERT_PROJECT
     
     
     
    DECLARE @id_project int
     
    		IF EXISTS (SELECT PROJECT.name 
    						FROM PROJECT 
    						JOIN INSERTED 
    						ON PROJECT.name = INSERTED.project_name
    						JOIN CUSTOMER
    						ON PROJECT.id_customer != @id_customer
    						WHERE (NOT (INSERTED.project_name LIKE N'TAM_%')) )
     
    						BEGIN 
    							PRINT 'Wrong customer_name for this project. Please check...'
    							DECLARE @bin_check bit
    							SET @bin_check = 1
    							--ROLLBACK TRANSACTION CHECK_AND_INSERT_PROJECT
    						END
     
    							ELSE
     
    							BEGIN			
    										IF EXISTS (SELECT PROJECT.name 
    													FROM PROJECT 
    													JOIN INSERTED 
    													ON PROJECT.name = INSERTED.project_name
    													JOIN CUSTOMER
    													ON PROJECT.id_customer = @id_customer)
     
    														BEGIN
    																		SET @id_project = (SELECT PROJECT.id_project 
    																							FROM PROJECT 
    																							JOIN INSERTED 
    																							ON PROJECT.name = INSERTED.project_name
    																							JOIN CUSTOMER 
    																							ON PROJECT.id_customer = CUSTOMER.id_customer)
     
    																					PRINT 'Le nom de projet existe pour numéro de client ci-dessus :'
    																					PRINT (@id_project)
     
    														END	
     
     
    														ELSE
     
    															BEGIN 
    																	DECLARE @project_name nvarchar(255)
    																	SET @project_name = (SELECT project_name FROM INSERTED)
     
    																	INSERT INTO PROJECT (PROJECT.name, PROJECT.id_customer)
    																	VALUES (@project_name, @id_customer)
    																	SET @id_project = SCOPE_IDENTITY()
     
     
     
    																	PRINT 'Le projet n''existe pas. Insertion d''nouveau projet avec le numéro de client '
    																	PRINT (@id_project)	
    																	PRINT 'avec le numéro de client'
    																	PRINT (@id_customer)
     
    															END
     
     
     
    END	
     
    IF @bin_check = 1 
    ROLLBACK TRANSACTION CHECK_AND_INSERT_PROJECT
    ELSE
    COMMIT TRANSACTION CHECK_AND_INSERT_PROJECT

    En gros ma transaction vérifie si un nom de project n'a qu'un seul et unique numéro de client sauf pour les noms de projets du type like'TAM_%'

    Quand j'insere des données invalides voilà ce que j'ai sur la sortie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    (1 row(s) affected)
    Le client existe pas -> Insertion nouveau client :
    4451
    Wrong customer_name for this project. Please check...
    Msg 6401, Level 16, State 1, Procedure test_insert, Line 131
    Cannot roll back CHECK_AND_INSERT_PROJECT. No transaction or savepoint of that name was found.
    The statement has been terminated.
    Je suis débutant en TSQL et je suis pas sûr de bien comprendre les différentes manières de réagir du moteur entre un bloc d'instruction BEGIN...END et une transaction.

    Voilà, merci d'avance, bon appétit!

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Par défaut
    bonjour,

    je pense que le begin transaction devrait être hors du trigger : en général on gère la transaction en amont, dans le code qui met à jour les enregistrements de la table qui déclenchera le trigger. Il n'y a qu'à mettre un rollback transaction <name>, <name> correspondant à la transaction débutée avant le déclenchement du trigger...

  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
    22 010
    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 : 22 010
    Billets dans le blog
    6
    Par défaut
    Un trigger est déjà à l'intérieur d'une transaction même si vous ne l'avez par explicitement lancée (transaction implicite). Commencer votre trigger par une transaction n'a donc aucun sens et SQL Server ne s'y retrouve plus parce que les transactions imbriquées cela n'existe pas...

    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/ * * * * *

Discussions similaires

  1. rollbacks et transactions distribuées
    Par GMI3 dans le forum Oracle
    Réponses: 8
    Dernier message: 26/09/2006, 09h19
  2. Informations sur les transactions, commit et rollback AIDE ?
    Par QAYS dans le forum Connexion aux bases de données
    Réponses: 7
    Dernier message: 23/09/2006, 13h44
  3. Annuler une transaction (rollback) après un commit ?
    Par Boulotaur2024 dans le forum Débuter
    Réponses: 1
    Dernier message: 18/04/2006, 20h31
  4. Procédure stockée et 'rollback transaction'
    Par thomas_strass dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 01/02/2006, 14h44
  5. Réponses: 5
    Dernier message: 24/08/2005, 11h21

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