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 :

probleme de trigger


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 61
    Par défaut probleme de trigger
    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.

  2. #2
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Par défaut
    a mon avis, tu devrais faire un curseur for delete et un pour insert et update

    dans le second, ne cherche pas a savoir si tu est en insert ou update, tu fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    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
     
    if @@rowcount = 0 -- tu n'a rien mis a jour
    BEGIN
    -- ton curseur insert
    END

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 61
    Par défaut
    Merci pour ta reponse rapide
    Je peut essayer avec les curseurs mais il me semblait qu'il fallait les éviter dans les triggers non?
    En meme temps pour l'insertion je ne vois pas d'autre solution...

  4. #4
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Par défaut
    si tu arrives a comprendre (dans le sens ou j'ai pu me tromper de champs..), tu peux remplacer le curseur insert par

    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
     
     
            INSERT INTO AMIELEC_MSCRM.dbo.ContactBase(
            ContactId,
            AccountId,
            OwningBusinessUnit,
            OwningUser,
            OriginatingLeadId,
            StatusCode,
            StateCode,
            DeletionStateCode,
            Description,
            LastName,
            FirstNAme,
            FullName,
            Department,
            JobTitle,
            EMailAddress1,
            Telephone1,
            MobilePhone,
            fax)
            SELECT 
            NEWID() , --@conv_ContactId,
            ? ,--@compteId, 
            cbMarq, --@num,
            'CA227FFA-2D90-DB11-996E-0015E9F01122', --@businness_unit,
            '50F3DA06-2E90-DB11-996E-0015E9F01122', --@id_utilisateur,
            NULL,
            1,
            0,
            0,
            CT_Num, --@nom,
            CT_Nom, -- @prenom,
            CT_Nom+' '+CT_Prenom, --@nom_complet,
            case N_Service
        when 1 then 'Principal'
        when 2 then 'Commercial'
        when 3 then 'Achat'
        when 4 then 'Informatique'    
        when 5 then 'Administratif'    
        when 6 then 'Autres'    
        when 7 then 'Direction'    
        else ''
            end,--@service_char,
            CT_Fonction, --@fonction,
            CT_EMail, --@mail,
            CT_Telephone,--@telephone,
            CT_TelPortable,--@telportable,
            CT_Telecopie --@fax
            FROM INSERTED
     
     
            INSERT INTO AMIELEC_MSCRM.dbo.ContactExtensionBase(
            ContactId,
            New_id_contact,
            New_nom_societe
           &nbsp;)
    SELECT 
    ContactId, --@conv_ContactId,
    A.nb, --@identifiant_contact,
    OwningBusinessUnit --@num
    FROM AMIELEC_MSCRM.dbo.ContactBase
    INNER JOIN ( SELECT count(*) as nb
    FROM AMIELEC_MSCRM.dbo.ContactBase
    WHERE 
        OwningUser=    'CA227FFA-2D90-DB11-996E-0015E9F01122', --@businness_unit,
        and     OriginatingLeadId='50F3DA06-2E90-DB11-996E-0015E9F01122', --@id_utilisateur,
    ) A
    WHERE 
        OwningUser=    'CA227FFA-2D90-DB11-996E-0015E9F01122', --@businness_unit,
        and     OriginatingLeadId='50F3DA06-2E90-DB11-996E-0015E9F01122', --@id_utilisateur,

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 61
    Par défaut
    Je vais essayer la solution que tu me propose je pensait pas qu'on pouvait le faire avec des 'insert into ... select '
    En tous cas je te remercie beaucoup de m'aider, c'est vraiment gentil!

  6. #6
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Par défaut
    un insert into ... select n'est valable que si tu insères TOUS les champs et dans le bon ordre

    pour ma part je l'interdis aux développeurs car en plus, si tu changes ( ajouter, supprimer des champs) la config de la table BOOM!!!!

    et puis penses a ceux qui passeront pas après toi et qui ne connaissent peut-être pas la structure de la table

    lecture de
    insert into toto select 1,8, null, 'tata' from titi

    t'es bien avancé!

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 61
    Par défaut
    J'ai adapter les insert à la place de mon curseur mais j'ai un autre probleme.
    Deux des champs que je dois inserer font reference à une autre table F_COMPTET qui est la table client.
    Il s'agit de AccountId dans la premiere insertion et New_compte_associe dans la deuxieme.
    Je suis bloqué car je ne peut pas faire le lien entre ces deux bases sans curseur...

    arggg!

Discussions similaires

  1. probleme de trigger
    Par [ME]yeye dans le forum Oracle
    Réponses: 6
    Dernier message: 15/06/2006, 15h33
  2. Problème comportement trigger
    Par ameno_123 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 04/05/2006, 00h20
  3. Probleme de trigger
    Par Lomme dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 09/03/2006, 10h39
  4. Probleme de trigger
    Par luciemacherie dans le forum Oracle
    Réponses: 4
    Dernier message: 16/01/2006, 17h21
  5. [JDBC]Probleme avec trigger Oracle
    Par aurel89 dans le forum JDBC
    Réponses: 2
    Dernier message: 02/08/2005, 11h53

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