وظائف لتوثيق قواعد بيانات PostgreSQL. الجزء الأول

أثناء العمل مع PostgreSQL ، تراكمت أكثر من مائة وظيفة للعمل مع دلائل النظام: pg_class ، pg_attribute ، pg_constictions ، إلخ.


ماذا تفعل معهم؟ نادرا ما يتم استخدامها نسبيا. تضمين في أي مشروع؟ ولن يدفع زبون كراسنويارسك ثمن هذا "الهراء". ومع ذلك ، ماذا لو كانت مفيدة لشخص آخر غير المؤلف. وقرر وضعها ، مثل قراءة الكتب ، في خزانة عامة لأولئك الذين يرغبون.

شخص ما يريد استخدامها في عملهم. وشخص مهتم بخلاف تجربته مع كتالوجات النظام.

ولكن لكي لا نحول المنشور إلى تعداد ممل ، من غير المعروف سبب إنشاء الوظائف ، قررت أن أتحدث عن تلك التي يمكن توحيدها بهدف مشترك. لذلك ، يتم تحديد الدالات المستخدمة لعرض قائمة موسعة بخصائص جدول قاعدة البيانات العشوائية.

يتم إرجاع القائمة الموسعة لخصائص جدول قاعدة البيانات بواسطة الدالة admtf_Table_ComplexFeatures ، والتي ستسمى دالة الرأس في هذه المقالة. وبالتالي ، ستقتصر المقالة على النظر في الوظائف التي يتم استدعاؤها في عملية تنفيذ وظيفة الرأس.

يقدم النصف الأول من المقالة تعليقات على تنفيذ الوظائف. والثاني هو رمز المصدر للوظائف. بالنسبة للقراء المهتمين فقط بالنصوص المصدر ، نقترح المتابعة الفورية للملحق .

انظر أيضًا
وظائف لتوثيق قواعد بيانات PostgreSQL. الجزء الثاني ؛
وظائف لتوثيق قواعد بيانات PostgreSQL. الجزء الثالث .
وظائف لتوثيق قواعد بيانات PostgreSQL. النهاية (الجزء الرابع) .




ما الميزات المتقدمة التي نتحدث عنها؟


للحصول على فكرة عن المقصود بالخصائص الموسعة لجدول قاعدة البيانات ، نبدأ بالنظر في قائمة الخصائص التالية. تحتوي القائمة على خصائص جدول قاعدة بيانات الشارع التي تم إرجاعها بواسطة admtf_Table_ComplexFeatures ( "public" ، "street" ) .

يحتوي الجدول أدناه على قائمة مختصرة بميزات جدول الشارع. ترد مجموعة كاملة من خصائص هذا الجدول في المواد التكميلية للملحق 2.

الجدول 1. الميزات المتقدمة لجدول الشارع.

نسخة النص من الجدول في الشكل
الفئةلا.العنوانتعليقاكتبالنوع الأساسي؟؟؟ ليست فارغة
tbl0الشارعقائمة الشوارع في المستوطنات
att1wcrccodeكود البلدwcrccodeسمالنتر
att2محليةهوية المجتمعمحليةعدد صحيحر
att3streetidشارع الهوية بالقريةstreetidسمالنتر
att4streettypeacrmاختصار الشارعstreettypeacrmشخصية (8)و
att5اسم الشارعاسم الشارعstreettypeacrmفاركار (150)ر
ص0xpkstreetمفتاح أساسي لشارع الشارع
pkatt1wcrccodeكود البلدwcrccodeسمالنتر
fk011fk_street_localityجدول مفتاح خارجي
fk022fk_street_streettypeجدول مفتاح خارجي
idx011xie1streetفهرس حسب نوع واسم شارع المستوطنة
idx022xie2streetالرمز البريدي
idx033xie3streetفهرس أسماء الشوارع لجميع المستوطنات
idx044xpkstreetالفهرس الفريد (المفتاح الأساسي) لجدول الشارع


تعداد العداء لهذه المجموعة من الحروف والأرقام ، يمكنك أن ترى أننا نتحدث عن الخصائص المعتادة لجدول قاعدة البيانات:


  • أسماء الجداول ؛
  • قائمة سمات الجدول وأنواعها ؛
  • المفتاح الأساسي وقائمة المفاتيح الخارجية للجدول ، مع سمات الجدول التي يتكون منها ؛
  • قائمة فهارس الجدول.

يتم ضمان تفرد كل إدخال من قائمة الخصائص من خلال قيم حقول "الفئة" والرقم التسلسلي ("رقم") للسمة.



الجدول 2. فئات خصائص الجدول.

نسخة النص من الجدول في الشكل
اختصارالتعيين
السلخصائص الجدول
attخصائص سمة الجدول
ما يليخصائص التسلسل
صالميزات الرئيسية الأساسية
pkAttخصائص السمة الرئيسية الأولية
fk99الميزات الرئيسية الأجنبية
fk99attخصائص السمة الرئيسية الخارجية
fk99rtblخصائص الجدول المشار إليه بواسطة المفتاح الخارجي
fk99rattخصائص السمة للجدول المشار إليه بواسطة المفتاح الخارجي
Idx99خصائص الفهرس
Idx99attخصائص سمة الفهرس
Inhtbl99خصائص الجدول المولد


قيمة الفئة ضرورية من أجل التمييز بين مجموعات الخصائص المختلفة عن بعضها البعض. رقم مسلسل ، من أجل تمييز الخصائص داخل المجموعة.


يمكن الإعلان عن العديد من المفاتيح الخارجية (FOREIGN KEY) والفهارس في جدول قاعدة البيانات. لذلك ، تحتوي قيمة الفئة لهذه الخصائص ونسلها على رقم تسلسلي. على سبيل المثال ، يشير الإدخال بالمفتاح "الفئة" = idx02att و "لا" = 1 إلى السمة الأولى للفهرس الثاني.


في قائمة الفئات أعلاه ، يشار إلى موقع الرقم التسلسلي باسم "99".


الملاحظة 1



كود المصدر للعامل في الشكل
SELECT * FROM admtf_Table_ComplexFeatures('pg_catalog','pg_class'); 



تقدم المقالة أمثلة على خصائص الجداول ، والتي تم وصفها بإيجاز في مخطط إضافي تم إنشاؤه خصيصًا لإثبات قدرات الوظائف. لكن القارئ ، بعد أن أنشأ هذه الوظيفة أو تلك في قاعدة بياناته ، يمكنه استخدام أسماء مخططاته وجداوله كمعلمات. علاوة على ذلك ، على سبيل المثال ، يمكن استخدام دليل pg_class كمعلمة ، على الرغم من إصدار عدد محدود من الخصائص في هذه الحالة.

نهاية الملاحظة.



هيكل وظيفة الرأس



التين. 1. الوظائف التي تسبب وظيفة الرأس.

الجدول 3. تعيين الوظائف.

نسخة النص من الجدول في الشكل
لا.العنوانالتعيين
1admtf_Table_Featuresتُرجع الدالة قائمة بخصائص جدول قاعدة البيانات
2admtf_Table_Attributesتقوم الدالة بإرجاع قائمة سمات جدول قاعدة البيانات وخصائصها.
3admtf_Table_Constraintesتقوم الدالة بإرجاع قائمة قيود جدول قاعدة البيانات وخصائصها.
4admtf_Table_Indexesتقوم الدالة بإرجاع قائمة بفهارس جدول قاعدة البيانات وخصائصها.
5admtf_Table_Interitance أطفالتقوم الدالة بإرجاع قائمة الجداول التي تم إنشاؤها بواسطة (IHERITS) من جدول قاعدة البيانات المصدر.
6admtf_Table_Sequencesتعرض الدالة قائمة بالتسلسلات (SEQUENCE) التي يعتمد عليها الجدول.
7admtf_PrimaryKey_ComplexFeaturesتقوم الدالة بإرجاع قائمة كاملة (موسعة) بخصائص المفتاح الأساسي (مفتاح أساسي) لجدول قاعدة البيانات.
8admtf_ForeignKey_ComplexFeaturesتقوم الدالة بإرجاع قائمة كاملة (موسعة) بخصائص المفتاح الخارجي (مفتاح FOREIGN) لجدول قاعدة البيانات.
9admtf_Index_ComplexFeaturesتقوم الدالة بإرجاع قائمة كاملة (موسعة) بخصائص فهرس جدول قاعدة البيانات.
10admtf_Table_ComplexFeaturesتُرجع الدالة قائمة كاملة (موسعة) بخصائص جدول قاعدة البيانات.


الملاحظة 2.


سيتم ترتيب أوصاف الوظائف بالترتيب الموضح أعلاه. والسبب هو أنه يجب تقسيم المقالة إلى عدة أجزاء. ويمكن استخدام الوظائف المرتبة بهذا الترتيب بغض النظر عن حقيقة أن بعضها سيتم وصفه فقط في الأجزاء التالية من المنشور.


نهاية الملاحظة.



قائمة وظائف Admtf_Table_Features لخصائص جدول قاعدة البيانات




تعرض الدالة admtf_Table_Features قائمة بخصائص جدول قاعدة البيانات نفسها. يمكن عرض كود المصدر وتنزيله هنا.


كمعلمات ، تأخذ الدالة اسم الجدول المصدر (a_TableName ) واسم المخطط الذي يتم إنشاء الجدول داخله ( a_SchemaName ).


تستخرج الوظيفة البيانات الرئيسية من إدخال كتالوج pg_class ، الذي يحتوي ، بالإضافة إلى إدخالات الجدول ، أيضًا على السجلات حول التسلسلات والمشاهدات والعروض المادية والأنواع المركبة. لذلك ، لتحديد الجداول ، يتم استخدام الشرط relkind = 'r' .



 SELECT tbl.relname,dsc.description,tbl.relnatts::INTEGER,tbl.relchecks::INTEGER, tbl.relhaspkey,tbl.relhasindex,tbl.relhassubclass,tbl.reltuples::INTEGER FROM pg_class tbl INNER JOIN pg_namespace nspc ON tbl.relnamespace = nspc.oid LEFT OUTER JOIN pg_description dsc ON tbl.oid=dsc.objoid AND dsc.objsubid=0 WHERE LOWER( nspc.nspname)=LOWER(a_SchemaName) AND tbl.relkind='r' AND LOWER(tbl.relname) =LOWER(a_TableName); 

بالإضافة إلى ذلك ، تصل الوظيفة إلى بيانات الدليل pg_namespace و pg_description . يحتوي الأول على أسماء مخططات قاعدة البيانات ، والثاني يحتوي على تعليقات على جميع كائنات قاعدة البيانات.


من المهم الانتباه إلى الحالة objsubid = 0 . وهي تحدد التعليق على الجدول ، حيث أن قيمة الحقل الكامن هي نفسها لكل من الجدول وسماته. يتم تضمين التعليق على سمة الجدول في الإدخال الذي يطابق objsubid عدد هذه السمة.



الجدول 4. نتيجة تنفيذ الوظيفة admtf_Table_Features ("public"، "Street").

العنوانتعليقعدد السماتعدد قيود التحقق؟؟؟ هل هناك مفتاح أساسي؟؟؟ يتم الإعلان عن الفهارس؟؟؟ هل هناك أحفادعدد الإدخالات في الجدول
الشارعقائمة الشوارع في المستوطنات220ررو20150

الملاحظة 3


انتبه إلى عدد سمات جدول الشارع. يختلف بشكل كبير عن عدد السمات المحددة في المخطط المساعد.


الجدول 5. السمات الإضافية لجدول الشارع.


اسمatttypidعنايةملاحظة
cminالتاسع والعشرون-4سمة النظام
xmin28-3سمة النظام
ctid27-1سمة النظام
wcrccode7953691سمة صالحة
محلية7953522سمة صالحة
streetid7953643سمة صالحة
streettypeacrm19191684سمة صالحة
اسم الشارع10435سمة صالحة
........ pg.dropped.6 ........06السمة البعيدة
........ pg.dropped.7 ........07السمة البعيدة

والحقيقة هي أن PostgreSQL ، بالإضافة إلى السمات الرئيسية ، تأخذ في الاعتبار أيضًا العديد من سمات النظام ، وحتى السمات المحذوفة.


ملاحظة ختامية



دالة admtf_Table_Attributes قائمة سمات جدول قاعدة البيانات وخصائصها


تعرض الدالة admtf_Table_Attributes قائمة سمات جدول قاعدة البيانات. يمكن عرض كود المصدر وتنزيله هنا.


كمعلمات ، تأخذ الدالة اسم الجدول المصدر ( a_TableName ) واسم المخطط الذي يتم إنشاء الجدول داخله ( a_SchemaName ).


تستخرج الدالة البيانات الرئيسية من إدخالات الدليل pg_attribute و pg_type . يحتوي الأول على سجلات تحتوي على بيانات حول سمات الجداول والمشاهدات وطرق العرض الملموسة والأنواع المركبة وحتى الوظائف. والثاني هو حول خصائص أنواع السمات.


ربما يلزم بعض التوضيح بالطريقة التي يتم بها تعريف المستخدم وأنواع القاعدة في الوظيفة.


يتم تعريف سمة الجدول بنوع مخصص إذا كان حقل نوع النوع أكبر من 0 في إدخال الدليل pg_type المقابل. وإلا ، تكون السمة من النوع الأساسي. لذلك ، يتم تضمين الدليل pg_type مرتين في جملة FROM. في إدخال الدليل الأول ، يتم تحديد وجود نوع المستخدم ، إذا لم يتم تعريفه ( typbasetype = 0 ) ، ثم يتم إنشاء قيمة نوع أساسي من هذا الإدخال. خلاف ذلك ، يتم تحديد نوع الأساس من السجل الذي btyp.OID = typ.typbasetype.


يتم مباشرة تشكيل الخط مع النوع الأساسي باستخدام وظيفة كتالوج النظام FORMAT_TYPE (type_oid ، typemod) . المعلمة الأولى منها هي سجلات OID من النوع الأساسي. المعلمة الثانية هي قيمة المعدل للأنواع التي تحتوي على حجم. على سبيل المثال ، VARCHAR (100) أو NUMERIC (4،2) ، DECIMAL (4،2). يتم أخذ قيمة معلمة typemod من typ.typtypmod إذا كانت السمة من نوع المستخدم ، وإلا من attr.atttypmod ، أي مباشرة من سجل السمات.



كود المصدر للعامل في الشكل
 SELECT attr.attnum, attr.attname::VARCHAR(100), CASE WHEN COALESCE(typ.typbasetype,0)>0 THEN typ.typname::VARCHAR(100) ELSE '' END, FORMAT_TYPE(COALESCE(NULLIF(typ.typbasetype,0),typ.oid), COALESCE(NULLIF(typ.typtypmod,-1),attr.atttypmod))::VARCHAR(256), attr.attnotnull, dsc.description FROM pg_attribute attr INNER JOIN pg_class tbl ON tbl.oid = attr.attrelid INNER JOIN pg_namespace nspc ON tbl.relnamespace = nspc.oid INNER JOIN pg_type typ ON attr.atttypid=typ.oid LEFT OUTER JOIN pg_description dsc ON dsc.objoid=attr.attrelid AND dsc.objsubid=attr.attnum WHERE LOWER( nspc.nspname)=LOWER(a_SchemaName) AND LOWER(tbl.relname) =LOWER(a_TableName) AND tbl.relkind='r' AND attr.attnum>0 AND attr.atttypID>0 ORDER BY tbl.relname,attr.attnum; 


بالإضافة إلى ذلك ، تصل الوظيفة إلى بيانات الدليل pg_class و pg_namespace و pg_description . يتم استخدام الدللين الأول والثاني للبحث عن السمات حسب أسماء المخطط وجدول قاعدة البيانات.

يتم استخدام الدليل الثالث لاسترداد التعليق لسمة الجدول.


يوجد التعليق على سمة الجدول في الإدخال الذي يحتوي فيه dsc.objoid على OID الخاص بجدول المصدر ، و dsc.objsubid هو الرقم التسلسلي للسمة في الجدول ، أي attr.attnum .


لمنع الوظيفة من إرجاع النظام والسمات البعيدة ، تقوم جملة WHERE بتعيين الشرط attr.attnum> 0 AND attr.atttypID> 0 .



الجدول 6. نتيجة الوظيفة admtf_Table_Attributes ('public'، 'Street').

لا.العنواننوع مخصصالنوع الأساسي؟؟؟ ليست فارغةتعليق
1wcrccodewcrccodeسمالنتركود البلد
2محليةمحليةعدد صحيحرهوية المجتمع
3streetidstreetidسمالنترشارع الهوية بالقرية
4streettypeacrmstreettypeacrmشخصية (8)واختصار الشارع
5اسم الشارعفاركار (150)راسم شارع المستوطنة

إصدار دالة باستخدام الاسم المستعار regclass لنوع oid


معرفات كائن PostgreSQL (OIDs) هي من نفس نوع OID ، والتي يتم تنفيذها حاليًا كعدد صحيح بدون إشارة من أربعة بايت. ولكن نظرًا لوجود أسماء مستعارة من هذا النوع ، يمكن تمثيل العدد الصحيح كاسم كائن. والعكس صحيح - تحويل اسم الكائن إلى عدد صحيح من نوع OID.


كمثال ، ألق نظرة على عبارة SELECT التالية. يسترجع بشكل غير عادي أسماء جدول السمات وأسماء أنواعه - بدلاً من الوصول إلى حقول الدليل المقابلة بأسماء هذه الخصائص ، يتم استخدامها:

  • attrelid :: regclass (attrelid :: regclass: NAME) ،
  • atttypid :: regtype (atttypid :: regtype: NAME)
  • typbasetype :: regtype (typbasetype :: regtype: NAME) .


 SELECT attr.attname,attr.attrelid::regclass, attr.atttypid::regtype, typ.typbasetype::regtype,attr.attrelid::regclass::name, attr.atttypid::regtype::name,typ.typbasetype::regtype::name FROM pg_attribute attr INNER JOIN pg_type typ ON attr.atttypid=typ.oid WHERE attr.attrelid=('public'||'.'||'Street')::regclass AND attr.attnum>0 AND attr.atttypID>0 ORDER BY attr.attnum; 

التالي هو نتيجة تنفيذ هذا الاستعلام.



في قائمة قيم الإخراج لعامل SELECT قبل التحويل باستخدام الأسماء المستعارة من نوع OID ، تكون جميع القيم باستثناء اسم السمة رقمية ، ولكن نتيجة لذلك ، يتم عرض أسماء الجداول وأنواع السمات. يمكن النظر في أنواع قيم الإخراج في السطر الثاني من رأس الجدول.


بالإضافة إلى ذلك ، في جملة WHERE من العبارة ، هناك الشرط attr.attrelid = ('public' || '.' || 'Street') :: regclass ، على الجانب الأيسر منها قيمة رقمية ، وعلى اليمين سلسلة يتم تحويلها إلى رقمية باستخدام الاسم المستعار regclass .



كود المصدر للعامل في الشكل
 SELECT attr.attnum, attr.attname::VARCHAR(100), CASE WHEN COALESCE(typ.typbasetype,0)>0 THEN typ.typname::VARCHAR(100) ELSE '' END, FORMAT_TYPE(COALESCE(NULLIF(typ.typbasetype,0),typ.oid), COALESCE(NULLIF(typ.typtypmod,-1),attr.atttypmod))::VARCHAR(256), attr.attnotnull, dsc.description FROM pg_attribute attr INNER JOIN pg_type typ ON attr.atttypid=typ.oid LEFT OUTER JOIN pg_description dsc ON dsc.objoid=attr.attrelid AND dsc.objsubid=attr.attnum WHERE attr.attrelid=( a_SchemaName ||'.'|| a_TableName)::regclass AND attr.attnum>0 AND attr.atttypID>0 ORDER BY attr.attnum; 


باستخدام الاسم المستعار regclass من العبارة الرئيسية ، يمكنك إزالة الاتصال بدليلين. لكن مثل هذا التحسين لم يكن له أي تأثير تقريبًا على أداء الوظيفة - في كلا الإصدارين ، يتم تنفيذ الوظيفة في 11 مللي ثانية. ربما يرجع ذلك إلى حقيقة أن جدول الاختبار يحتوي على سمات قليلة.
مالحظة 4

يتجلى خلل خطير في الحالة في النموذج attr.attrelid = (a_SchemaName || '.' || a_TableName) :: regclass عندما يكون هناك مخطط و / أو جدول باسم غير معتاد في قاعدة البيانات. على سبيل المثال ، "مخطط بلدي" و / أو "جدول بلدي" . يجب إرسال هذه القيم محاطة بعلامات اقتباس مزدوجة أو استخدام الدالة QUOTE_IDENT ، وإلا ستفشل الوظيفة مع وجود خطأ في النظام.



كود المصدر للعامل في الشكل
 /*       «   »*/ SELECT attr.attname,attr.attrelid::regclass, attr.atttypid::regtype,typ.typbasetype::regtype, attr.attrelid::regclass::name, attr.atttypid::regtype::name,typ.typbasetype::regtype::name FROM pg_attribute attr INNER JOIN pg_type typ ON attr.atttypid=typ.oid WHERE attr.attrelid=(' '||'.'||' ')::regclass AND attr.attnum>0 AND attr.atttypID>0 ORDER BY attr.attnum; /*       */ SELECT attr.attname,attr.attrelid::regclass, attr.atttypid::regtype,typ.typbasetype::regtype, attr.attrelid::regclass::name, attr.atttypid::regtype::name,typ.typbasetype::regtype::name FROM pg_attribute attr INNER JOIN pg_type typ ON attr.atttypid=typ.oid WHERE attr.attrelid=('" "'||'.'||'" "')::regclass AND attr.attnum>0 AND attr.atttypID>0 ORDER BY attr.attnum; 


لذلك ، أفضل استخدام الشروط في النموذج LOWER (nspc.nspname) = LOWER (a_SchemaName) و LOWER (tbl.relname) = LOWER (a_TableName) ، مما لا يؤدي إلى أخطاء في النظام.

ملاحظة ختامية

الملحق 1. النصوص


إنشاء وظيفة admtf_Table_Features


يمكن العثور على التعليقات على رمز مصدر الوظيفة هنا.
رمز مصدر الوظيفة
 BEGIN TRANSACTION; DROP FUNCTION IF EXISTS admtf_Table_Features (a_SchemaName NAME,a_TableName NAME); /********************************************************************************************************/ /*     ,   */ /********************************************************************************************************/ CREATE OR REPLACE FUNCTION admtf_Table_Features (a_SchemaName NAME default 'public', /*     */ a_TableName NAME default NULL /*   */ ) RETURNS TABLE (rs_TableName NAME,rs_TableDescription TEXT,rs_NumberOfAttribute INTEGER,rs_NumberOfChecks INTEGER,rs_hasPKey BOOLEAN,rs_hasIndex BOOLEAN,rs_hasSubClass BOOLEAN,rs_NumberOfRow INTEGER) AS $BODY$ DECLARE c_TableKind CONSTANT CHAR:='r'; v_TableOID OID; /*   */ v_TableName NAME; /*   */ v_TableDescription TEXT; /*   */ v_TableNumberOfRowCalc INTEGER; /*     */ --****************************************************************************************************** BEGIN SELECT INTO rs_TableName,rs_TableDescription,rs_NumberOfAttribute, rs_NumberOfChecks,rs_hasPKey,rs_hasIndex,rs_hasSubClass, rs_NumberOfRow tbl.relname,dsc.description,tbl.relnatts::INTEGER,tbl.relchecks::INTEGER, tbl.relhaspkey,tbl.relhasindex,tbl.relhassubclass,tbl.reltuples::INTEGER FROM pg_class tbl INNER JOIN pg_namespace nspc ON tbl.relnamespace = nspc.oid LEFT OUTER JOIN pg_Description dsc ON tbl.oid=dsc.objoid AND dsc.objsubid=0 WHERE nspc.nspname=LOWER(a_SchemaName) AND tbl.relkind=c_TableKind AND tbl.relname =LOWER(a_TableName); EXECUTE 'SELECT count(*) FROM ' ||LOWER(a_SchemaName) ||'.'||quote_ident(LOWER(a_TableName)) INTO v_TableNumberOfRowCalc; RETURN QUERY SELECT rs_TableName,rs_TableDescription,rs_NumberOfAttribute, rs_NumberOfChecks,rs_hasPKey,rs_hasIndex, rs_hasSubClass,v_TableNumberOfRowCalc AS rs_NumberOfRow; END $BODY$ LANGUAGE plpgsql; COMMENT ON FUNCTION admtf_Table_Features(a_SchemaName NAME,a_TableName NAME) IS '   ,  '; --ROLLBACK TRANSACTION; COMMIT TRANSACTION; BEGIN TRANSACTION; DROP FUNCTION IF EXISTS admtf_Table_Features (a_SchemaName VARCHAR(256),a_TableName VARCHAR(256)); /********************************************************************************************************/ /*     ,   */ /********************************************************************************************************/ CREATE OR REPLACE FUNCTION admtf_Table_Features (a_SchemaName VARCHAR(256) default 'public', /*     */ a_TableName VARCHAR(256) default NULL /*   */ ) RETURNS TABLE (rs_TableName VARCHAR(256),rs_TableDescription TEXT,rs_NumberOfAttribute INTEGER,rs_NumberOfChecks INTEGER,rs_hasPKey BOOLEAN,rs_hasIndex BOOLEAN,rs_hasSubClass BOOLEAN,rs_NumberOfRow INTEGER) AS $BODY$ DECLARE c_TableKind CONSTANT CHAR:='r'; v_TableOID OID; /*   */ v_TableName VARCHAR(256); /*   */ v_TableDescription TEXT; /*   */ v_TableNumberOfRowCalc INTEGER; /*     */ --****************************************************************************************************** BEGIN RETURN QUERY SELECT tf.rs_TableName::VARCHAR(256), tf.rs_TableDescription::TEXT, tf.rs_NumberOfAttribute::INTEGER, tf.rs_NumberOfChecks::INTEGER, tf.rs_hasPKey::BOOLEAN, tf.rs_hasIndex::BOOLEAN, tf.rs_hasSubClass::BOOLEAN, tf.rs_NumberOfRow::INTEGER FROM admtf_Table_Features(a_SchemaName::NAME,a_TableName::NAME) tf; END $BODY$ LANGUAGE plpgsql; COMMENT ON FUNCTION admtf_Table_Features(a_SchemaName VARCHAR(256),a_TableName VARCHAR(256)) IS '   ,  '; --ROLLBACK TRANSACTION; COMMIT TRANSACTION; SELECt * FROM admtf_Table_Features('public'::VARCHAR(256),'Street'::VARCHAR(256)); SELECt * FROM admtf_Table_Features('public':: NAME,'Street'::NAME); 



إنشاء وظيفة admtf_Table_Attributes


يمكن العثور على التعليقات على رمز مصدر الوظيفة هنا.
رمز مصدر الوظيفة
 BEGIN TRANSACTION; DROP FUNCTION IF EXISTS admtf_Table_Attributes (a_SchemaName NAME,a_TableName NAME); /********************************************************************************************************/ /*      */ /********************************************************************************************************/ CREATE OR REPLACE FUNCTION admtf_Table_Attributes (a_SchemaName NAME default 'public', /*     */ a_TableName NAME default NULL /*   */ ) RETURNS TABLE (r_AttributeNumber SMALLINT,r_AttributeName NAME,r_UserTypeName NAME,r_TypeName NAME,r_isNotNULL BOOLEAN, r_Description Text) AS $BODY$ DECLARE c_TableKind CONSTANT CHAR:='r'; v_Scale INTEGER; /*   */ --****************************************************************************************************** BEGIN RETURN QUERY SELECT attr.attnum AS r_AttributeNumber, attr.attname::NAME AS r_AttributeName, CASE WHEN COALESCE(typ.typbasetype,0)>0 THEN typ.typname::NAME ELSE ''::NAME END AS r_UserTypeName, FORMAT_TYPE(COALESCE(NULLIF(typ.typbasetype,0),typ.oid), COALESCE(NULLIF(typ.typtypmod,-1),attr.atttypmod))::NAME AS r_TypeName, attr.attnotnull AS r_isNotNULL, dsc.description AS r_Description FROM pg_attribute attr INNER JOIN pg_class tbl ON tbl.oid = attr.attrelid INNER JOIN pg_namespace nsp ON tbl.relnamespace=nsp.oid LEFT OUTER JOIN pg_type typ ON attr.atttypid=typ.oid LEFT OUTER JOIN pg_type btyp ON typ.typbasetype=btyp.oid LEFT OUTER JOIN pg_description dsc ON dsc.objoid=attr.attrelid AND dsc.objsubid=attr.attnum WHERE LOWER(nsp.nspname)=LOWER(a_SchemaName) AND LOWER(tbl.relname)=LOWER(a_TableName) AND tbl.relkind=c_TableKind AND attr.attnum>0 AND attr.atttypID>0 ORDER BY tbl.relname,attr.attnum; RETURN; END $BODY$ LANGUAGE plpgsql; COMMENT ON FUNCTION admtf_Table_Attributes(a_SchemaName NAME,a_TableName NAME) IS '   '; --ROLLBACK TRANSACTION; COMMIT TRANSACTION; BEGIN TRANSACTION; DROP FUNCTION IF EXISTS admtf_Table_Attributes (a_SchemaName VARCHAR(256),a_TableName VARCHAR(256)); /********************************************************************************************************/ /*      */ /********************************************************************************************************/ CREATE OR REPLACE FUNCTION admtf_Table_Attributes (a_SchemaName VARCHAR(256) default 'public', /*     */ a_TableName VARCHAR(256) default NULL /*   */ ) RETURNS TABLE (r_AttributeNumber SMALLINT,r_AttributeName VARCHAR(256),r_UserTypeName VARCHAR(256),r_TypeName VARCHAR(256),r_isNotNULL BOOLEAN, r_Description Text) AS $BODY$ DECLARE c_TableKind CONSTANT CHAR:='r'; v_Scale INTEGER; /*   */ --****************************************************************************************************** BEGIN RETURN QUERY SELECT ta.r_AttributeNumber::SMALLINT, ta.r_AttributeName::VARCHAR(256), ta.r_UserTypeName::VARCHAR(256), ta.r_TypeName::VARCHAR(256), ta.r_isNotNULL::BOOLEAN, ta.r_Description::TEXT FROM admtf_Table_Attributes(a_SchemaName::NAME,a_TableName::NAME) ta; RETURN; END $BODY$ LANGUAGE plpgsql; COMMENT ON FUNCTION admtf_Table_Attributes(a_SchemaName VARCHAR(256),a_TableName VARCHAR(256)) IS '   '; --ROLLBACK TRANSACTION; COMMIT TRANSACTION; SELECT * FROM admtf_Table_Attributes('public'::VARCHAR(256),'Street'::VARCHAR(256)); SELECT * FROM admtf_Table_Attributes('public'::NAME,'Street'::NAME); 


إنشاء دالة admtf_Table_Attributes باستخدام الاسم المستعار Regclass


يمكن العثور على التعليقات على رمز مصدر الوظيفة هنا.
رمز مصدر الوظيفة
 BEGIN TRANSACTION; DROP FUNCTION IF EXISTS admtf_Table_Attributes (a_SchemaName NAME,a_TableName NAME); /********************************************************************************************************/ /*      */ /********************************************************************************************************/ CREATE OR REPLACE FUNCTION admtf_Table_Attributes (a_SchemaName NAME default 'public', /*     */ a_TableName NAME default NULL /*   */ ) RETURNS TABLE (r_AttributeNumber SMALLINT,r_AttributeName NAME,r_UserTypeName NAME,r_TypeName NAME,r_isNotNULL BOOLEAN, r_Description Text) AS $BODY$ DECLARE c_TableKind CONSTANT CHAR:='r'; v_Scale INTEGER; /*   */ --****************************************************************************************************** BEGIN RETURN QUERY SELECT attr.attnum AS r_AttributeNumber, attr.attname::NAME AS r_AttributeName, CASE WHEN COALESCE(typ.typbasetype,0)>0 THEN typ.typname::NAME ELSE ''::NAME END AS r_UserTypeName, FORMAT_TYPE(COALESCE(NULLIF(typ.typbasetype,0),typ.oid), COALESCE(NULLIF(typ.typtypmod,-1),attr.atttypmod))::NAME AS r_TypeName, attr.attnotnull AS r_isNotNULL, dsc.description AS r_Description FROM pg_attribute attr INNER JOIN pg_type typ ON attr.atttypid=typ.oid LEFT OUTER JOIN pg_type btyp ON typ.typbasetype=btyp.oid LEFT OUTER JOIN pg_description dsc ON dsc.objoid=attr.attrelid AND dsc.objsubid=attr.attnum WHERE attr.attrelid=(LOWER(a_SchemaName)||'.'|| LOWER(a_TableName))::regclass AND attr.attnum>0 AND attr.atttypID>0 ORDER BY attr.attnum; RETURN; END $BODY$ LANGUAGE plpgsql; COMMENT ON FUNCTION admtf_Table_Attributes(a_SchemaName NAME,a_TableName NAME) IS '   '; --ROLLBACK TRANSACTION; COMMIT TRANSACTION; BEGIN TRANSACTION; DROP FUNCTION IF EXISTS admtf_Table_Attributes (a_SchemaName VARCHAR(256),a_TableName VARCHAR(256)); /********************************************************************************************************/ /*      */ /********************************************************************************************************/ CREATE OR REPLACE FUNCTION admtf_Table_Attributes (a_SchemaName VARCHAR(256) default 'public', /*     */ a_TableName VARCHAR(256) default NULL /*   */ ) RETURNS TABLE (r_AttributeNumber SMALLINT,r_AttributeName VARCHAR(256),r_UserTypeName VARCHAR(256),r_TypeName VARCHAR(256),r_isNotNULL BOOLEAN, r_Description Text) AS $BODY$ DECLARE c_TableKind CONSTANT CHAR:='r'; v_Scale INTEGER; /*   */ --****************************************************************************************************** BEGIN RETURN QUERY SELECT ta.r_AttributeNumber::SMALLINT, ta.r_AttributeName::VARCHAR(256), ta.r_UserTypeName::VARCHAR(256), ta.r_TypeName::VARCHAR(256), ta.r_isNotNULL::BOOLEAN, ta.r_Description::TEXT FROM admtf_Table_Attributes(a_SchemaName::NAME,a_TableName::NAME) ta; RETURN; END $BODY$ LANGUAGE plpgsql; COMMENT ON FUNCTION admtf_Table_Attributes(a_SchemaName VARCHAR(256),a_TableName VARCHAR(256)) IS '   '; --ROLLBACK TRANSACTION; COMMIT TRANSACTION; SELECT * FROM admtf_Table_Attributes('public'::VARCHAR(256),'Street'::VARCHAR(256)); SELECT * FROM admtf_Table_Attributes('public'::NAME,'Street'::NAME); 



الملحق 2. مواد إضافية


مخطط قاعدة البيانات المساعدة





  • COUNTRY - مصنف دول العالم - OKSM (تصنيف روسيا الشامل لبلدان العالم) ؛
  • HOUSEADDR - قائمة بأرقام المنازل في شوارع المستوطنات.
  • LCLTYTYPE - دليل أنواع المستوطنات ؛
  • الموقع - قائمة المستوطنات ؛
  • الشارع - قائمة الشوارع في المستوطنات ؛
  • STREETTYPE - دليل أنواع الشوارع ؛
  • الإقليم - قائمة الأقاليم (الجمهوريات والأقاليم والأقاليم والمناطق وما إلى ذلك) ؛
  • TERRITORYTYPE - دليل أنواع الأقاليم.



الميزات المتقدمة لجدول الشارع


يمكن الاطلاع على التعليقات حول مفهوم الميزات المتقدمة للجدول هنا.
الجدول 1. الميزات المتقدمة لجدول الشارع.

نسخة النص من الجدول في الشكل
الفئةلا.العنوانتعليقاكتبالنوع الأساسي؟؟؟ ليست فارغة
tbl0الشارعقائمة الشوارع في المستوطنات
att1wcrccodeكود البلدwcrccodeسمالنتر
att2محليةهوية المجتمعمحليةعدد صحيحر
att3streetidشارع الهوية بالقريةstreetidسمالنتر
att4streettypeacrmاختصار الشارعstreettypeacrmشخصية (8)و
att5اسم الشارعاسم الشارعstreettypeacrmفاركار (150)ر
ص0xpkstreetstreet
pkatt1wcrccodewcrccodesmallintt
pkatt2localityidlocalityidintegert
pkatt3streetidstreetidsmallintt
fk011fk_street_locality
fk01att1wcrccodewcrccodesmallintt
fk01att2localityidlocalityidintegert
fk01rtbl0locality
fk01ratt1wcrccodewcrccodesmallintt
fk01ratt2localityidlocalityidintegert
fk022fk_street_streettype
fk02att1streettypeacrmstreettypeacrmcharacter(8)f
fk02rtbl0streettype
fk02ratt1streettypeacrmstreettypeacrmcharacter(8)t
idx011xie1street
idx01att1wcrccodewcrccodesmallintt
idx01att2localityidlocalityidintegert
idx01att3streettypeacrmstreettypeacrmcharacter(8)f
idx01att4streetnamevarchar(150)t
idx022xie2street
idx02att1wcrccodewcrccodesmallint
idx02att2localityidlocalityidintegert
idx02att3streetnamevarchar(150)t
idx033xie3street
idx03att1streetnamevarchar(150)t
idx044xpkstreet( ) street
idx04att1wcrccodewcrccodesmallintt
idx04att2localityidlocalityidintegert
idx04att3streetidstreetidsmallintt


انظر أيضًا


وظائف لتوثيق قواعد بيانات PostgreSQL. الجزء الثاني ؛
وظائف لتوثيق قواعد بيانات PostgreSQL. الجزء الثالث .
وظائف لتوثيق قواعد بيانات PostgreSQL. النهاية (الجزء الرابع) .

Source: https://habr.com/ru/post/ar415575/


All Articles