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 : problème NOCOUNT et UPDATE


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 65
    Par défaut Trigger : problème NOCOUNT et UPDATE
    Bonjour,

    Je me permets de solliciter votre aide car je suis face à un problème et je ne sais comment le résoudre malgré diverses tentatives.

    Je souhaite utiliser (car c'est conseillé et que je n'ai pas le choix) la fonction NOCOUNT dans un trigger qui se déclenche sur un UPDATE.
    Dans ce trigger, je fais un update de 2 tables (MAJ de flags).

    Le problème est que lorsque la propriété NOCOUNT est sur "ON", les update ne se font pas. Par contre, si je repasse NOCOUNT à "OFF", les update s'executent correctement.

    Je ne vois pas vraiment le lien entre ces 2 éléments...

    Merci par avance,

    NB: Je suis obligé d'utiliser la fonction NOCOUNT=ON car le trigger se déclenche suite à une MAJ d'une table via NHibernate. Et NHibernate retourne une erreur si la propriété NOCOUNT n'est pas activé.

  2. #2
    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 : 44
    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
    Par défaut
    Bonjour,

    SET NOCOUNT, lorsqu'elle est positionnée à ON, permet de ne pas retourner à l'application appelante le nombre de lignes affectées par l'exécution des instructions.

    Êtes-vous certain que l'UPDATE ne s'exécute pas ?
    Ou bien est-ce votre application qui ne vous montre pas que l'UPDATE a été exécuté parce qu'elle ne "sait" pas combien de lignes ont été affectées ?

    @++

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 65
    Par défaut
    J'ai bien compris le fonctionnement du ROCOUNT.

    Effectivement, je suis certain que l'UPDATE ne fonctionne pas, je le vois directement dans les tuples des tables sensés être mis à jour.

    C'est à ne plus rien y comprendre!

    Merci pour votre réponse

  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 : 44
    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
    Par défaut
    Donnez le code de votre trigger, sans celui-ci nous ne pourrons pas vous aider plus avant

    Bonne année et @++

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 65
    Par défaut
    Bonjour,

    Désolé pour cette réponse tardive, j'étais en congés!

    Voici le code de mon trigger:
    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
    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
    DECLARE @CL_ID int, @MG_ID int, @REL_ID int, @CL_STATUT_OLD varchar(5), @CL_STATUT_NEW varchar(5)
     
    	SELECT @CL_STATUT_OLD = CL_STATUT FROM DELETED
    	SELECT @CL_ID = CL_ID, @CL_STATUT_NEW = CL_STATUT FROM INSERTED
     
    	IF NOT UPDATE(CL_STATUT)
    	RETURN
     
    	-- Si le nouveau statut est "SIGN" (pour signé) et que l'ancien statut n'était pas "SIGNE"
    	-- Le CL vient d'être signé, on exécute donc le trigger
    	IF ( (@CL_STATUT_OLD != 'SIGN') AND (@CL_STATUT_NEW = 'SIGN') )
    	BEGIN
     
    		-- Sélection des avances MG du contrat
    		DECLARE CursMG CURSOR FOR
    		SELECT MG_ID
    		FROM CALICE_ADAMAU.dbo.AVANCE_MG
    		WHERE CTR_ID = @CL_ID
     
    		OPEN CursMG
    		FETCH NEXT FROM CursMG INTO @MG_ID
     
    		WHILE @@FETCH_STATUS = 0
    		BEGIN
    			-- On copie/colle les données des tables LC_MG et LC_MG_RAD dans les tables LC_MG_PROV et LC_MG_RAD_PROV
    			INSERT INTO CALICE_ADAMAU.dbo.LC_MG_PROV (MG_ID, CDE_NUM_CA, LCDE_NUM_CA, LCDE_NUM_CA_FM, CDE_NUM_LG, LCDE_NUM_LG, CDE_NUM_FM, LCDE_NUM_FM, TRANS, DT_TRANS )
    			SELECT MG_ID, CDE_NUM_CA, LCDE_NUM_CA, LCDE_NUM_CA_FM, CDE_NUM_LG, LCDE_NUM_LG, CDE_NUM_FM, LCDE_NUM_FM, 'N', '01/01/1900'
    			FROM CALICE_ADAMAU.dbo.LC_MG
    			WHERE MG_ID = @MG_ID
     
    			INSERT INTO CALICE_ADAMAU.dbo.LC_MG_RAD_PROV (MG_ID, AD_ID, CDE_NUM_RAD, LCDE_NUM_RAD, TRANS, DT_TRANS)
    			SELECT MG_ID, AD_ID, CDE_NUM_RAD, LCDE_NUM_RAD,'N', '01/01/1900'
    			FROM CALICE_ADAMAU.dbo.LC_MG_RAD
    			WHERE MG_ID = @MG_ID
     
    			-- On supprime les données des tables LC_MG et LC_MG_RAD
    			DELETE FROM CALICE_ADAMAU.dbo.LC_MG WHERE MG_ID = @MG_ID
    			DELETE FROM CALICE_ADAMAU.dbo.LC_MG_RAD WHERE MG_ID = @MG_ID
     
    			-- On réinitialise les indicateurs de transmission des avances MG du contrat concerné
    			UPDATE AVANCE_MG SET AMG_TRANS = 'N', AMG_DATTRANS = '01/01/1900' WHERE AMG_ID = @MG_ID
     
    			FETCH NEXT FROM CursMG INTO @MG_ID
    		END
     
    		CLOSE CursMG
    		DEALLOCATE CursMG
     
    		-- Sélection des relevés du contrat
    		DECLARE CursRel CURSOR FOR
    		SELECT REL_ID
    		FROM CALICE_ADAMAU.dbo.RELEVE
    		WHERE CTR_ID = @CL_ID
     
    		OPEN CursRel
    		FETCH NEXT FROM CursRel INTO @REL_ID
     
    		WHILE @@FETCH_STATUS = 0
    		BEGIN
    			-- On copie/colle les données des tables LC_REL et LC_REL_RAD dans les tables LC_REL_PROV et LC_REL_RAD_PROV
    			INSERT INTO CALICE_ADAMAU.dbo.LC_REL_PROV(REL_ID, CDE_NUM_CA, LCDE_NUM_CA, LCDE_NUM_CA_FM, CDE_NUM_LG, LCDE_NUM_LG, CDE_NUM_FM, LCDE_NUM_FM, TRANS, DT_TRANS)
    			SELECT REL_ID, CDE_NUM_CA, LCDE_NUM_CA, LCDE_NUM_CA_FM, CDE_NUM_LG, LCDE_NUM_LG, CDE_NUM_FM, LCDE_NUM_FM, 'N', '01/01/1900'
    			FROM CALICE_ADAMAU.dbo.LC_REL
    			WHERE REL_ID = @REL_ID
     
    			INSERT INTO CALICE_ADAMAU.dbo.LC_REL_RAD_PROV(REL_ID, AD_ID, CDE_NUM_RAD, LCDE_NUM_RAD, TRANS, DT_TRANS)
    			SELECT REL_ID, AD_ID, CDE_NUM_RAD, LCDE_NUM_RAD, 'N', '01/01/1900'
    			FROM CALICE_ADAMAU.dbo.LC_REL_RAD
    			WHERE REL_ID = @REL_ID
     
    			-- On supprime les données des tables LC_MG et LC_MG_RAD
    			DELETE FROM CALICE_ADAMAU.dbo.LC_REL WHERE REL_ID = @REL_ID
    			DELETE FROM CALICE_ADAMAU.dbo.LC_REL_RAD WHERE REL_ID = @REL_ID
     
    			-- On réinitialise les indicateurs de transmission des relevés du contrat concerné
    			UPDATE RELEVE SET REL_TRANS = 'N', REL_DATTRANS = '01/01/1900' WHERE REL_ID = @REL_ID
     
    			FETCH NEXT FROM CursRel INTO @REL_ID
    		END
     
    		CLOSE CursRel
    		DEALLOCATE CursRel
     
    	END
     
    	-- rollback en cas d'erreur
    	IF @@Error <> 0
    	ROLLBACK TRANSACTION
    Les 2 UPDATE qui ne se font pas sont les suivants:
    UPDATE AVANCE_MG SET AMG_TRANS = 'N', AMG_DATTRANS = '01/01/1900' WHERE AMG_ID = @MG_ID

    UPDATE RELEVE SET REL_TRANS = 'N', REL_DATTRANS = '01/01/1900' WHERE REL_ID = @REL_ID

    Merci d'avance pour votre aide,

Discussions similaires

  1. [trigger] problème de mise à jour
    Par Ouark dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 23/03/2006, 01h13
  2. [VB6] Problème avec requête Update
    Par bb62 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 02/02/2006, 03h40
  3. [MySQL] Problème pour un UPDATE
    Par leodi dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 03/12/2005, 02h05
  4. Calcul dans un triggers : problème du +
    Par eXiaNazaire dans le forum Oracle
    Réponses: 3
    Dernier message: 07/01/2005, 10h14
  5. [Trigger] Problème de curseur
    Par Superstivix dans le forum Langage SQL
    Réponses: 3
    Dernier message: 10/06/2004, 10h30

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