Je voudrais savoir s'il existe une commande Oracle pour savoir si un DB-LINK (nom: myBDLink) est utilisé quelque part dans une DB et comment afficher les objets (vues, vues matérialisées, procédures, fonctions, ...) qui utilise le.
Pourriez-vous s'il vous plaît m'aider avec ça?
Merci de votre aide
3 Réponses :
Il n'y a pas de réponse complète. Comment la base de données connaîtrait-elle le code qui se trouve en dehors de la base de données? Ça ne peut pas. Donc, si vous avez un script SQL, ou une application qui ne repose pas sur des procédures stockées pour tout faire, la base de données ne les connaîtra pas.
Cela dit, pour les dépendances qui se trouvent dans des procédures stockées dans la base de données, vous pouvez essayer ceci:
select * from dba_dependencies where referenced_link_name is not null ;
J'ai essayé la requête (même la partie où) mais cela ne fonctionne pas. dba_dependencies n'est pas reconnu. Pourriez-vous m'aider avec ça
Eh bien, vous pouvez essayer d'interroger diverses vues système et voir si l'une d'entre elles contient une chaîne que vous recherchez. Comme vous voulez vérifier toute la base de données, vous vous connecterez probablement en tant qu'utilisateur privilégié et vérifierez dba_
views; sinon, all_
ou user_
ferait l'affaire.
Par exemple, pour vérifier des procédures, des fonctions, des packages, ...:
select table_name, comments from dictionary; TABLE_NAME COMMENTS ------------------------------ -------------------------------------------------- USER_CONS_COLUMNS Information about accessible columns in constraint definitions ALL_CONS_COLUMNS Information about accessible columns in constraint definitions DBA_CONS_COLUMNS Information about accessible columns in constraint definitions <snip>
Pour vérifier les vues, vous aurez besoin d'une fonction qui recherchera dans sa colonne de type de données LONG
(car vous ne pouvez pas l'utiliser directement dans SQL):
select owner, view_name from dba_views where f_long(view_name, 'mydblink') = 1;
puis
create or replace function f_long(par_view in varchar2, par_String in varchar2) return varchar2 is l_text varchar2(32000); begin select text into l_text from dba_views where owner not in ('SYS', 'SYSTEM') and view_name = par_view; return case when instr(lower(l_text), lower(par_string)) > 0 then 1 else 0 end; end; /
J'ai exclu SYS
et SYSTEM
car ils ne doivent rien contenir des utilisateurs. Peut-être voudriez-vous exclure d'autres utilisateurs.
Pour voir d'autres (re) sources, interrogez le dictionnaire, par exemple
select owner, name, type, line from dba_source where owner not in ('SYS', 'SYSTEM') and lower(text) like '%mydblink%';
Apparemment, dba_source, les dba_views ne sont pas reconnus, pourriez-vous m'aider avec ça?
Vous devez être un utilisateur privilégié pour les voir (tel que SYS). Si ce n'est pas le cas, parlez à votre DBA pour voir ce qu'il peut faire. Pour commencer, exécutez le script avec ALL_SOURCE et ALL_VIEWS; il affichera des données sur les objets auxquels vous avez accès.
Pour ajouter aux autres réponses (correctes) qui ont été publiées par @Littlefoot et @EdStevens, une analyse rapide et sale peut également être effectuée par rapport au référentiel de charge de travail automatisé (AWR).
L'avantage de cette approche est qu'elle trouvera des utilisations d'objets distants à partir de SQL soumis à la base de données, que ce SQL soit dans DBA_SOURCE
ou non (par exemple, est incorporé dans une application externe).
-- Find any objects referenced across a database link (sort of) select object_node, object_name, count(distinct sql_id) sql_id_count from dba_hist_sql_plan where object_type = 'REMOTE' group by object_node, object_name order by object_node, object_name ;
Le problème est que les données AWR ne sont pas complètes à 100%. Tout d'abord, il n'est pas conservé pour toujours, donc un lien de base de données utilisé pour la dernière fois plus d'un mois (ou deux mois ou la durée pendant laquelle vos DBA conservent les données AWR) ne sera pas vu. Deuxièmement, AWR ne prend que des instantanés périodiquement, disons toutes les heures. Il est donc théoriquement possible pour un SQL d'utiliser un lien de base de données, puis de sortir du cache de la bibliothèque avant le prochain instantané AWR.
Je pense que la chance de manquer quelque chose à cause de ce dernier bit est faible sur les systèmes avec lesquels je travaille. Mais, si vous avez des applications mal écrites (c'est-à-dire, aucune variable de liaison) et un espace de pool partagé limité, c'est quelque chose à craindre.
Si tout échoue, configurez un déclencheur AFTER LOGON sur l'utilisateur DB Link sur la base de données distante qui vérifie l'utilisation de la liaison de base de données.