الاستعلام عن 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 الصريحة وحدد طول بيانات مناسب لبيانات السلسلة.