Bonjour ,
J'ai 2 bases Oracle distinctes DB1 et DB2, chacune contenant une table DOSSIER (qui a le même schéma dans les 2 bases), et chaque table DOSSIER étant alimentée par le même système.
Pour un outil d'administration, je dois regrouper dans une table DOSSIER d'une base DB3 le contenu des 2 tables DOSSIER des bases DB1 et DB2.
Le principe retenu est d'utiliser une "Materialized View" que je crée comme ceci :
Note 1 : DB1 et DB2 sont des DB_LINKS que j'ai créé précédemment, cela marche bien
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 CREATE MATERIALIZED VIEW DB3.DOSSIER REFRESH FAST ON DEMAND WITH PRIMARY KEY AS SELECT DOSSIER.* FROM DOSSIER@DB1 UNION SELECT DOSSIER.* FROM DOSSIER@DB2 WHERE DOS_ID NOT IN (SELECT DOS_ID FROM DOSSIER@DB1);
Note 2 : la requête imbriquée à la fin est nécessaire pour ne pas avoir de doublons (si 2 objets ont la même clé primaire dans les 2 tables DOSSIER de DB1 et DB2, je ne veux garder que l'exemplaire de DB1 car ils représentent la même chose et je sais que celui de DB1 sera forcément le plus à jour)
Note 3 : j'ai bien créé un Snapshot log pour mes tables DOSSIER dans DB1 et DB2 comme ceci :
Mais lors de la création de la vue matérialisée, j'ai l'erreur "ORA-12015: impossible de créer une vue matérialisée de régénération rapide à partir d'une interrogation complexe"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 CREATE MATERIALIZED VIEW LOG ON DOSSIER WITH PRIMARY KEY;
Est-ce l'opérateur UNION ou bien la présence d'une sous-requête imbriquée qui provoque cette erreur ?
Je précise qu'avec "REFRESH COMPLETE", tout marche bien, je recupere bien dans ma table DOSSIER de DB3 le contenu des 2 autres bases, mais je ne veux faire qu'un rafraichissement simple, pas complet
Merci d'avance
Partager