DBMS_DEVELOPER در اوراکل 23ai(23.7)

در پایگاه داده اوراکل، برای استخراج متادیتای اشیا، می‌توانیم از پکیج DBMS_METADATA استفاده کنیم. این پکیج شامل بسیاری از توابع و روال‌های مفید است، مانند GET_DDL، GET_DEPENDENT_DDL و SET_TRANSFORM_PARAM. علاوه بر این، برخی ابزارها مانند SQLcl روش‌های خاص خود را برای استخراج متادیتا ارائه می‌دهند—به عنوان مثال، دستور DDL در ابزار SQLcl.

از نسخه 23.7 به بعد، اوراکل روش دیگری برای استخراج متادیتای اشیا معرفی کرده است. در این نسخه، می‌توانیم از DBMS_DEVELOPER در کنار DBMS_METADATA استفاده کنیم. DBMS_DEVELOPER کاربرپسند است و خروجی را در قالب JSON تولید می‌کند. این پکیج در حال حاضر تنها از TABLE، INDEX و VIEW پشتیبانی می‌کند، در حالی که DBMS_METADATA بسیار قدرتمندتر است و تقریباً از همه انواع اشیا پشتیبانی می‌کند.

DBMS_DEVELOPER تنها یک تابع به نام GET_METADATA دارد:

SQL> DESC DBMS_DEVELOPER
FUNCTION GET_METADATA RETURNS JSON
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 NAME                           VARCHAR2                IN
 SCHEMA                         VARCHAR2                IN     DEFAULT
 OBJECT_TYPE                    VARCHAR2                IN     DEFAULT
 LEVEL                          VARCHAR2                IN     DEFAULT
 ETAG                           RAW                     IN     DEFAULT

این تابع خروجی را در سه سطح ارائه می‌دهد:

  • Basic: فقط اطلاعات پایه‌ای درباره شیء را برمی‌گرداند.

  • Typical: اطلاعات جزئی‌تر درباره شیء را برمی‌گرداند.

  • All: تمام جزئیات موجود درباره شیء را ارائه می‌دهد.

سطح خروجی را می‌توان با استفاده از آرگومان LEVEL مشخص کرد.

 

نمونه‌های استفاده

نمونه‌های زیر به درک بهتر عملکرد این پکیج کمک می‌کنند.

مثال ۱: بازیابی متادیتای یک جدول (سطح Basic)

SQL> select DBMS_DEVELOPER.GET_METADATA (schema =>'VAHID' ,name =>'TB1' ,object_type =>'TABLE' ,level=>'BASIC' ) METADATA;
METADATA
--------------------------------------------------------------------------------
{"objectType":"TABLE","objectInfo":{"name":"TB1","schema":"VAHID","columns":[{"n

همان‌طور که مشاهده می‌کنید، خروجی کامل نیست. می‌توانیم از تابع JSON_SERIALIZE برای نمایش خروجی کامل استفاده کنیم.

مثال ۲: استفاده از JSON_SERIALIZE برای قالب‌بندی خروجی

SQL>  select JSON_SERIALIZE(DBMS_DEVELOPER.GET_METADATA (schema =>'VAHID' ,name =>'TB1' ,object_type =>'TABLE' ,level=>'BASIC' )) METADATA;
METADATA
-----------------------------------------------------
{"objectType":"TABLE","objectInfo":{"name":"TB1","schema":"VAHID","columns":[{"name":"ID","notNull":true,"dataType":{"type":"NUMBER"}},{"name":"NAME","default":"'Vahid'\n","notNull":true,"dataType":{"type":"VARCHAR2","length":100,"sizeUnits":"BYTE"}},{"name":"LAST_NAME","notNull":false,"dataType":{"type":"VARCHAR2","length":100,"sizeUnits":"BYTE"}}]},"etag":"E8012E8ED81678A603CE5D926BCE3F30"}

مثال ۳: زیبا‌سازی خروجی JSON

SQL>  select JSON_SERIALIZE(DBMS_DEVELOPER.GET_METADATA (schema =>'VAHID' ,name =>'TB1' ,object_type =>'TABLE' ,level=>'BASIC' )pretty ) METADATA;
METADATA
-----------------------------------------------------

{
  "objectType" : "TABLE",
  "objectInfo" :
  {
    "name" : "TB1",
    "schema" : "VAHID",
    "columns" :
    [
      {
        "name" : "ID",
        "notNull" : true,
        "dataType" :
        {

          "type" : "NUMBER"
        }
      },
      {
        "name" : "NAME",
        "default" : "'Vahid'\n",
        "notNull" : true,
        "dataType" :
        {
          "type" : "VARCHAR2",
          "length" : 100,
          "sizeUnits" : "BYTE"
        }

      },
      {
        "name" : "LAST_NAME",
        "notNull" : false,
        "dataType" :
        {
          "type" : "VARCHAR2",
          "length" : 100,
          "sizeUnits" : "BYTE"
        }
      }
    ]
  },
  "etag" : "E8012E8ED81678A603CE5D926BCE3F30"
}

مثال ۴: بازیابی متادیتا در سطح ALL

SQL> select JSON_SERIALIZE(DBMS_DEVELOPER.GET_METADATA (schema =>'VAHID' ,name =>'TB1' ,object_type =>'TABLE' ,level=>'ALL' )pretty ) METADATA;
METADATA
-----------------------------------------------------
{
  "objectType" : "TABLE",
  "objectInfo" :
  {
    "name" : "TB1",
    "schema" : "VAHID",
    "columns" :
    [
      {
        "name" : "ID",
        "notNull" : true,
        "dataType" :
        {

          "type" : "NUMBER"
        },
        "isPk" : true,
        "isUk" : true,
        "isFk" : false,
        "hiddenColumn" : false
      },
      {
        "name" : "NAME",
        "default" : "'Vahid'\n",
        "notNull" : true,
        "dataType" :
        {

          "type" : "VARCHAR2",
          "length" : 100,
          "sizeUnits" : "BYTE"
        },
        "isPk" : false,
        "isUk" : false,
        "isFk" : false,
        "hiddenColumn" : false
      },
      {
        "name" : "LAST_NAME",
        "notNull" : false,
        "dataType" :

        {
          "type" : "VARCHAR2",
          "length" : 100,
          "sizeUnits" : "BYTE"
        },
        "isPk" : false,
        "isUk" : false,
        "isFk" : false,
        "hiddenColumn" : false
      }
    ],
    "hasBeenAnalyzed" : false,
    "indexes" :

    [
      {
        "name" : "SYS_C008430",
        "indexType" : "NORMAL",
        "uniqueness" : "UNIQUE",
        "status" : "VALID",
        "hasBeenAnalyzed" : false,
        "columns" :
        [
          {
            "name" : "ID"
          }
        ],

        "compression" : "DISABLED",
        "segmentCreated" : "NO",
        "visiblilty" : "VISIBLE",
        "toBeDropped" : false
      }
    ],
    "constraints" :
    [
      {
        "name" : "SYS_C008429",
        "constraintType" : "CHECK - NOT NULL",
        "searchCondition" : "\"NAME\" IS NOT NULL",
        "columns" :

        [
          {
            "name" : "NAME"
          }
        ],
        "status" : "ENABLE",
        "deferrable" : false,
        "validated" : "VALIDATED",
        "sysGeneratedName" : true
      },
      {
        "name" : "SYS_C008430",
        "constraintType" : "PRIMARY KEY",
        "columns" :
        [
          {
            "name" : "ID"
          }
        ],
        "status" : "ENABLE",
        "deferrable" : false,
        "validated" : "VALIDATED",
        "sysGeneratedName" : true
      }
    ],
    "segmentCreated" : "NO",

    "inMemory" : "DISABLED",
    "compression" : "DISABLED"
  },
  "etag" : "C478C48865258F4DD166DC1319195A4C"
}

ردیابی تغییرات با ETAG

تابع DBMS_DEVELOPER.GET_METADATA یک آرگومان دیگر به نام ETAG دارد. این پارامتر یک شناسه منحصربه‌فرد است که به سند متادیتا اختصاص داده می‌شود. اگر خروجی آخر را بررسی کنید، مقدار ETAG را مشاهده خواهید کرد:

"etag" : "C478C48865258F4DD166DC1319195A4C"

اگر این کوئری را دوباره اجرا کنید، مقدار ETAG تغییر نخواهد کرد، مگر اینکه متادیتا توسط شخصی تغییر کرده باشد. اگر ETAG با نسخه فعلی مطابقت داشته باشد، تابع GET_METADATA یک سند خالی را برمی‌گرداند.

مثال ۵: استفاده از ETAG برای تشخیص تغییرات

SQL> select JSON_SERIALIZE(DBMS_DEVELOPER.GET_METADATA (schema =>'VAHID' ,name =>'TB1' ,object_type =>'TABLE' ,level=>'ALL',  etag=> 'C478C48865258F4DD166DC1319195A4C' )pretty ) METADATA;
METADATA
-----------------------
{
}

در ادامع ستونی از TB1 حذف کرده و کوئری را دوباره اجرا می‌کنیم:

SQL> alter table vahid.TB1 drop column last_name;
Table altered.

مثال ۶: تغییر یک جدول و بررسی ETAG

SQL> select JSON_SERIALIZE(DBMS_DEVELOPER.GET_METADATA (schema =>'VAHID' ,name =>'TB1' ,object_type =>'TABLE' ,level=>'ALL',  etag=> 'C478C48865258F4DD166DC1319195A4C' )pretty ) 
METADATA;
METADATA
-----------------------
{
  "objectType" : "TABLE",
  "objectInfo" :
  {
    "name" : "TB1",
    "schema" : "VAHID",
….
    "compression" : "DISABLED"
  },
  "etag" : "0BFA3ACD50E33DD69F7E68897C70A7E9"
}

مقدار ETAG در خروجی JSON تغییر را منعکس می‌کند و به‌ این‌ ترتیب، بروزرسانی متادیتا تأیید می‌شود.

 

نتیجه‌گیری

پکیج DBMS_DEVELOPER در نسخه Oracle 23.7 معرفی شد و متادیتا را در قالب JSON تولید می‌کند. این پکیج تنها از TABLE (جدول)، INDEX (ایندکس) و VIEW (ویو) پشتیبانی می‌کند. تابع GET_METADATA خروجی را در سطوح BASIC، TYPICAL و ALL ارائه می‌دهد. پارامتر ETAG نیز به ردیابی تغییرات در متادیتای اشیا کمک می‌کند.

ارائه خدمات مشاوره ، پشتیبانی و نصب و راه اندازی پایگاه داده اوراکل در سراسر کشور...................... تلفن: 09128110897 ایمیل:vahidusefzadeh@gmail.com

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *