الاستعلام عن Cosmos DB باستخدام Synapse SQL

مكتمل

بالإضافة إلى استخدام تجمع Spark، يمكنك أيضا الاستعلام عن حاوية تحليلية Azure Cosmos DB باستخدام تجمع SQL بلا خادم مضمن في Azure Synapse Analytics. للقيام بذلك، يمكنك استخدام الدالة OPENROWSET SQL للاتصال بالخدمة المرتبطة لقاعدة بيانات Azure Cosmos DB.

استخدام OPENROWSET مع مفتاح مصادقة

بشكل افتراضي، تتم مصادقة الوصول إلى حساب Azure Cosmos DB بواسطة مفتاح مصادقة. يمكنك استخدام هذا المفتاح كجزء من سلسلة اتصال في عبارة OPENROWSET للاتصال من خلال خدمة مرتبطة من تجمع SQL، كما هو موضح في المثال التالي:

SELECT *
FROM OPENROWSET(​
    'CosmosDB',
    'Account=my-cosmos-db;Database=my-db;Key=abcd1234....==',
    [my-container]) AS products_data

تلميح

يمكنك العثور على مفتاح أساسي وثانوي لحساب Cosmos DB الخاص بك في صفحة Keys الخاصة به في مدخل Microsoft Azure.

قد تبدو نتائج هذا الاستعلام مثل ما يلي، بما في ذلك بيانات التعريف والحقول المعرفة من التطبيق من العناصر الموجودة في حاوية Azure Cosmos DB:

_rid TS productID productName المعرف _etag
mjMaAL...== 1655414791 123 عنصر واجهة المستخدم 7248f072-11c3-42b1-a368-... 54004b09-0000-2300-...
mjMaAL...== 1655414829 124 Wotsit dc33131c-65c7-421a-a0f7-... 5400ca09-0000-2300-...
mjMaAL...== 1655414835 125 Thingumy ce22351d-78c7-428a-a1h5-... 5400ca09-0000-2300-...
... ... ... ... ... ...

يتم استرداد البيانات من المخزن التحليلي، ولا يؤثر الاستعلام على المخزن التشغيلي.

استخدام OPENROWSET مع بيانات اعتماد

بدلاً من تضمين مفتاح المصادقة في كل استدعاء إلى OPENROWSET، يمكنك تعريف بيانات اعتماد تغلف معلومات المصادقة لحساب Cosmos DB الخاص بك، واستخدام بيانات الاعتماد في الاستعلامات اللاحقة. لإنشاء بيانات اعتماد، استخدم العبارة CREATE CREDENTIAL كما هو موضح في هذا المثال:

 CREATE CREDENTIAL my_credential
 WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
 SECRET = 'abcd1234....==';

مع وجود بيانات الاعتماد في مكانها، يمكنك استخدامها في دالة OPENROWSET مثل هذه:

SELECT *
FROM OPENROWSET(​PROVIDER = 'CosmosDB',
                CONNECTION = 'Account=my-cosmos-db;Database=my-db',
                OBJECT = 'my-container',
                SERVER_CREDENTIAL = 'my_credential'
) AS products_data

مرة أخرى، تتضمن النتائج بيانات التعريف والحقول المعرفة من قبل التطبيق من المخزن التحليلي:

_rid TS productID productName المعرف _etag
mjMaAL...== 1655414791 123 عنصر واجهة المستخدم 7248f072-11c3-42b1-a368-... 54004b09-0000-2300-...
mjMaAL...== 1655414829 124 Wotsit dc33131c-65c7-421a-a0f7-... 5400ca09-0000-2300-...
mjMaAL...== 1655414835 125 Thingumy ce22351d-78c7-428a-a1h5-... 5400ca09-0000-2300-...
... ... ... ... ... ...

تحديد مخطط

يتضمن بناء الجملة OPENROWSET عبارة WITH يمكنك استخدامها لتعريف مخطط لمجموعة الصفوف الناتجة. يمكنك استخدام هذا لتحديد الحقول الفردية وتعيين أنواع البيانات كما هو موضح في المثال التالي:

 SELECT *
 FROM OPENROWSET(​PROVIDER = 'CosmosDB',
                 CONNECTION = 'Account=my-cosmos-db;Database=my-db',
                 OBJECT = 'my-container',
                 SERVER_CREDENTIAL = 'my_credential'
 )
 WITH (
    productID INT,
    productName VARCHAR(20)
 ) AS products_data

في هذه الحالة، بافتراض أن الحقول في المخزن التحليلي تتضمن productID و productName، فإن مجموعة الصفوف الناتجة ستشبه الجدول التالي:

productID productName
123 عنصر واجهة المستخدم
124 Wotsit
125 Thingumy
... ...

يمكنك بالطبع تحديد أسماء أعمدة فردية في العبارة SELECT (على سبيل المثال، SELECT productID, productName ...)، لذلك قد تبدو هذه القدرة على تحديد أعمدة فردية ذات استخدام محدود. ومع ذلك، ضع في اعتبارك الحالات التي تتضمن فيها مستندات JSON المصدر المخزنة في المخزن التشغيلي مستويات متعددة من الحقول، كما هو موضح في المثال التالي:

{
    "productID": 126,
    "productName": "Sprocket",
    "supplier": {
        "supplierName": "Contoso",
        "supplierPhone": "555-123-4567"
    }
    "id": "62588f072-11c3-42b1-a738-...",
    "_rid": "mjMaAL...==",
    ...
}

تدعم العبارة WITH تضمين مسارات JSON صريحة، مما يتيح لك معالجة الحقول المتداخلة وتعيين أسماء مستعارة لأسماء الحقول؛ كما هو موضح في هذا المثال:

 SELECT *
 FROM OPENROWSET(​PROVIDER = 'CosmosDB',
                 CONNECTION = 'Account=my-cosmos-db;Database=my-db',
                 OBJECT = 'my-container',
                 SERVER_CREDENTIAL = 'my_credential'
 )
 WITH (
    ProductNo INT '$.productID',
    ProductName VARCHAR(20) '$.productName',
    Supplier VARCHAR(20) '$.supplier.supplierName',
    SupplierPhoneNo VARCHAR(15) '$.supplier.supplierPhone'
 ) AS products_data

تتضمن نتائج هذا الاستعلام الصف التالي للمنتج 126:

ProductNo ProductName المورد SupplierPhoneNo
126 Sprocket Contoso 555-123-4567

إنشاء طريقة عرض في قاعدة بيانات

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

CREATE DATABASE sales_db
   COLLATE Latin1_General_100_BIN2_UTF8;
 GO;

 USE sales_db;
 GO;

 CREATE VIEW products
 AS
 SELECT *
 FROM OPENROWSET(​PROVIDER = 'CosmosDB',
                 CONNECTION = 'Account=my-cosmos-db;Database=my-db',
                 OBJECT = 'my-container',
                 SERVER_CREDENTIAL = 'my_credential'
 )
 WITH (
    ProductNo INT '$.productID',
    ProductName VARCHAR(20) '$.productName',
    Supplier VARCHAR(20) '$.supplier.supplierName',
    SupplierPhoneNo VARCHAR(15) '$.supplier.supplierPhone'
 ) AS products_data
 GO

تلميح

عند إنشاء قاعدة بيانات تصل إلى البيانات في Cosmos DB، من الأفضل استخدام ترتيب يستند إلى UTF-8 لضمان التوافق مع السلاسل في Cosmos DB.

بعد إنشاء طريقة العرض، يمكن للمستخدمين وتطبيقات العميل الاستعلام عنها مثل أي طريقة عرض أو جدول آخر SQL:

SELECT * FROM products;

اعتبارات تجمعات SQL بلا خادم وAzure Cosmos DB

عند التخطيط لاستخدام تجمع SQL بلا خادم للاستعلام عن البيانات في مخزن تحليلي Azure Cosmos DB، ضع في اعتبارك أفضل الممارسات التالية:

  • توفير التخزين التحليلي ل Azure Cosmos DB وأي تطبيقات عميل (على سبيل المثال Microsoft Power BI) في نفس المنطقة مثل تجمع SQL بلا خادم.

    يمكن نسخ حاويات Azure Cosmos DB إلى مناطق متعددة. إذا كان لديك حاوية متعددة المناطق، يمكنك تحديد معلمة region في سلسلة اتصال OPENROWSET لضمان إرسال الاستعلامات إلى نسخة متماثلة إقليمية معينة من الحاوية.

  • عند العمل مع أعمدة السلسلة، استخدم الدالة OPENROWSET مع عبارة WITH الصريحة وحدد طول بيانات مناسب لبيانات السلسلة.