Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
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 02/05/2006, 12h16   #1
Débutant
 
Inscription : février 2003
Messages : 54
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 54
Points : 6
Points : 6
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
clement42 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2006, 12h30   #2
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
Je ne pense que c'est possible.
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2006, 12h32   #3
Membre actif
 
Inscription : 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
Points : 156
Points : 156
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 :
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...
jlucch est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2006, 12h39   #4
Membre actif
 
Inscription : 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
Points : 156
Points : 156
C'est possible, et cela marche ... pas de soucis ..
jlucch est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2006, 12h51   #5
Membre actif
 
Inscription : 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
Points : 156
Points : 156
Code :
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;
jlucch est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2006, 12h53   #6
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
Oui, probablement. Je pensais qu'il s'agissait d'un trigger sur une table de la base distante ...
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2006, 13h42   #7
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 448
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 448
Points : 4 194
Points : 4 194
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.
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2006, 16h02   #8
Débutant
 
Inscription : février 2003
Messages : 54
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 54
Points : 6
Points : 6
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
clement42 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2006, 16h42   #9
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
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 ?).
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2006, 16h53   #10
Débutant
 
Inscription : février 2003
Messages : 54
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 54
Points : 6
Points : 6
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
clement42 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2006, 17h23   #11
Débutant
 
Inscription : février 2003
Messages : 54
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 54
Points : 6
Points : 6
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
clement42 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2006, 17h32   #12
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
La raison est la suivante:

Citation:
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.
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2006, 10h07   #13
Débutant
 
Inscription : février 2003
Messages : 54
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 54
Points : 6
Points : 6
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
clement42 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2006, 14h14   #14
Débutant
 
Inscription : février 2003
Messages : 54
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 54
Points : 6
Points : 6
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 :
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 :
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
clement42 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2006, 01h16   #15
Membre confirmé
 
Homme Thomas Coquery
Consultant informatique
Inscription : février 2005
Messages : 250
Détails du profil
Informations personnelles :
Nom : Homme Thomas Coquery
Âge : 37
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
Points : 247
Points : 247
Envoyer un message via MSN à dyvim
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.
__________________
Dyvim
dyvim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2006, 01h32   #16
Membre confirmé
 
Homme Thomas Coquery
Consultant informatique
Inscription : février 2005
Messages : 250
Détails du profil
Informations personnelles :
Nom : Homme Thomas Coquery
Âge : 37
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
Points : 247
Points : 247
Envoyer un message via MSN à dyvim
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.
__________________
Dyvim
dyvim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2006, 12h44   #17
Membre actif
 
Inscription : 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
Points : 156
Points : 156
tu peux essayer avec cela :

Code :
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 ...
jlucch est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2006, 13h07   #18
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
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.
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2006, 15h02   #19
Membre actif
 
Inscription : 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
Points : 156
Points : 156
Effectivement, j'ai oublié le commit ..
jlucch est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2006, 15h49   #20
Membre confirmé
 
Homme Thomas Coquery
Consultant informatique
Inscription : février 2005
Messages : 250
Détails du profil
Informations personnelles :
Nom : Homme Thomas Coquery
Âge : 37
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
Points : 247
Points : 247
Envoyer un message via MSN à dyvim
Est ce que çà veut dire que çà marche maintenant???
__________________
Dyvim
dyvim 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 03h28.


 
 
 
 
Partenaires

Hébergement Web