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 :

utiliser un trigger sous sql server pour inserer des donnees dans Oracle


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 109
    Points : 35
    Points
    35
    Par défaut utiliser un trigger sous sql server pour inserer des donnees dans Oracle
    Bonjour tous le monde,
    j'ai des problemes avec l'utilisation d'un trigger sous sql server:
    le premier c'est que je connais pas la syntaxe d'un trigger sous sql server.
    deuxieme c'est que je utilise un serveur lié dont le nom est TIGER qui marche trés bien avec les simple utilisation.

    maintenant je veux utiliser un trigger qui fait une insertion dans une table sous sql server et on meme temps il execute un procedure sous oracle.

    et merci

  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 : 43
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    je connais pas la syntaxe d'un trigger sous sql server.
    Vous pouvez consulter en ligne ou télécharger la documentation de SQL Server à partir des liens dans ma signature, en recherchant CREATE TRIGGER

    je veux utiliser un trigger qui fait une insertion dans une table sous sql server et on meme temps il execute un procedure sous oracle.
    Votre trigger ressemblera donc à cela :

    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
    CREATE TRIGGER TR_AI_maTableSource
    	ON dbo.maTableSource
    AFTER INSERT
    AS
    BEGIN
    	INSERT INTO dbo.maTableCible
    	(
    		mesColonnes
    	)
    	SELECT desColonnes
    	FROM INSERTED
    	JOIN desTables ON INSERTED.uneCle = uneTable.uneCle
     
    	EXEC TIGER.maBD.monSchema.maProcedureStockee
    		@parametres
    END
    Dans un trigger SQL Server, vous avez accès aux tables virtuelles INSERTED et DELETED. Ces deux tables ont strictement la même structure que la table sur laquelle l'instruction de modification a été effectuée.
    Comme vous pouvez vous en douter, la table INSERTED reflète les nouvelles valeurs appliquées à la table, tandis que la table DELETED contient les anciennes valeurs contenues dans la table.

    Au niveau des différences d'implémentation des triggers entre Oracle et SQL Server, sachez que les triggers sous SQL Server sont purement ensemblistes, à la différence d'Oracle, pour lequel vous êtes obligé de spécifier FOR EACH ROW, c'est à dire que les lignes sont traitées une par une.
    Enfin, les triggers BEFORE n'existent pas sous SQL Server : vous pouvez seulement spécifier des trigger AFTER/FOR et INSTEAD OF.

    @++

  3. #3
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 109
    Points : 35
    Points
    35
    Par défaut
    Je vous remercie infiniment pour votre reponse bien claire.
    je vais tester cela et vous repondre s'il y a un probleme.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 109
    Points : 35
    Points
    35
    Par défaut
    Merci bien pour votre reponse mais malheureusement j'ai pas compris cette partie de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT desColonnes
    	FROM INSERTED
    	JOIN desTables ON INSERTED.uneCle = uneTable.uneCle
    Merci pour donner des explications à 'desColonnes', 'desTables','uneTable.uneclé'

  5. #5
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 109
    Points : 35
    Points
    35
    Par défaut
    Bonjour ,
    j'ai utilisé ceci
    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
     
    CREATE TRIGGER TRo_maTableSource
    	ON dbo.personne
    AFTER INSERT
    AS
    BEGIN
     
    	INSERT INTO dbo.personne
    	(
    		first_name
    	)
     
     
    exec ('BEGIN
     custebs_create_employee(''xxxx'');
    END;
    ') at TIGER;
     
     
    END

    je sais pas si ma syntaxe est corrcte mais quand je la execute ça march bien.
    Mais lorsk j'essai de faire un insert into le message suivant apparait.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    OLE DB provider "OraOLEDB.Oracle" for linked server "TIGER" returned message "La nouvelle transaction ne peut pas s'inscrire dans le coordinateur de transactions spécifié. ".
    Msg*7391, Niveau*16, État*2, Procédure*TRo_maTableSource, Ligne*10
    The operation could not be performed because OLE DB provider "OraOLEDB.Oracle" for linked server "TIGER" was unable to begin a distributed transaction.
    merci de me repondre

  6. #6
    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 : 43
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    En fait vous auriez du écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TRIGGER TRo_maTableSource
    	ON dbo.personne
    AFTER INSERT
    AS
    BEGIN
    	INSERT INTO dbo.personne
    	(
    		first_name
    	) 
    	EXEC TIGER.maBaseDeDonnees.monSchema.custebs_create_employee(''xxxx'');
    END
    Merci pour donner des explications à 'desColonnes', 'desTables','uneTable.uneclé'
    - 'desColonnes' : il s'agit des colonnes provenant de tables que vous référencez dans la clause FROM / JOIN de votre requête

    - 'desTables' : dans la clause FROM / JOIN, vous pouvez spécifier plusieurs tables, qui sont la reliées deux à deux par des contraintes d'intégrité sur les colonnes de ces tables, que l'on appelle clés (clé primaire et clé étrangèe )

    - uneTable.uneclé : exemple FACTURE.IDFacture ou encore LIGNE_FACTURE.IDFacture

    Pour bien comprendre les jointures, regardez cet article de SQLPro, et ici pour les contraintes

    @++

  7. #7
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 109
    Points : 35
    Points
    35
    Par défaut
    bonjour ,
    j'ai toujours cette erreur pleaaaase help
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    OLE DB provider "OraOLEDB.Oracle" FOR linked server "TIGER" returned message "La nouvelle transaction ne peut pas s'inscrire dans le coordinateur de transactions spécifié. ".
    Msg*7391, Niveau*16, État*2, Procédure*TRo_maTableSource, Ligne*10
    The operation could NOT be performed because OLE DB provider "OraOLEDB.Oracle" FOR linked server "TIGER" was unable TO begin a distributed transaction.

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 915
    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 : 21 915
    Points : 51 691
    Points
    51 691
    Billets dans le blog
    6
    Par défaut
    Pour faire ceci vous devez IMPERATIVEMENT :
    1) lancer MSDTC sur l'ensemble des serveurs SQL et Oracle
    2) démarrer une transaction distribuée explicitement par BEGIN DISTRIBUTED TRANSACTION

    A +

  9. #9
    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 : 43
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Pour compléter la réponse de SQLPro : vous devez aller dans les services de composants (disponible dans les outils d'administration dans le menu démarrer ou alors Démarrer | Exécuter | C:\WINDOWS\system32\Com\comexp.msc)

    Développez la node "services de composants".
    Dans la barre d'outils, le dernier bouton est un petit écran d'ordinateur : cliquez dessus : vous obtenez alors un onglet MSDTC (MS Distributed Transaction Coordinator). Utilisez le bouton "Configuration de la sécurité" pour cocher "Accès DTC réseau" puis configurer de façon adéquate le différentes options proposées dans la boîte de dialogue

    @++

  10. #10
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 109
    Points : 35
    Points
    35
    Par défaut
    Bonjour,
    merci bien pour vos reponses ce que vous venez de dire je l'ai deja fait sur mon poste où il ya le sql server.

    est ce que je dois faire ça meme sur le server distant ou il ya oracle.?

    NB ce probleme existe juste pour les trigger
    l'insertion normale passe tres bien avec le link server

  11. #11
    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 : 43
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    NB ce probleme existe juste pour les trigger
    l'insertion normale passe tres bien avec le link server
    C'est-à-dire ? Vous faites une transaction distribuée entre les deux serveurs par une procédure stockée et cela fonctionne ?

    est ce que je dois faire ça meme sur le server distant ou il ya oracle.?
    Oui

    @++

  12. #12
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 109
    Points : 35
    Points
    35
    Par défaut
    BONJOUR,

    j'ai voulu dire que le serveeur lié fonctionne trés bien quand je veux faire des simple insertion avec les Openquery depuis sql server 2005 vers Oracle 10G.
    et meme pour executer des procedure dans oracle depuis sql server ça marche.

    le probleme se produit lors de l'utilisation des trigger dans sql server.
    il genere l'erreur precedemment definit.

    merci

  13. #13
    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 : 43
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Avez-vous toujours le même problème en ayant configuré MSDTC sur les deux serveurs ?

    @++

  14. #14
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 109
    Points : 35
    Points
    35
    Par défaut
    oui toujours le meme probleme et ça me desespere

  15. #15
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 109
    Points : 35
    Points
    35
    Par défaut
    voila ce que j'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    create table anna (id integer not null primary key , nom varchar(20) );
     
    CREATE TRIGGER TableSource
    	ON dbo.anna
    AFTER INSERT
    AS
    BEGIN
    INSERT OPENQUERY (TIGER, 'SELECT * FROM apps.xx_examples')VALUES ('ile');
    END
     
    insert into anna values(1,'cc');
    et voila ce que j'ai reçu comme erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Msg*8501, Niveau*16, État*3, Procédure*Tig_TableSource, Ligne*6
    MSDTC on server 'SERV' is unavailable.

  16. #16
    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 : 43
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    MSDTC est-il démarré sur 'SERV' ?

    - Démarrer | Exécuter | C:\WINDOWS\system32\Com\comexp.msc
    - Développez la node "services de composants".
    Dans la barre d'outils, le dernier bouton est un petit écran d'ordinateur : cliquez dessus : vous obtenez alors un onglet MSDTC (MS Distributed Transaction Coordinator)
    - Si le bouton "Arrêter" est grisé, MSDTC n'est pas démarré et vous devrez alors cliquer sur "Démarrer"

    @++

  17. #17
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut
    Bonsoir,

    Pour isoler le problème MSDTC, vous pourvez utiliser ce lien

    On y parle d'un petit utilitaire appelé DTCPing qui vous permettra de tester
    MSDTC.

    @+

  18. #18
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 109
    Points : 35
    Points
    35
    Par défaut
    je viens de faire ce k tu viens de m'expliquer mais le bouton arrter n'est pas griser alors il est demmaré.

    j'arrive pas avoir où le probleme de tous ça.

    j'explique plus mon environnement:
    sql server 2005 est installé sur mon PC XP PAC2 et Oracle10G sur un server distant windows server 2003

  19. #19
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut
    Bonjour,

    je viens de faire ce k tu viens de m'expliquer mais le bouton arrter n'est pas griser alors il est demmaré.
    Je ne comprends pas. Que donne le ping avec DTCPing ?

    Voici un lien qui pourrait vous aider. Sur la même config que la votre.

    @+

  20. #20
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 109
    Points : 35
    Points
    35
    Par défaut
    j'ai pas encore essayé le DTCPing, je parle de ce que m'a dit ''elsuket''

    ça devient plus en plus complexe pour moi

Discussions similaires

  1. Création de trigger sous SQL Server 2008
    Par lessoy dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 22/04/2013, 12h49
  2. Trigger sous SQL-Server
    Par momedalhouma dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 09/02/2012, 16h46
  3. Tester la performance d'un trigger sous SQL Server 2008
    Par lerieure dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 14/02/2011, 18h04
  4. [SQL-Server] Développer sous SQL Server pour la 1re fois
    Par Ayor81 dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 19/09/2008, 13h26
  5. Réponses: 2
    Dernier message: 17/10/2006, 11h25

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