Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/03/2011, 10h24   #1
Membre chevronné
 
Avatar de Ramajb
 
Homme Jb Ramampiandra
----------------------------
Inscription : septembre 2007
Messages : 467
Détails du profil
Informations personnelles :
Nom : Homme Jb Ramampiandra
Localisation : Ile Maurice

Informations professionnelles :
Activité : ----------------------------

Informations forums :
Inscription : septembre 2007
Messages : 467
Points : 741
Points : 741
Par défaut [Trigger After Insert ne se declenche pas]

Bonjour,
voilà, deux jours passé dessus, j'ai rien trouvé.

J'ai deux tables A et B. B possède un trigger AFTER INSERT dont le script suivant fait parti:
Code :
1
2
3
INSERT INTO A 
	(R_KEY, LOCALE, DESCRIPTION) VALUES 
	( @pricingRKey ,  'en_US' ,   @rDescription )
. Donc le trigger lance aussi une insertion dans la table A.

La table A possède aussi un trigger AFTER INSERT qui duplique les données suivant les locales. Les données dupliquées devraient se trouver dans A même.

Sauf que voilà, quand je fais une insertion a partir de B, je vois bien le nouveau enregistrement dans B et dans A aussi mais pas avec les données dupliquées, donc pour moi le trigger de A ne s’était pas déclenché .
Or si je lance le script d'insertion ci-dessus directement a partir de la table A, j'ai bien les données dupliquées i.e trigger declenché.

Quelqu'un peut il me mettre dans la bonne voie? Merci
Ramajb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 11h34   #2
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 723
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 723
Points : 6 844
Points : 6 844
Bonjour,

Pourrais t'on avoir le code complet du trigger et les DDL des tables A et B ?

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 12h08   #3
Membre chevronné
 
Avatar de Ramajb
 
Homme Jb Ramampiandra
----------------------------
Inscription : septembre 2007
Messages : 467
Détails du profil
Informations personnelles :
Nom : Homme Jb Ramampiandra
Localisation : Ile Maurice

Informations professionnelles :
Activité : ----------------------------

Informations forums :
Inscription : septembre 2007
Messages : 467
Points : 741
Points : 741
Trigger de la table B
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
USE [mabase]
GO
/****** Object:  Trigger [db_owner].[sa_trigger_B]    Script Date: 02:40:21 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
 
ALTER TRIGGER [db_owner].[sa_trigger_A]
   ON  [db_owner].[table_B]
   AFTER INSERT
AS
INSERT INTO table_A
	(RULE_KEY, LOCALE, DESCRIPTION) VALUES 
	( 665577 ,  'en_US' ,   'test_description57' ) 
END
Trigger de la Table A
Code :
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
USE [mabase]
GO
/****** Object:  Trigger [dbo].[prcart_rule_loc_trigger]    Script Date: 03/11/2011 05:59:43 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[trigger_A]
    ON [dbo].[table_A]
    FOR INSERT
    AS
      DECLARE @var_locale NVarChar(10)
      DECLARE @v_flag numeric
      DECLARE @i_locale NVarChar(10)
      DECLARE c_locales CURSOR FOR SELECT LOCALE_NAME FROM table_C
       SET @i_locale = (SELECT locale FROM Inserted)
      IF @v_flag IS NULL
          BEGIN
     UPDATE a SET flag = 1 FROM  table_A a JOIN Inserted i ON a.rule_key = i.rule_key
 
           OPEN c_locales
 
               FETCH NEXT FROM c_locales INTO @var_locale
 
                WHILE @@FETCH_STATUS = 0
                  BEGIN
                    IF @var_locale <> @i_locale
		     BEGIN
                     INSERT INTO A SELECT r_key, @var_locale, DESCRIPTION FROM Inserted
                 END
                  FETCH NEXT FROM c_locales INTO @var_locale
                 END
 
           CLOSE c_locales
           DEALLOCATE c_locales
 
      SET @v_flag = 1
   END
Je rappel que le trigger_A se déclenche lorsqu'on fait une insertion directement a partir de la table_A. Mais il ne se déclenche pas quand on fait une insertion dans le trigger_B .
Merci
Ramajb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 12h08   #4
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour,

Peut-on également avoir le résultat de ceci :
Code SQL :
1
2
 
sp_configure 'nested triggers'

merci
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 12h12   #5
Membre chevronné
 
Avatar de Ramajb
 
Homme Jb Ramampiandra
----------------------------
Inscription : septembre 2007
Messages : 467
Détails du profil
Informations personnelles :
Nom : Homme Jb Ramampiandra
Localisation : Ile Maurice

Informations professionnelles :
Activité : ----------------------------

Informations forums :
Inscription : septembre 2007
Messages : 467
Points : 741
Points : 741
name: nested triggers
minimum: 0
maximum: 1
config_value: 0
run_value: 0
Ramajb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 12h17   #6
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Voila la raison de votre problème !

Par défaut, SQL Server autorise le déclenchement des triggers en cascades, mais votre configuration non !

Votre trigger sur la table B ne peut donc pas déclencher le trigger sur la table A...

ceci devrait résoudre le problème :
Code SQL :
1
2
3
 
sp_configure 'nested triggers', 1
RECONFIGURE

Par contre, vous devriez peut être d'abord chercher à savoir pourquoi cette configuration a été faite ainsi, pour savoir à quels effets de bords vous vous exposez !
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 12h39   #7
Membre chevronné
 
Avatar de Ramajb
 
Homme Jb Ramampiandra
----------------------------
Inscription : septembre 2007
Messages : 467
Détails du profil
Informations personnelles :
Nom : Homme Jb Ramampiandra
Localisation : Ile Maurice

Informations professionnelles :
Activité : ----------------------------

Informations forums :
Inscription : septembre 2007
Messages : 467
Points : 741
Points : 741
Merci pour votre reponses les guys

La reponse de aieeeuuuuu (drole de pseudo ) a réglé le problème

vous avez bien vu aussi pour l'effet de bord, je m'y penche la dessus .
Ramajb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 15h41   #8
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
La reponse de aieeeuuuuu (drole de pseudo )

Oui qu'est ce que çà cache? tendances louches ou enfance douloureuse?
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h10.


 
 
 
 
Partenaires

Hébergement Web