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 دارد:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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
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
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)

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SQL> select DBMS_DEVELOPER.GET_METADATA (schema =>'VAHID' ,name =>'TB1' ,object_type =>'TABLE' ,level=>'BASIC' ) METADATA;
SQL> select DBMS_DEVELOPER.GET_METADATA (schema =>'VAHID' ,name =>'TB1' ,object_type =>'TABLE' ,level=>'BASIC' ) METADATA;
SQL> select DBMS_DEVELOPER.GET_METADATA (schema =>'VAHID' ,name =>'TB1' ,object_type =>'TABLE' ,level=>'BASIC' ) METADATA;
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
METADATA
--------------------------------------------------------------------------------
{"objectType":"TABLE","objectInfo":{"name":"TB1","schema":"VAHID","columns":[{"n
METADATA -------------------------------------------------------------------------------- {"objectType":"TABLE","objectInfo":{"name":"TB1","schema":"VAHID","columns":[{"n
METADATA
--------------------------------------------------------------------------------
{"objectType":"TABLE","objectInfo":{"name":"TB1","schema":"VAHID","columns":[{"n

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

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SQL> select JSON_SERIALIZE(DBMS_DEVELOPER.GET_METADATA (schema =>'VAHID' ,name =>'TB1' ,object_type =>'TABLE' ,level=>'BASIC' )) METADATA;
SQL> select JSON_SERIALIZE(DBMS_DEVELOPER.GET_METADATA (schema =>'VAHID' ,name =>'TB1' ,object_type =>'TABLE' ,level=>'BASIC' )) METADATA;
SQL>  select JSON_SERIALIZE(DBMS_DEVELOPER.GET_METADATA (schema =>'VAHID' ,name =>'TB1' ,object_type =>'TABLE' ,level=>'BASIC' )) METADATA;
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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"}
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"}
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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SQL> select JSON_SERIALIZE(DBMS_DEVELOPER.GET_METADATA (schema =>'VAHID' ,name =>'TB1' ,object_type =>'TABLE' ,level=>'BASIC' )pretty ) METADATA;
SQL> select JSON_SERIALIZE(DBMS_DEVELOPER.GET_METADATA (schema =>'VAHID' ,name =>'TB1' ,object_type =>'TABLE' ,level=>'BASIC' )pretty ) METADATA;
SQL>  select JSON_SERIALIZE(DBMS_DEVELOPER.GET_METADATA (schema =>'VAHID' ,name =>'TB1' ,object_type =>'TABLE' ,level=>'BASIC' )pretty ) METADATA;
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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"
}
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" }
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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SQL> select JSON_SERIALIZE(DBMS_DEVELOPER.GET_METADATA (schema =>'VAHID' ,name =>'TB1' ,object_type =>'TABLE' ,level=>'ALL' )pretty ) METADATA;
SQL> select JSON_SERIALIZE(DBMS_DEVELOPER.GET_METADATA (schema =>'VAHID' ,name =>'TB1' ,object_type =>'TABLE' ,level=>'ALL' )pretty ) METADATA;
SQL> select JSON_SERIALIZE(DBMS_DEVELOPER.GET_METADATA (schema =>'VAHID' ,name =>'TB1' ,object_type =>'TABLE' ,level=>'ALL' )pretty ) METADATA;
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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"
}
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" }
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 را مشاهده خواهید کرد:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
"etag" : "C478C48865258F4DD166DC1319195A4C"
"etag" : "C478C48865258F4DD166DC1319195A4C"
"etag" : "C478C48865258F4DD166DC1319195A4C"

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

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SQL> select JSON_SERIALIZE(DBMS_DEVELOPER.GET_METADATA (schema =>'VAHID' ,name =>'TB1' ,object_type =>'TABLE' ,level=>'ALL', etag=> 'C478C48865258F4DD166DC1319195A4C' )pretty ) METADATA;
SQL> select JSON_SERIALIZE(DBMS_DEVELOPER.GET_METADATA (schema =>'VAHID' ,name =>'TB1' ,object_type =>'TABLE' ,level=>'ALL', etag=> 'C478C48865258F4DD166DC1319195A4C' )pretty ) METADATA;
SQL> select JSON_SERIALIZE(DBMS_DEVELOPER.GET_METADATA (schema =>'VAHID' ,name =>'TB1' ,object_type =>'TABLE' ,level=>'ALL',  etag=> 'C478C48865258F4DD166DC1319195A4C' )pretty ) METADATA;
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
METADATA
-----------------------
{
}
METADATA ----------------------- { }
METADATA
-----------------------
{
}

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SQL> alter table vahid.TB1 drop column last_name;
Table altered.
SQL> alter table vahid.TB1 drop column last_name; Table altered.
SQL> alter table vahid.TB1 drop column last_name;
Table altered.

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SQL> select JSON_SERIALIZE(DBMS_DEVELOPER.GET_METADATA (schema =>'VAHID' ,name =>'TB1' ,object_type =>'TABLE' ,level=>'ALL', etag=> 'C478C48865258F4DD166DC1319195A4C' )pretty )
SQL> select JSON_SERIALIZE(DBMS_DEVELOPER.GET_METADATA (schema =>'VAHID' ,name =>'TB1' ,object_type =>'TABLE' ,level=>'ALL', etag=> 'C478C48865258F4DD166DC1319195A4C' )pretty )
SQL> select JSON_SERIALIZE(DBMS_DEVELOPER.GET_METADATA (schema =>'VAHID' ,name =>'TB1' ,object_type =>'TABLE' ,level=>'ALL',  etag=> 'C478C48865258F4DD166DC1319195A4C' )pretty ) 
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
METADATA;
METADATA
-----------------------
{
"objectType" : "TABLE",
"objectInfo" :
{
"name" : "TB1",
"schema" : "VAHID",
….
"compression" : "DISABLED"
},
"etag" : "0BFA3ACD50E33DD69F7E68897C70A7E9"
}
METADATA; METADATA ----------------------- { "objectType" : "TABLE", "objectInfo" : { "name" : "TB1", "schema" : "VAHID", …. "compression" : "DISABLED" }, "etag" : "0BFA3ACD50E33DD69F7E68897C70A7E9" }
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

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

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