Salut

voila, j'ai un gros souci de triggers. Je vous explique le problème.

J'ai une première table F_CONTACTT dans une base de donnée ESSAIGAMIEC
Code : Sélectionner tout - Visualiser dans une fenêtre à part
F_CONTACTT(cbMarq,CT_Num,CT_Nom,CT_Prenom,N_Service,CT_Fonction,CT_Telephone,CT_TelPortable,CT_Telecopie,CT_EMail)
où cbMarq est un entier et les autres champs des chaines de caractères

J'ai inserer les données de F_CONTACTT dans deux tables respectives 'CONTACTBASE' et 'CONTACTEXTENSIONCONTACTBASE' sur une autre base de
donnee MSCRM_AMIEC

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
CONTACTBASE(ContactId,AccountId,OwningBusinessUnit,OwningUser,OriginatingLeadId,StatusCode,StateCode,DeletionStateCode,
LastName,FirstNAme,FullName,,Description,Department,JobTitle,EMailAddress1,Telephone1,MobilePhone,fax)

ContactId,AccountId,OwningBusinessUnit,OwningUser et OriginatingLeadId sont des uniqueidentifier
StatusCode,StateCode,DeletionStateCode sont des entier
et les autres champs des chaines de caractères

Code : Sélectionner tout - Visualiser dans une fenêtre à part
CONTACTEXTENSIONBASE(ContactId,New_compte_associe,New_id_contact,New_nom_societe)

ContactId,New_compte_associe,New_id_contact sont des uniqueidentifier
et New_nom_societe est une chaines de caractères

Jusque là aucun probléme.

Maintenant j'aimerais effectuer un trigger de suppression insertion et mise à jour qui lorsque modifie la table F_CONTACT repercute ses
modifications sur les tables CONTACT de la CRM.


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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
 
CREATE TRIGGER Modif_Sage_contact 
ON ESSAIGAMIEC.dbo.F_CONTACTT
FOR DELETE,INSERT,UPDATE 
AS 
 
 
IF NOT EXISTS(SELECT * FROM INSERTED) AND EXISTS(SELECT * FROM DELETED) -- On est dans le cas d'une suppression : instruction DELETE
		DELETE FROM AMIELEC_MSCRM.dbo.ContactBase
			FROM AMIELEC_MSCRM.dbo.ContactBase Ct	
				INNER JOIN DELETED Del				--Del pour deleted
					ON Ct.LastName=Del.CT_Nom
		IF @@ERROR <> 0
		ROLLBACK TRANSACTION
 
 
IF EXISTS(SELECT * FROM INSERTED) AND NOT EXISTS(SELECT * FROM DELETED) -- On est dans le cas d'une insertion : instruction INSERT
 
	--DECLARATION DES VARIABLES DE PROCEDURES
	declare @id int, @num varchar(17), @nom varchar(35), @prenom varchar(35), @service int, @fonction varchar(35), @telportable varchar(21), @telephone varchar(21), @fax varchar(21), @mail varchar(69),  @nom_complet varchar(70)
	declare @conv_ContactId uniqueidentifier, @service_char varchar(35),@id_utilisateur uniqueidentifier, @businness_unit uniqueidentifier, @compteId uniqueidentifier,@identifiant_contact int
 
	--DECLARATION DU CURSEUR
	DECLARE curseur_contact cursor FOR
	select cbMarq,CT_Num,CT_Nom,CT_Prenom,N_Service,CT_Fonction,CT_Telephone,CT_TelPortable,CT_Telecopie,CT_EMail 
	from INSERTED
	--select @autoid=@@identity from inserted
 
	--OUVERTURE DU CURSEUR ET LANCEMENT
	OPEN curseur_contact 
	FETCH curseur_contact  INTO @id, @num, @nom, @prenom, @service, @fonction, @telephone, @telportable, @fax, @mail
 
	--POUR LE PREMIER ENREGISTREMENT
	--CLEF PRIMAIRE DE LA TABLE CONTACTBASE généré de façon unique aléatoirement (uniqueidentifier)
	SET @conv_ContactId = NEWID()
 
	--INITIALISATION DE L'IDENTIFIANT
	SET @identifiant_contact=1
 
	--POUR DEFINIR LE PROPRIETAIRE DES DONNEES ET SA DIVISION ASSOCIEE
	SET @id_utilisateur='50F3DA06-2E90-DB11-996E-0015E9F01122'
	SET @businness_unit='CA227FFA-2D90-DB11-996E-0015E9F01122'
 
	select @nom=CT_Nom FROM ESSAIGAMIEC.dbo.F_CONTACTT
	select @prenom=CT_Prenom FROM ESSAIGAMIEC.dbo.F_CONTACTT
 
	--NOM COMPLET DU CONTACT
	SET @nom_complet=@nom+' '+@prenom	
 
	--POUR DEFINIR LE TYPE DE SERVICE
	if @service=1
		SET @service_char='Principal'
	if @service=2
		SET @service_char='Commercial'
	if @service=3
		SET @service_char='Achat'
	if @service=4
	 	SET @service_char='Informatique'	
	if @service=5
		SET @service_char='Administratif'	
	if @service=6
		SET @service_char='Autres'	
	if @service=7
		SET @service_char='Direction'	
 
	--TANT QUE LE CURSEUR CONTIENT DES DONNEES
	WHILE @@FETCH_STATUS = 0
		BEGIN	
 
		--LANCEMENT DU CURSEUR
		FETCH curseur_contact INTO @id, @num, @nom, @prenom, @service, @fonction, @telephone, @telportable, @fax, @mail
 
		--CLEF PRIMAIRE DE LA TABLE CONTACTBASE généré de façon unique aléatoirement (uniqueidentifier)
		SET @conv_ContactId = NEWID()
 
		--INCREMENTATION DE L'IDENTIFIANT
		SET @identifiant_contact=@identifiant_contact+1
 
		--POUR DEFINIR LE PROPRIETAIRE DES DONNEES ET SA DIVISION ASSOCIEE
		SET @id_utilisateur='50F3DA06-2E90-DB11-996E-0015E9F01122'
		SET @businness_unit='CA227FFA-2D90-DB11-996E-0015E9F01122'
 
		select @nom=CT_Nom FROM ESSAIGAMIELEC.dbo.F_CONTACTT
		select @prenom=CT_Prenom FROM ESSAIGAMIELEC.dbo.F_CONTACTT
 
		--NOM COMPLET DU CONTACT
		SET @nom_complet=@nom+' '+@prenom	
 
		--POUR DEFINIR LE TYPE DE SERVICE
		if @service=1
			SET @service_char='Principal'
		if @service=2
			SET @service_char='Commercial'
		if @service=3
			SET @service_char='Achat'
		if @service=4
			SET @service_char='Informatique'	
		if @service=5
			SET @service_char='Administratif'	
		if @service=6
			SET @service_char='Autres'	
		if @service=7
			SET @service_char='Direction'	
 
		--INSERTION DANS LES TABLES DE LA CRM
		insert into AMIELEC_MSCRM.dbo.ContactBase(ContactId,AccountId,OwningBusinessUnit,OwningUser,OriginatingLeadId,StatusCode,StateCode,DeletionStateCode,
		Description,LastName,FirstNAme,FullName,Department,JobTitle,EMailAddress1,Telephone1,MobilePhone,fax)
		values(@conv_ContactId,@compteId,@num,@businness_unit,@id_utilisateur,null,1,0,0,@nom,@prenom,@nom_complet,@service_char,@fonction,@mail,@telephone,@telportable,@fax)
 
		insert into AMIELEC_MSCRM.dbo.ContactExtensionBase(ContactId,New_compte_associe,New_id_contact,New_nom_societe)
		values(@conv_ContactId,Null,@identifiant_contact,@num)
 
IF @@ERROR <> 0
   ROLLBACK TRANSACTION
 
--FERMETURE ET DESALLOCAION DU CURSEUR
CLOSE curseur_contact
DEALLOCATE curseur_contact   
END
 
 
IF EXISTS(SELECT * FROM INSERTED) AND EXISTS(SELECT * FROM DELETED) -- On est dans le cas d'une MAJ : instruction UPDATE
	BEGIN
		UPDATE AMIELEC_MSCRM.dbo.ContactBase 
		SET  AMIELEC_MSCRM.dbo.ContactBase.LastName=Ins.CT_Nom
			FROM AMIELEC_MSCRM.dbo.ContactBase
				INNER JOIN INSERTED Ins			--Ins pour inserted
					ON AMIELEC_MSCRM.dbo.ContactBase.LastName=Ins.CT_Nom
		IF @@ERROR <> 0
		ROLLBACK TRANSACTION
	END


Pour la suppression ca semble fonctionner en revanche, il semble il y avoir problème pour l'insertion et la mise à jour.

Pour l'insertion, je sais qu'un triggers ne s'effectue qu'une seul fois meme si la table concerné possède plusieurs lignes mais je ne vois

comment faire d'une maniere ensembliste étant donné que je dois faire des modification entre les deux bases?
Je pensais à la limite integrer ma procedure stockée d'insertion mais je ne sais pas si c'est une bonne idée.

Pour la mise à jour il y a plusieurs lignes qui se créé et je ne vois pa pourquoi...

Si quelqu'un à la patience de m'aider et vois quelque chose qui ne va pas je lui serais extrement reconnaissant.