replication de table sur deux bases repar [resoluTRIGGER REPLICATION] - SQL/NoSQL - Programmation
Marsh Posté le 19-06-2008 à 01:15:51
Bonjour ippat,
Je me rend bien compte que ton post date un peu mais je suis intéressé par la réalisation d'une réplication similaire à celle que tu as souhaité réalisé.
As-tu finalement trouvé la solution ?
Je te remercie,
Prisca
Marsh Posté le 29-06-2008 à 12:27:53
Prisca82 a écrit : Bonjour ippat, |
Effectivement, ce post date un peu.
Si je me souviens bien, l'erreur venait juste du fait que j'utilisais des guillements pour les noms de table ("usine" par exemple) dans le code alors que les noms de tables n'en contenaient pas.
Voilà pas sur que cette réponse te soit très utilse
Marsh Posté le 12-05-2006 à 17:00:32
Bonjour tout le monde
Je cherche à créer deux bases de données(DBMIAGE et DBXP) contenant des tables communes dont les données doivent etre identiques.
J'ai d'abord créer des liens dans les deux sens :
-de dbmiage à dbxp
create database link dbxp connect to truc identified by truc using 'dbxp';
-de dbxp à dbmiage
create database link dbmiage connect to truc identified by truc using 'dbmiage';
J'ai ensuite utiliser lancer des triggers dans les deux bases je vous mets celle de dbmiage ->dbxp)
create or replace trigger tr_copie_usine
after insert or update or delete on "usine"
For each row
begin
if inserting then
insert into "usine"@dbxp values
(:new."numero_usine",
:new."adresse_usine" );
elsif updating then
update "usine"@dbxp set
"adresse_usine"=:new."adresse_usine"
where "numero_usine"=:new."numero_usine";
elsif deleting then
Delete from "usine"@dbxp
where "numero_usine"=:old."numero_usine";
else raise_application_error
(-20001, 'erreur declencheur tr_copie_usineDBMIAGE');
end if;
End;
/
Le probleme c'est que ca crée des conflits car elles se modifieraient en permanence.
Donc j'ai rajouter des conditions pour essayer d'eviter cela :
create or replace trigger tr_copie_usine
after insert or update or delete on "usine"
For each row
begin
if inserting then
(when not exists
(select "numero_usine"
from "usine"@dbxp O
where O."numero_usine"=:new."numero_usine" )
then insert into "usine"@dbxp values
(:new."numero_usine",
:new."adresse_usine" ));
elsif updating then
(when not exists
(select "numero_usine" ,"adresse_usine"
from "usine"@dbxp O
where O."numero_usine"=:new."numero_usine"
and O."adresse_usine"=:new."adresse_usine" )
then update "usine"@dbxp set
"adresse_usine"=:new."adresse_usine"
where "numero_usine"=:new."numero_usine" );
elsif deleting then
(when exists
(select "numero_usine"
from "usine"@dbxp O
where O."numero_usine"=:new."numero_usine" )
then Delete from "usine"@dbxp
where "numero_usine"=:old."numero_usine" );
else raise_application_error
(-20001, 'erreur declencheur tr_copie_usineDBMIAGE');
end if;
End;
/
Mais cela ne marche pas car ce n'est pas la bonne syntaxe.
Donc est ce que qu'elle pourrait m'indiquer la syntaxe exacte ou me proposer une autre solution a base de trigger?
Merci d'avance
Message édité par ippat le 29-06-2008 à 12:29:58