4.2الأمان على مستوى الصفوف (RLS)
الأساسي في 30 ثانية
- RLS ترشّح الصفوف حسب المستخدم: دور في Desktop يحمل مرشح DAX (مثل
[المنطقة] = "الجزائر")، يُختبر عبر «عرض باسم»، ثم يُسند في الخدمة. - نرشّح الأبعاد (ينتشر المرشح إلى الحقائق عبر العلاقة) بدل الحقائق مباشرة — ونختبر دائمًا قبل النشر.
- RLS الديناميكية: دور واحد يرشّح عبر
USERPRINCIPALNAME()وجدول أمان (بريد ← نطاق) — المعيار الاحترافي، بدل دور لكل شخص.
حالة مصغّرة متسلسلة — زينب تفتح التقرير للمديرين الجهويين
زينب، مراقبة التسيير في مؤسسة صغيرة ومتوسطة للصناعات الغذائية بالجزائر، تنشر تقرير مبيعات واحدًا لثلاثة مديرين جهويين — لكن كل واحد يجب ألا يرى إلا منطقته، لأن الأرقام حسب القطاع سرية. تطبّق المنهج: في نمذجة ← إدارة الأدوار، تنشئ «منطقة الجزائر» بمرشح DAX [المنطقة] = "الجزائر" الموضوع على بُعد المنطقة. تختبر بـ«عرض باسم»: ينحصر التقرير كله في الجزائر. ثم تهيّئ التصنيع: جدول الأمان (البريد، المنطقة) مرتبط بالبُعد، ودور «ديناميكي» مرشحه الأمان[البريد] = USERPRINCIPALNAME(). وتسجّل المعلم: الإسناد الفعلي للمستخدمين سيتم في الخدمة (المستوى 5).
حالة مستقلة لهذا القسم: تعود في الدرس والمخطط والسكريبت وتحدي 48 ساعة للقسم 4.2.
1. تقرير واحد، قراءات متعددة
التقرير نفسه، وقراءات مختلفة: مدير الجزائر لا يرى إلا الجزائر، والمديرة العامة ترى كل شيء. هذا هو الأمان على مستوى الصفوف (RLS): أدوار (Roles) تُعرَّف في Desktop (نمذجة ← إدارة الأدوار) وتحمل مرشحات DAX مثل [المنطقة] = "الجزائر". ترشّح RLS الصفوف المرئية حسب المستخدم المتصل: تقرير واحد، ونطاقات مختلفة. لذلك تعرّف زينب دورًا لكل نطاق.
2. رشّحوا الأبعاد، واختبروا دائمًا
يوضع المرشح على الأبعاد (المنطقة، المدينة): فينتشر عبر العلاقة إلى جداول الحقائق — وهو أكثر موثوقية من ترشيح الحقائق مباشرة. ونختبر دائمًا عبر «عرض باسم» (نمذجة): نرى التقرير بعيون دور قبل النشر. تحاكي زينب «منطقة الجزائر» وتتحقق من عدم تجاوز أي شيء.
3. RLS الديناميكية
إنشاء دور لكل شخص لا يصمد عند التوسّع. النسخة الديناميكية تصنّع ذلك: جدول أمان (البريد ← المنطقة) مرتبط بالبُعد، ودور وحيد مرشحه الأمان[البريد] = USERPRINCIPALNAME(). عندها لا يرى كل مستخدم إلا نطاقه، دون دور مخصص. تضع زينب هذا المعيار — وهو أيضًا المنعكس المتوقع في PL-300.
🔎 مثال ملموس — 🔎 مثال ملموس — الدور الديناميكي
تجعل زينب كل النطاقات في دور واحد:
جدول الأمان (البريد، المنطقة) مرتبط ببُعد المنطقة.
دور «ديناميكي»، مرشح على الأمان:
الأمان[البريد] = USERPRINCIPALNAME()
← كل مستخدم لا يرى إلا نطاقه، دون دور مخصص.
القراءة: دور واحد يكفي للجميع — جدول الأمان يحمل مطابقة البريد ← المنطقة.
الدرس: الاختبار بـ«عرض باسم» مع تحديد بريد من الجدول: فيتبع النطاق الهوية.
مفردات القسم
- RLS (أمان مستوى الصفوف / Row-Level Security)
- ترشيح الصفوف المرئية حسب المستخدم المتصل: تقرير واحد، ونطاقات بيانات مختلفة.
مثال بسيط: زينب تحصر التقرير في منطقة كل مدير.
ما ليس كذلك: مشاركة تقرير يرى فيه الجميع كل شيء.
رد فعل: بيانات سرية ← RLS.
- الدور (Role)
- مجموعة مرشحات DAX مسماة (نمذجة ← إدارة الأدوار): «منطقة الجزائر» = [المنطقة]="الجزائر".
مثال بسيط: زينب تنشئ دورًا لكل نطاق، ثم دورًا ديناميكيًا.
ما ليس كذلك: مرشح موضوع يدويًا على تصور واحد.
رد فعل: الدور = مرشح DAX مسمّى وقابل لإعادة الاستخدام.
- عرض باسم (View As)
- الاختبار في Desktop (نمذجة ← عرض باسم): رؤية التقرير بعيون دور قبل النشر.
مثال بسيط: تحاكي زينب «منطقة الجزائر» فلا ترى إلا الجزائر.
ما ليس كذلك: الاختبار بحساب المؤلف الخاص.
رد فعل: RLS تُختبر، دائمًا، قبل النشر.
- USERPRINCIPALNAME()
- الدالة التي ترجع بريد المستخدم المتصل: مفتاح RLS الديناميكية.
مثال بسيط: تستخدمها زينب لترشيح الصفوف حسب الهوية.
ما ليس كذلك: مرشح ثابت على قيمة واحدة.
رد فعل: RLS ديناميكية ← USERPRINCIPALNAME().
- جدول الأمان (Security Table)
- جدول المطابقة بريد ← نطاق (منطقة، مدينة…) يعبره دور ديناميكي وحيد للترشيح.
مثال بسيط: تدرج فيه زينب البريد والمنطقة لمديريها الجهويين.
ما ليس كذلك: دور مخصص لكل شخص.
رد فعل: دور ديناميكي واحد + جدول أمان.
في التطبيق — تطبيق عملي — من الدور الثابت إلى RLS الديناميكية
- نمذجة ← إدارة الأدوار ← جديد: «منطقة الجزائر» بمرشح DAX [المنطقة] = "الجزائر" (على بُعد المنطقة — الخيار الأفضل).
- اختبروا: نمذجة ← عرض باسم ← علّموا الدور: ينحصر التقرير كله في الجزائر. اخرجوا من وضع الاختبار.
- النسخة الديناميكية: أنشئوا جدول الأمان (البريد، المنطقة) بسطرين أو 3، واربطوه ببُعد المنطقة، ثم دور «ديناميكي» مرشحه الأمان[البريد] = USERPRINCIPALNAME().
- اختبروا مجددًا بـ«عرض باسم» مع تحديد بريد من الجدول: يتبع النطاق الهوية. (الإسناد الفعلي للمستخدمين يتم في الخدمة — المستوى 5.)
سكريبت خطوة بخطوة — تأمين التقرير كما تفعل زينب (8 دقائق)
1) نمذجة ← إدارة الأدوار ← جديد، سمّوا «منطقة الجزائر»، حدّدوا بُعد المنطقة واكتبوا مرشح DAX [المنطقة] = "الجزائر". 2) نمذجة ← عرض باسم ← علّموا الدور: يقتصر التقرير كله على الجزائر؛ ألغوا التحديد للعودة. 3) أنشئوا جدول الأمان (البريد، المنطقة) بسطرين أو 3 واربطوا المنطقة ببُعد المنطقة. 4) دور «ديناميكي»: مرشح الأمان[البريد] = USERPRINCIPALNAME(). 5) اختبروا بـ«عرض باسم» بإدخال بريد من الجدول: يتبع النطاق الهوية. إسناد المستخدمين سيتم في الخدمة.
إذا لم يغيّر الاختبار شيئًا، فتحققوا من اتجاه العلاقة ومن أن المرشح موضوع فعلًا على البُعد (فالمرشح ينتشر إلى الحقائق).
قالب للنسخ واللصق — قائمة تحقق RLS الخاصة بي
الأدوار: نمذجة ← إدارة الأدوار ← جديد
مرشح ثابت: [المنطقة] = "الجزائر" (على البُعد، لا الحقائق)
الاختبار: نمذجة ← عرض باسم (لا بحسابك الخاص)
ديناميكي: جدول الأمان (البريد، المنطقة) + دور مرشحه
الأمان[البريد] = USERPRINCIPALNAME()
إسناد المستخدمين: في الخدمة (المستوى 5).
حسب المنطقة
تنشئ زينب دور «منطقة الجزائر»: فمدير الجزائر لا يرى إلا منطقته.
اختبار «عرض باسم»
تحاكي زينب كل دور قبل النشر: فلا يتجاوز أي نطاق حدوده.
دور واحد للجميع
تستبدل زينب الأدوار لكل شخص بدور ديناميكي USERPRINCIPALNAME().
الأبعاد أولًا
ترشّح زينب بُعد المنطقة: فينتشر المرشح إلى المبيعات عبر العلاقة.
✓ ممارسات جيدة
- رشّحوا الأبعاد (ينتشر المرشح إلى الحقائق عبر العلاقة).
- اختبروا بـ«عرض باسم» قبل أي نشر.
- فضّلوا RLS الديناميكية (USERPRINCIPALNAME + جدول أمان).
✗ أخطاء شائعة
- ترشيح الحقائق مباشرة بدل الأبعاد.
- نشر RLS دون اختبارها.
- إنشاء دور لكل شخص (غير قابل للإدارة؛ فضّلوا الديناميكي).
النقاط الأساسية
- RLS ترشّح البيانات حسب المستخدم: تقرير واحد، ورؤى متعددة.
- رشّحوا الأبعاد بدل الحقائق مباشرة.
- «عرض باسم» قبل أي نشر: RLS تُختبر، دائمًا.
- RLS الديناميكية (USERPRINCIPALNAME + جدول أمان) تُغني عن دور لكل شخص.
تحدي 48 ساعة — طبّقوه غدًا
كما تفعل زينب، أنشئوا دور RLS على تقرير (مثل [المنطقة] = "الجزائر")، واختبروه بـ«عرض باسم»، ثم ابنوا جدول الأمان + الدور الديناميكي (USERPRINCIPALNAME). واكتبوا في جملة من يجب أن يرى ماذا في مؤسستكم.
- أستطيع إنشاء دور RLS بمرشح DAX واختباره («عرض باسم»).
- أرشّح الأبعاد وأعرف لماذا.
- أعرف بناء RLS ديناميكية بـUSERPRINCIPALNAME وجدول أمان.
أسئلة شائعة
هل تنطبق RLS عليّ أنا المؤلف؟
في Desktop، لا (إلا في وضع الاختبار): ترون كل شيء. وفي الخدمة، لا يخضع المسؤولون وأعضاء مساحة العمل لـRLS — إنها تعمل للقراء. فلا تستنتجوا أنها «لا تعمل» باختبارها بحسابكم الخاص.
هل تحمي RLS من تصدير البيانات؟
نعم للنطاق: قارئ محصور في الجزائر لا يصدّر إلا صفوف الجزائر. لكنها لا تعوّض أذونات الوصول إلى التقرير (من يحق له فتحه): فالطبقتان متكاملتان.
ما الدالة المفتاحية في RLS الديناميكية؟