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

PL/SQL Oracle Discussion :

trigger d'une bd vers une autre bd


Sujet :

PL/SQL Oracle

  1. #1
    Membre averti
    Inscrit en
    Février 2003
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 54
    Par défaut trigger d'une bd vers une autre bd
    Bonjour, je débute un peu en PL/SQL, et j'ai une question d'ordre générale sur les triggers (déclencheurs)
    J'ai actuellement une base de données (bd1) contenant une table personne1 et j'aimerais faire un déclencheur, qui, a chaque insertion dans cette table, insert une ligne dans une table située dans une autre base de données (bd2).
    est - il possible de faire un trigger qui lie ainsi deux base de données ? Si oui, pourriez vous me donner un exemple simple d'application ?

    Merci d'avance

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Je ne pense que c'est possible.

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Par défaut
    En premier lieu, il faut créer un database link entre tes 2 instances ....

    Le database link te permet de voir une table T2 sur une instance instance2 depuis l'instance : Instance1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    exemple :
     
    conn user/user@Instance1
    select count(*) from T2@instance2;
    Ensuite il te suffira de créer ton trigger sur ta table T1...

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Par défaut
    C'est possible, et cela marche ... pas de soucis ..

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Par défaut
    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
     
    connect user2/XXX@instance2
    drop database link INSTANCE1 ;
    create database link INSTANCE1 CONNECT TO user1 identified by XXX;
     
    conn user1/user1@instance1
    create table T1 (n number);
     
    conn user2/user2@instance2
    create table T2 (n number);
    desc user1.T1@instance1;
    CREATE oR REPLACE TRIGGER trg_T2 before insert on T2
    for each row
    BEGIN
    insert into user1.T1@instance values (:new.n);
    when others then
       RAISE_APPLICATION_ERROR(-20000,'Erreur  :'||substr(sqlerrm,1,150));
     END;
    /
     
    insert  into user2.T2 values (1);
    commit;
    select count(*) from  user1.T1@instance1;

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Oui, probablement. Je pensais qu'il s'agissait d'un trigger sur une table de la base distante ...

  7. #7
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Je sais pas ce que ça peut donner sur une grosse appli, mais j'ai vu chez Asktom que les codes des triggers (bien que compilés) étaient reparsés à chaque exécution.
    Il est conseillé de créer une procédure et d'appeler cette procédure dans le trigger.

    Est-ce qu'un parse teste le dblink ? si oui, on peut avoir des perfs réduites.

  8. #8
    Membre averti
    Inscrit en
    Février 2003
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 54
    Par défaut
    bon en fait j'aimerais que la cible de ce lien soit une table d'une base de données mySQL. A nouveau, cela est il possible ? Comment faut il configurer le "database link" ?

    Merci

  9. #9
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Au risque de me tromper une seconde fois , là je pense que ce n'est pas possible. Les database links ne concernent que les bases Oracle et ne permettent donc pas de connecter des bases Oracle et des bases non-Oracle (à moins peut-être d'utiliser des produits intermédiaires ?).

  10. #10
    Membre averti
    Inscrit en
    Février 2003
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 54
    Par défaut
    justement c'est ce que je pensais, et j'essaie d'uiliser un driver odbc (MySQL Connector / ODBC 3.51). Je l'ai installer, et le test fait par l'outils d'administration windows me montre qu'il fonction. Mon problème maintenant est que je ne sais pas quoi mettre comme valeur à ce moment de création du datalink :
    Connexion au schéma : c'est le nom de ma base mysql ?
    Mot de passe : le mot de passe de mon user root mysql ?
    port d'hote distant : 3306 ?
    SID ou nom de service : alors là j'ai aucune idée ...

    merci de votre aide

  11. #11
    Membre averti
    Inscrit en
    Février 2003
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 54
    Par défaut
    je me répond à moi seul pour faire un peu avancer le débat
    Donc j'ai arrêter d'essayer de créer une database link via l'interface graphique d'oracle et me suis plongé dans du bon vieux SQL. Voilà mon script :

    Je crée d'abord mon datalink en utilisant mon connecteur odbc, et ca fonctionne :

    create database link myLink connect to "root2" identified by "root" using 'myodbc35';

    Le problème est quand je test le link de la manière suivante j'obtiens l'erreur d'oracle écrite ensuite ...

    select * from ma_table_cible@myLink;

    ORA-12154: TNS : l'identificateur de connexion indiqué n'a pas pu être résolu

    Quelqu'un sait il d'où peut venir le problème ?

    Merci

  12. #12
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    La raison est la suivante:

    the CREATE DATABASE LINK statement to create a database link. A database link is a schema object in one database that enables you to access objects on another database. The other database need not be an Oracle Database system. However, to access non-Oracle systems you must use Oracle Heterogeneous Services.

  13. #13
    Membre averti
    Inscrit en
    Février 2003
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 54
    Par défaut
    Bonjour, j'ai essayé d'utiliser le principe d'oracle heterogeneous services, mais je n'arrive pas à le faire fonctionner. J'ai utilisé ce "tutorial" http://www.orafusion.com/art_orahs.htm mais je ne l'ai pas réellement compris. J'ai vraiment du mal avec tous les fichiers de configurations ...
    Une chose dont je suis peu sûr est la localisation de l'ensemble des fichiers modifiés. Sont -ils tous au niveau C:\oraclexe\app\oracle\product\10.2.0\server\hs\admin ou certains sont au niveau C:\oraclexe\app\oracle\product\10.2.0\server\NETWORK\ADMIN ?
    Quelle est la différence entre ces deux arborescences ?

    Sinon, il n'existe pas un utilitaire graphique qui fait "oracle heterogeneous services" facilement ?


    En vous remerciant d'avance

  14. #14
    Membre averti
    Inscrit en
    Février 2003
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 54
    Par défaut
    Bonjour
    j'ai enfin réussi à faire communiquer oracle et mysql. Je peux donc à présent faire des requetes "select" à partir d'oracle sur une table de la base mysql. Cependant, je n'arrive pas à faire fonctionner le trigger que jlucch m'a donné précédemment. J'ai essayé de faire un trigger très simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE OR REPLACE TRIGGER  "PERSONNE_SOURCE_T1" 
    AFTER
    insert on "PERSONNE_SOURCE"
    for each row
    begin
    INSERT INTO personne@msql VALUES(:new.id, :new.nom);
    end;
    Cependant, lorsque j'essaie d'ajouter une ligne dans la table PERSONNE_SOURCE_T1, j'ai l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    error ORA-02047: impossible de joindre la transaction distribuée en cours d'exécution
    ORA-06512: à "SYSTEM.PERSONNE_SOURCE_T1", ligne 2
    ORA-04088: erreur lors d'exécution du déclencheur 'SYSTEM.PERSONNE_SOURCE_T1'
    Quelqu'un a une idée pour résoudre ce problème ?? merci

  15. #15
    Membre expérimenté
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2005
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 250
    Par défaut
    Est ce qu'une autre solution ne pourrait pas être de créer une procédure stockée JAVA(ou C, C++) qui irait écrire dans la base MySQL, et d'appeler cette procédure stockée dans le trigger?

    En tout cas, continue de nous dire ou tu en est clement42 car si tu arrives à trouver une solution qui fonctionne je suis curieux de la connaître.

    Bon courage.

  16. #16
    Membre expérimenté
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2005
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 250
    Par défaut
    Citation Envoyé par clement42
    Quelqu'un a une idée pour résoudre ce problème ?? merci
    Ca ressemble à une erreur de transaction "classique".
    Si ton code est bien celui là ... Peut être qu'il faudrait COMMITer ton insert non? ou faire de la transaction autonome?

    ORA-02047:cannot join the distributed transaction in progressCause:This can happen only when attempting to update an Oracle Version 6 and an Oracle7 database in the same transaction, because either
    • A transaction is in progress against a remote database that does not support two-phase commit.
    • Updates are pending and an attempt was made to update a different database that does not support two-phase commit.
    Action:Complete the current transaction before attempting the action that caused the error.

  17. #17
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Par défaut
    tu peux essayer avec 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
     
    CREATE OR REPLACE TRIGGER  "PERSONNE_SOURCE_T1" 
    AFTER
    insert on "PERSONNE_SOURCE"
    for each row
    DECLARE
    PRAGMA AUTONOMOUS_TRANSACTION;
    begin
    INSERT INTO personne@msql VALUES(:new.id, :new.nom);
    exception
     when others then
         dbms_output.put_line('Erreur dans TRIGGER PERSONNE_SOURCE_T1 :'||substr(sqlerrm,1,150));
         RAISE_APPLICATION_ERROR(-20000,'ECHEC dans triggerPERSONNE_SOURCE_T1 :'||substr(sqlerrm,1,150));
    end;
    /
    ==> Si cela marche, je t'invite à faire des recherches sur ces fameuses transactions autonomes ...
    ==> PS : N'oublie pas la gestion d'erreur dans tes triggers ...

  18. #18
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    J'ai quelques doutes sur l'utilisation d'une transaction indépendante dans un trigger: c'est possible mais il faut tenir compte des règles suivantes:
    1. La transaction indépendante démarrée doit être terminée par COMMIT ou ROLLBACK avant le retour à la transaction en cours: sinon une exception est levée.
    2. Une transaction indépendante ne peut voir aucune mise à jour de la transaction en cours.
    L'erreur ORA-02047 pourrait être interprêtée en disant que MySQL ne supporte pas le COMMT à 2 phases avec une base Oracle, autrement dit, il ne serait pas possible de faire travailler les 2 bases ensemble dans une même transaction ? Il faudrait vérifier si cela est vraiment possible et si oui dans quelles conditions.

  19. #19
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Par défaut
    Effectivement, j'ai oublié le commit ..

  20. #20
    Membre expérimenté
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2005
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 250
    Par défaut
    Est ce que çà veut dire que çà marche maintenant???

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [VB.Net] Comment copier une DataRow d'une table vers une autre ?
    Par YLF dans le forum Accès aux données
    Réponses: 7
    Dernier message: 05/09/2012, 23h23
  2. [C#] transferer une ligne d'une datagrid vers une autre datagrid
    Par nassimmm dans le forum Windows Forms
    Réponses: 4
    Dernier message: 11/08/2006, 09h38
  3. copier une ligne d'une table vers une autre
    Par Adren dans le forum Langage SQL
    Réponses: 5
    Dernier message: 08/08/2006, 11h54
  4. copier une partie d'une image vers une autre
    Par gregcat dans le forum Langage
    Réponses: 1
    Dernier message: 14/04/2006, 13h39
  5. [VB.NET] Copie d'une table d'une DB vers une autre
    Par SergeF dans le forum Windows Forms
    Réponses: 9
    Dernier message: 20/11/2004, 09h54

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