دليل Validatar

سكربتات استيراد البيانات الوصفية — قوالب SQL

Metadata Ingestion Scripts SQL Templates

شرح لآلية استيراد البيانات الوصفية في قوالب SQL عبر ثلاثة مستويات: المخططات والجداول والأعمدة، مع أمثلة عملية لعدة منصات.

لوحة المتابعة

نظرة عامة

استيراد البيانات الوصفية (Metadata Ingestion) هو عملية اكتشاف ما بداخل مصدر البيانات — المخططات (schemas) والجداول والعروض (views) والأعمدة التي تشكل بنيته. بالنسبة لقوالب مصادر البيانات المبنية على SQL، يعتمد هذا الاكتشاف على سكربتات SQL تستعلم عن أدلة النظام (system catalogs) الخاصة بالمنصة، مثل عروض INFORMATION_SCHEMA أو جداول البيانات الوصفية الخاصة بالمنصة. يحدد القالب السكربتات الافتراضية لكل مستوى من مستويات البيانات الوصفية، وترث مصادر البيانات الفردية هذه الإعدادات الافتراضية مع الاحتفاظ بخيار التخصيص.

تتناول هذه المقالة استيراد البيانات الوصفية لقوالب فئة Database (SQL Server، PostgreSQL، Snowflake، Redshift، BigQuery، وغيرها). أما القوالب المبنية على Python، فراجع مقالة Metadata Ingestion Scripts — Python Templates.

تبويب Metadata Ingestion

افتح أي قالب مبني على SQL وانتقل إلى تبويب Metadata Ingestion. سترى تبويبات فرعية لكل مستوى من مستويات الاستيراد:

مستويات الاستيراد الثلاثة

تنظّم قوالب SQL استيراد البيانات الوصفية في ثلاثة مستويات، لكل منها سكربته الخاص. تُنفَّذ السكربتات بالترتيب أثناء عملية الاستيراد: المخططات أولًا، ثم الجداول، ثم الأعمدة.

شكل 1: مستويات الاستيراد الثلاثة

مستوى المخطط (Schema Level)

يكتشف السكربت على مستوى المخطط جميع المخططات (أو قواعد البيانات، حسب المنصة) في مصدر البيانات. يعيد مجموعة نتائج يمثل كل صف فيها مخططًا واحدًا.

الأعمدة المتوقعة في مجموعة النتائج:

ColumnRequiredDescription
schema_nameYesاسم المخطط

مثال — SQL Server:

SELECT
    s.name AS schema_name
FROM sys.schemas s
WHERE s.schema_id NOT IN (3, 4)         -- Exclude system schemas
  AND s.name NOT IN ('guest', 'INFORMATION_SCHEMA', 'sys')
ORDER BY s.name;

مثال — Snowflake:

SELECT
    SCHEMA_NAME AS schema_name
FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME NOT IN ('INFORMATION_SCHEMA')
ORDER BY SCHEMA_NAME;

مثال — PostgreSQL:

SELECT
    schema_name
FROM information_schema.schemata
WHERE schema_name NOT LIKE 'pg_%'
  AND schema_name != 'information_schema'
ORDER BY schema_name;

مستوى الجدول (Table Level)

يكتشف السكربت على مستوى الجدول جميع الجداول والعروض (views) ضمن المخططات التي اكتشفها سكربت مستوى المخطط. يمثل كل صف في مجموعة النتائج جدولًا أو عرضًا واحدًا.

الأعمدة المتوقعة في مجموعة النتائج:

ColumnRequiredDescription
schema_nameYesالمخطط الذي ينتمي إليه هذا الجدول
table_nameYesاسم الجدول أو العرض
table_typeYesالنوع: TABLE أو VIEW أو نوع خاص بالمنصة

مثال — SQL Server:

SELECT
    s.name AS schema_name,
    t.name AS table_name,
    CASE WHEN t.type = 'U' THEN 'TABLE'
         WHEN t.type = 'V' THEN 'VIEW'
    ELSE t.type
    END AS table_type
FROM sys.objects t
INNER JOIN sys.schemas s ON t.schema_id = s.schema_id
WHERE t.type IN ('U', 'V')
  AND s.name NOT IN ('guest', 'INFORMATION_SCHEMA', 'sys')
ORDER BY s.name, t.name;

مثال — Snowflake:

SELECT
    TABLE_SCHEMA AS schema_name,
    TABLE_NAME AS table_name,
    TABLE_TYPE AS table_type
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA NOT IN ('INFORMATION_SCHEMA')
ORDER BY TABLE_SCHEMA, TABLE_NAME;

مستوى العمود (Column Level)

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

الأعمدة المتوقعة في مجموعة النتائج:

ColumnRequiredDescription
schema_nameYesالمخطط
table_nameYesالجدول
column_nameYesاسم العمود
data_typeYesنوع البيانات (يجب أن يطابق تعيينًا في تبويب Data Types)
ordinal_positionNoترتيب العمود ضمن الجدول
is_nullableNoهل يسمح العمود بالقيم الفارغة (YES / NO)
character_maximum_lengthNoالحد الأقصى للطول بالنسبة لأعمدة النصوص
numeric_precisionNoالدقة بالنسبة للأعمدة الرقمية
numeric_scaleNoالمقياس بالنسبة للأعمدة الرقمية

مثال — SQL Server:

SELECT
    s.name AS schema_name,
    o.name AS table_name,
    c.name AS column_name,
    t.name AS data_type,
    c.column_id AS ordinal_position,
    CASE WHEN c.is_nullable = 1 THEN 'YES' ELSE 'NO' END AS is_nullable,
    c.max_length AS character_maximum_length,
    c.precision AS numeric_precision,
    c.scale AS numeric_scale
FROM sys.columns c
INNER JOIN sys.objects o ON c.object_id = o.object_id
INNER JOIN sys.schemas s ON o.schema_id = s.schema_id
INNER JOIN sys.types t ON c.user_type_id = t.user_type_id
WHERE o.type IN ('U', 'V')
  AND s.name NOT IN ('guest', 'INFORMATION_SCHEMA', 'sys')
ORDER BY s.name, o.name, c.column_id;

كيف تعمل الإعدادات الافتراضية والتجاوزات

السكربتات المحددة في القالب هي إعدادات افتراضية توفر نقطة انطلاق تناسب معظم مصادر البيانات على المنصة. يعمل نموذج الوراثة كالتالي:

  1. 1يحدد القالب السكربتات الافتراضية لمستويات المخطط والجدول والعمود
  2. 2عند إنشاء مصدر بيانات باتصال يستخدم هذا القالب، يرث تلك السكربتات الافتراضية
  3. 3في صفحة Schema Metadata الخاصة بمصدر البيانات، يمكن للمسؤول عرض السكربتات النشطة، واختياريًا تجاوز أي مستوى بكود SQL مخصص
  4. 4تُخزَّن التجاوزات على مستوى مصدر البيانات، وليس على القالب — تبقى الإعدادات الافتراضية للقالب دون تغيير

يعني هذا أنه يمكنك امتلاك قالب Snowflake واحد يعمل مع معظم قواعد البيانات، مع تخصيص سكربت مستوى المخطط لمصدر بيانات معين يستخدم اصطلاح تسمية غير قياسي للمخططات.

نصيحة

لمعرفة ما إذا كان مصدر البيانات يستخدم الإعداد الافتراضي للقالب أو نسخة مخصصة، انتقل إلى صفحة Schema Metadata الخاصة بمصدر البيانات وانقر على Configure Ingestion SQL. إذا تطابق السكربت مع الإعداد الافتراضي للقالب، فإن مصدر البيانات يستخدم النسخة الموروثة.

تدفق تنفيذ الاستيراد

عندما يبدأ المستخدم عملية استيراد البيانات الوصفية (يدويًا عبر Refresh Now أو عبر جدولة)، يحدث ما يلي:

  1. 1يُنفَّذ سكربت المخطط مقابل اتصال البيانات الوصفية — ويعيد قائمة المخططات
  2. 2يُنفَّذ سكربت الجدول — ويعيد جميع الجداول والعروض عبر المخططات المكتشفة
  3. 3يُنفَّذ سكربت العمود — ويعيد جميع الأعمدة مع أنواع البيانات وخصائصها
  4. 4يعالج Validatar النتائج بمقارنتها مع البيانات الوصفية الحالية: تُضاف المخططات والجداول والأعمدة الجديدة إلى الدليل، وتُعلَّم الكائنات المحذوفة كمحذوفة (دون إزالة فعلية، للحفاظ على السجل التاريخي)، وتُحدَّث الخصائص المتغيرة (أنواع البيانات، القابلية للقيم الفارغة)
  5. 5تُسجَّل الإحصاءات — عدد المخططات وعدد الجداول وعدد الأعمدة والمدة

قد يكون اتصال البيانات الوصفية هو نفسه الاتصال الأساسي أو اتصالًا منفصلاً بصلاحية قراءة فقط لأدلة النظام. يُضبط هذا في صفحة Schema Metadata الخاصة بمصدر البيانات.

نصائح لكتابة سكربتات استيراد مخصصة

مطابقة أسماء الأعمدة المتوقعة

يتوقع Validatar أسماء أعمدة محددة في مجموعة النتائج. إذا أعاد سكربتك SchemaName بدلاً من schema_name، فلن تُعالَج النتائج بشكل صحيح. احرص دائمًا على تسمية أعمدتك (alias) لتطابق الأسماء المتوقعة.

تصفية كائنات النظام

تحتوي معظم المنصات على مخططات وجداول وعروض نظامية غير ذات صلة باختبار جودة البيانات. صفِّها في سكربتاتك للحفاظ على نظافة الدليل:

  • SQL Server: استبعاد مخططات sys وINFORMATION_SCHEMA وguest
  • Snowflake: استبعاد مخطط INFORMATION_SCHEMA
  • PostgreSQL: استبعاد مخططات pg_* ومخطط information_schema

مراعاة الأداء

يمكن أن يكون الاستيراد على مستوى العمود بطيئًا في قواعد البيانات الكبيرة التي تحتوي على آلاف الجداول. ضع في اعتبارك:

  • استخدام عروض أدلة النظام المُحسّنة لاستعلامات البيانات الوصفية (مثل sys.columns في SQL Server أسرع من INFORMATION_SCHEMA.COLUMNS في قواعد البيانات الكبيرة)
  • إضافة عوامل تصفية للمخططات إذا كنت بحاجة إلى البيانات الوصفية لمخططات معينة فقط
  • تشغيل الاستيراد خلال ساعات الذروة المنخفضة لقواعد بيانات الإنتاج

يجب أن تتطابق أسماء أنواع البيانات

يجب أن يطابق عمود data_type الذي يعيده سكربت مستوى العمود أسماء أنواع المحرك المحددة تمامًا في تبويب Data Types الخاص بالقالب. إذا أعاد سكربت الاستيراد character varying بينما يحتوي تبويب Data Types فقط على varchar، فلن تُصنَّف تلك الأعمدة بشكل صحيح.

الاختبار على مصدر بيانات واحد أولًا

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

كيف يندرج هذا ضمن الصورة الأكبر

يُعد استيراد البيانات الوصفية الخطوة التشغيلية الأولى بعد ضبط القالب. تملأ البيانات الوصفية المكتشفة دليل بيانات Validatar، والذي بدوره يدفع:

  • التنميط (Profiling) — تحتاج مجموعات التنميط لمعرفة الجداول والأعمدة الموجودة (راجع مقالة Profiling Configuration — SQL Templates)
  • توصيات الاختبار — يقترح Validatar اختبارات بناءً على بنية البيانات الوصفية وأنواع البيانات
  • تجسيد اختبارات القالب — تستخدم اختبارات القالب البيانات الوصفية لتوليد اختبارات فرعية للبنى المطابقة
  • الماكرو — تُملأ معاملات الماكرو مثل قوائم Schema وTable وColumn المنسدلة من البيانات الوصفية المستوردة (راجع مقالة Macros)

للاطلاع على الصورة الشاملة من البداية للنهاية، راجع مقالة Data Source Templates: The Complete Picture.