4.2 · الأمان على مستوى الصفوف (RLS)

المستوى 4 · التصميم والأمان والأداء

4.2الأمان على مستوى الصفوف (RLS)

الهدف: إنشاء أدوار ثابتة، واختبارها، وبناء RLS ديناميكية مع جدول مطابقة مستخدم ← نطاق.
الوقت المقدّر: 20 دقيقة · قراءة ذاتية · إذا كان لديك 5 دقائق فقط: اقرأ «الأساسي في 30 ثانية» + المخطط.

الأساسي في 30 ثانية

  • RLS ترشّح الصفوف حسب المستخدم: دور في Desktop يحمل مرشح DAX (مثل [المنطقة] = "الجزائر")، يُختبر عبر «عرض باسم»، ثم يُسند في الخدمة.
  • نرشّح الأبعاد (ينتشر المرشح إلى الحقائق عبر العلاقة) بدل الحقائق مباشرة — ونختبر دائمًا قبل النشر.
  • RLS الديناميكية: دور واحد يرشّح عبر USERPRINCIPALNAME() وجدول أمان (بريد ← نطاق) — المعيار الاحترافي، بدل دور لكل شخص.

حالة مصغّرة متسلسلة — زينب تفتح التقرير للمديرين الجهويين

زينب، مراقبة التسيير في مؤسسة صغيرة ومتوسطة للصناعات الغذائية بالجزائر، تنشر تقرير مبيعات واحدًا لثلاثة مديرين جهويين — لكن كل واحد يجب ألا يرى إلا منطقته، لأن الأرقام حسب القطاع سرية. تطبّق المنهج: في نمذجة ← إدارة الأدوار، تنشئ «منطقة الجزائر» بمرشح DAX ‏[المنطقة] = "الجزائر"‏ الموضوع على بُعد المنطقة. تختبر بـ«عرض باسم»: ينحصر التقرير كله في الجزائر. ثم تهيّئ التصنيع: جدول الأمان (البريد، المنطقة) مرتبط بالبُعد، ودور «ديناميكي» مرشحه ‏الأمان[البريد] = USERPRINCIPALNAME()‏. وتسجّل المعلم: الإسناد الفعلي للمستخدمين سيتم في الخدمة (المستوى 5).

حالة مستقلة لهذا القسم: تعود في الدرس والمخطط والسكريبت وتحدي 48 ساعة للقسم 4.2.

1. تقرير واحد، قراءات متعددة

التقرير نفسه، وقراءات مختلفة: مدير الجزائر لا يرى إلا الجزائر، والمديرة العامة ترى كل شيء. هذا هو الأمان على مستوى الصفوف (RLS): أدوار (Roles) تُعرَّف في Desktop (نمذجة ← إدارة الأدوار) وتحمل مرشحات DAX مثل [المنطقة] = "الجزائر". ترشّح RLS الصفوف المرئية حسب المستخدم المتصل: تقرير واحد، ونطاقات مختلفة. لذلك تعرّف زينب دورًا لكل نطاق.

2. رشّحوا الأبعاد، واختبروا دائمًا

يوضع المرشح على الأبعاد (المنطقة، المدينة): فينتشر عبر العلاقة إلى جداول الحقائق — وهو أكثر موثوقية من ترشيح الحقائق مباشرة. ونختبر دائمًا عبر «عرض باسم» (نمذجة): نرى التقرير بعيون دور قبل النشر. تحاكي زينب «منطقة الجزائر» وتتحقق من عدم تجاوز أي شيء.

3. RLS الديناميكية

إنشاء دور لكل شخص لا يصمد عند التوسّع. النسخة الديناميكية تصنّع ذلك: جدول أمان (البريد ← المنطقة) مرتبط بالبُعد، ودور وحيد مرشحه الأمان[البريد] = USERPRINCIPALNAME(). عندها لا يرى كل مستخدم إلا نطاقه، دون دور مخصص. تضع زينب هذا المعيار — وهو أيضًا المنعكس المتوقع في PL-300.

خطأ شائع في الفهم: «RLS أختبرها بحسابي الخاص، وأضع المرشح على الحقائق عشوائيًا، وأنشئ دورًا لكل شخص». لا، ثلاث أخطاء. أختبر بـ«عرض باسم»: فالمؤلف يرى دائمًا كل شيء، لذا الاختبار بحسابه لا يثبت شيئًا. أرشّح الأبعاد (ينتشر المرشح إلى الحقائق)، لا الحقائق مباشرة. وأنتقل إلى RLS الديناميكية (USERPRINCIPALNAME + جدول أمان) بدل تكديس دور لكل شخص، وهو أمر غير قابل للإدارة.
من الثابت إلى الديناميكي لبنة الأمان: دور بمرشح DAX، يُختبر، ثم يُصنَّع ديناميكيًا. دور مرشح DAX [المنطقة]= "الجزائر"اختبار عرض باسمجدول الأمان البريد← المنطقة
لبنة الأمان: دور بمرشح DAX، يُختبر، ثم يُصنَّع ديناميكيًا.
نص المخطط (SEO / قارئات الشاشة / الترجمة): 1) زينب، مراقبة التسيير بالجزائر، تريد تقريرًا واحدًا يُقرأ بشكل مختلف حسب المديرين الجهويين: تنشئ أدوارًا (نمذجة ← إدارة الأدوار) تحمل مرشح DAX مثل [المنطقة] = "الجزائر"، موضوعًا على بُعد المنطقة. 2) تختبر كل دور بـ«عرض باسم» — لا بحسابها كمؤلفة، فهي ترى دائمًا كل شيء — وتتحقق من انتشار مرشح الأبعاد إلى الحقائق. 3) تصنّع: جدول أمان (البريد ← المنطقة) مرتبط بالبُعد، ودور ديناميكي وحيد مرشحه الأمان[البريد] = USERPRINCIPALNAME(). الدرس: رشّحوا الأبعاد، واختبروا دائمًا، وفضّلوا RLS الديناميكية على دور لكل شخص.

🔎 مثال ملموس — 🔎 مثال ملموس — الدور الديناميكي

تجعل زينب كل النطاقات في دور واحد:

جدول الأمان (البريد، المنطقة) مرتبط ببُعد المنطقة.
دور «ديناميكي»، مرشح على الأمان:
  الأمان[البريد] = USERPRINCIPALNAME()
← كل مستخدم لا يرى إلا نطاقه، دون دور مخصص.

القراءة: دور واحد يكفي للجميع — جدول الأمان يحمل مطابقة البريد ← المنطقة.

الدرس: الاختبار بـ«عرض باسم» مع تحديد بريد من الجدول: فيتبع النطاق الهوية.

مفردات القسم

RLS (أمان مستوى الصفوف / Row-Level Security)
ترشيح الصفوف المرئية حسب المستخدم المتصل: تقرير واحد، ونطاقات بيانات مختلفة.

مثال بسيط: زينب تحصر التقرير في منطقة كل مدير.

ما ليس كذلك: مشاركة تقرير يرى فيه الجميع كل شيء.

رد فعل: بيانات سرية ← RLS.

الدور (Role)
مجموعة مرشحات DAX مسماة (نمذجة ← إدارة الأدوار): «منطقة الجزائر» = [المنطقة]="الجزائر".

مثال بسيط: زينب تنشئ دورًا لكل نطاق، ثم دورًا ديناميكيًا.

ما ليس كذلك: مرشح موضوع يدويًا على تصور واحد.

رد فعل: الدور = مرشح DAX مسمّى وقابل لإعادة الاستخدام.

عرض باسم (View As)
الاختبار في Desktop (نمذجة ← عرض باسم): رؤية التقرير بعيون دور قبل النشر.

مثال بسيط: تحاكي زينب «منطقة الجزائر» فلا ترى إلا الجزائر.

ما ليس كذلك: الاختبار بحساب المؤلف الخاص.

رد فعل: RLS تُختبر، دائمًا، قبل النشر.

USERPRINCIPALNAME()
الدالة التي ترجع بريد المستخدم المتصل: مفتاح RLS الديناميكية.

مثال بسيط: تستخدمها زينب لترشيح الصفوف حسب الهوية.

ما ليس كذلك: مرشح ثابت على قيمة واحدة.

رد فعل: RLS ديناميكية ← USERPRINCIPALNAME().

جدول الأمان (Security Table)
جدول المطابقة بريد ← نطاق (منطقة، مدينة…) يعبره دور ديناميكي وحيد للترشيح.

مثال بسيط: تدرج فيه زينب البريد والمنطقة لمديريها الجهويين.

ما ليس كذلك: دور مخصص لكل شخص.

رد فعل: دور ديناميكي واحد + جدول أمان.

في التطبيق — تطبيق عملي — من الدور الثابت إلى RLS الديناميكية

  1. نمذجة ← إدارة الأدوار ← جديد: «منطقة الجزائر» بمرشح DAX ‏[المنطقة] = "الجزائر"‏ (على بُعد المنطقة — الخيار الأفضل).
  2. اختبروا: نمذجة ← عرض باسم ← علّموا الدور: ينحصر التقرير كله في الجزائر. اخرجوا من وضع الاختبار.
  3. النسخة الديناميكية: أنشئوا جدول الأمان (البريد، المنطقة) بسطرين أو 3، واربطوه ببُعد المنطقة، ثم دور «ديناميكي» مرشحه ‏الأمان[البريد] = USERPRINCIPALNAME()‏.
  4. اختبروا مجددًا بـ«عرض باسم» مع تحديد بريد من الجدول: يتبع النطاق الهوية. (الإسناد الفعلي للمستخدمين يتم في الخدمة — المستوى 5.)
إتقان RLS بصيغتيها — لبنة الأمان المطلوبة في أي نشر مؤسسي (وفي PL-300).

سكريبت خطوة بخطوة — تأمين التقرير كما تفعل زينب (8 دقائق)

1) نمذجة ← إدارة الأدوار ← جديد، سمّوا «منطقة الجزائر»، حدّدوا بُعد المنطقة واكتبوا مرشح DAX ‏[المنطقة] = "الجزائر"‏. 2) نمذجة ← عرض باسم ← علّموا الدور: يقتصر التقرير كله على الجزائر؛ ألغوا التحديد للعودة. 3) أنشئوا جدول الأمان (البريد، المنطقة) بسطرين أو 3 واربطوا المنطقة ببُعد المنطقة. 4) دور «ديناميكي»: مرشح الأمان[البريد] = USERPRINCIPALNAME(). 5) اختبروا بـ«عرض باسم» بإدخال بريد من الجدول: يتبع النطاق الهوية. إسناد المستخدمين سيتم في الخدمة.

إذا لم يغيّر الاختبار شيئًا، فتحققوا من اتجاه العلاقة ومن أن المرشح موضوع فعلًا على البُعد (فالمرشح ينتشر إلى الحقائق).

قالب للنسخ واللصق — قائمة تحقق RLS الخاصة بي

الأدوار: نمذجة ← إدارة الأدوار ← جديد
مرشح ثابت: [المنطقة] = "الجزائر" (على البُعد، لا الحقائق)
الاختبار: نمذجة ← عرض باسم (لا بحسابك الخاص)
ديناميكي: جدول الأمان (البريد، المنطقة) + دور مرشحه
  الأمان[البريد] = USERPRINCIPALNAME()
إسناد المستخدمين: في الخدمة (المستوى 5).

حسب المنطقة

تنشئ زينب دور «منطقة الجزائر»: فمدير الجزائر لا يرى إلا منطقته.

اختبار «عرض باسم»

تحاكي زينب كل دور قبل النشر: فلا يتجاوز أي نطاق حدوده.

دور واحد للجميع

تستبدل زينب الأدوار لكل شخص بدور ديناميكي USERPRINCIPALNAME().

الأبعاد أولًا

ترشّح زينب بُعد المنطقة: فينتشر المرشح إلى المبيعات عبر العلاقة.

حذر: RLS تمسّ سرية البيانات: حدّدوا من يحق له رؤية ماذا، واختبروا كل دور قبل النشر، ووثّقوا النطاقات. وهذه القواعد من حوكمة مؤسستكم — RLS ترشّح الصفوف، لكنها لا تعوّض أذونات الوصول إلى التقرير. وعند الشك في نطاق حساس، اطلبوا التحقق من القاعدة داخليًا.

✓ ممارسات جيدة

  • رشّحوا الأبعاد (ينتشر المرشح إلى الحقائق عبر العلاقة).
  • اختبروا بـ«عرض باسم» قبل أي نشر.
  • فضّلوا RLS الديناميكية (USERPRINCIPALNAME + جدول أمان).

✗ أخطاء شائعة

  • ترشيح الحقائق مباشرة بدل الأبعاد.
  • نشر RLS دون اختبارها.
  • إنشاء دور لكل شخص (غير قابل للإدارة؛ فضّلوا الديناميكي).

النقاط الأساسية

  • RLS ترشّح البيانات حسب المستخدم: تقرير واحد، ورؤى متعددة.
  • رشّحوا الأبعاد بدل الحقائق مباشرة.
  • «عرض باسم» قبل أي نشر: RLS تُختبر، دائمًا.
  • RLS الديناميكية (USERPRINCIPALNAME + جدول أمان) تُغني عن دور لكل شخص.

تحدي 48 ساعة — طبّقوه غدًا

كما تفعل زينب، أنشئوا دور RLS على تقرير (مثل [المنطقة] = "الجزائر")، واختبروه بـ«عرض باسم»، ثم ابنوا جدول الأمان + الدور الديناميكي (USERPRINCIPALNAME). واكتبوا في جملة من يجب أن يرى ماذا في مؤسستكم.

قائمة الخروج من القسم
  • أستطيع إنشاء دور RLS بمرشح DAX واختباره («عرض باسم»).
  • أرشّح الأبعاد وأعرف لماذا.
  • أعرف بناء RLS ديناميكية بـUSERPRINCIPALNAME وجدول أمان.
تقييم ذاتي 1-5: هل أضع المرشح دائمًا على البُعد؟تقييم ذاتي 1-5: هل اختبرت كل دور قبل اعتباره جاهزًا؟

أسئلة شائعة

هل تنطبق RLS عليّ أنا المؤلف؟

في Desktop، لا (إلا في وضع الاختبار): ترون كل شيء. وفي الخدمة، لا يخضع المسؤولون وأعضاء مساحة العمل لـRLS — إنها تعمل للقراء. فلا تستنتجوا أنها «لا تعمل» باختبارها بحسابكم الخاص.

هل تحمي RLS من تصدير البيانات؟

نعم للنطاق: قارئ محصور في الجزائر لا يصدّر إلا صفوف الجزائر. لكنها لا تعوّض أذونات الوصول إلى التقرير (من يحق له فتحه): فالطبقتان متكاملتان.

تحقّق من فهمك

ما الدالة المفتاحية في RLS الديناميكية؟

موارد إضافية (اختياري، للتعمّق أكثر)

اختبار المستوى 4أسئلة جديدة وأصعب للتحقق من مكتسباتك