1
votes

Comment savoir si un lien db est utilisé quelque part dans une base de données

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


1 commentaires

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.


3 Réponses :


1
votes

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
;


1 commentaires

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



2
votes

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%';


2 commentaires

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.



1
votes

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.


0 commentaires