Database Objeleri İçinde Kolon Tabanlı Etki Analizi Yapılması

Herkese Selam,

Yaptığımız projelerde zaman zaman DB seviyesinde etki analizi yapma ihtiyacı duymaktayız. Bir tablonun veya bir kolonun nerelerde geçtiğini tespit etmek bazen çok kritik bir konu olabiliyor. Hali hazırda Oracle’ın sunduğu imkanlar ile tablo tabanlı obje taraması rahat bir şekilde yapılabilirken kolon bazlı yapmak pekte rahat olmayabiliyor. Bu tarz ihtiyacımızın olduğu durumlarda aşağıdaki kodu kullanmak işimizi kolaylaştırabilir.

İlk etapta bahsi geçmişken tablo bazlı tek level etkninin nasaıl bulunduğunu hatırlayalım.

SELECT *
  FROM DBA_DEPENDENCIES
WHERE     REFERENCED_OWNER = 'TABLE_SCHEMA'
       AND REFERENCED_NAME = 'TABLE_NAME';


SELECT * FROM DBA_SOURCE WHERE UPPER(TEXT) LIKE '%TABLE_NAME%';

Şimdi yazımza konu olan durumu örnek case üzerinden inceleyelim.

Örnek Case: X Scheması altındaki Y Tablosuna ait COL1 kolonunun DB içerisinde hangi objelerde kullanıldığını aşağıdaki kod ile bulabiliriz.

DECLARE
   V_DEPENDENCY   CLOB;
   V_RETCODE      NUMBER;
BEGIN
   FOR I IN (SELECT *
               FROM DBA_DEPENDENCIES
              WHERE REFERENCED_OWNER = 'X' AND REFERENCED_NAME = 'Y')
   LOOP
      IF ( (I.TYPE <> 'MATERIALIZED VIEW') AND (I.TYPE <> 'PACKAGE BODY'))
      THEN
         SELECT DBMS_METADATA.GET_DDL (I.TYPE, I.NAME, I.OWNER)
           INTO V_DEPENDENCY
           FROM DUAL;
      ELSIF (I.TYPE = 'PACKAGE BODY')
      THEN
         SELECT DBMS_METADATA.GET_DDL ('PACKAGE_BODY', I.NAME, I.OWNER)
           INTO V_DEPENDENCY
           FROM DUAL;
      ELSE
         SELECT DBMS_METADATA.GET_DDL ('MATERIALIZED_VIEW', I.NAME, I.OWNER)
           INTO V_DEPENDENCY
           FROM DUAL;
      END IF;

      SELECT DBMS_LOB.INSTR (UPPER (V_DEPENDENCY), 'COL1')
        INTO V_RETCODE
        FROM DUAL;

      IF (V_RETCODE > 0)
      THEN
         DBMS_OUTPUT.PUT_LINE (
               'OWNER:'
            || I.OWNER
            || '   NAME:'
            || I.NAME
            || '      TYPE:'
            || I.TYPE);
      END IF;
   END LOOP;
END;

Bu koddan elde ettiğimiz sonucun yanına DBA_SOURCE view üzerinden elde ettiğimiz sonucuda ekleyerek detaylı bir etki analizi elde edebiliriz.

SELECT *
  FROM dba_source
WHERE UPPER (text) LIKE '%COL1%';


Yazılan kod bloğundan da anlaşılacağı gibi Oracle’ın arka plandaki metadata sı üzerinden gerekli analizimizi elde ettik. Bu analizi yaparken dikkat etmemiz gereken husus kodu çalıştırdığımız schema user’ının Objelere erişimde herhangi bir yetki probleminin olmaması. Ben testlerimi DBA yetkisi olan bir user uzerinden gerçekleştirdim. Umarım farkındalık anlamında faydalı bir yazı olmuştur.

Advertisements

About ... from Emrah METE

Bilgisayar Mühendisi
This entry was posted in Oracle and tagged , , , , , , , , , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s