
Power BI Row-Level Security (RLS): Enterprise Guide 2026
Power BI Row-Level Security enterprise guide — static vs dynamic, USERPRINCIPALNAME vs USEROBJECTID, group-based, multi-tenant, OLS combinations, performance tuning, Copilot integration.
Power BI Row-Level Security enterprise guide — static vs dynamic, USERPRINCIPALNAME vs USEROBJECTID, group-based, multi-tenant, OLS combinations, performance tuning, Copilot integration.

Row-Level Security (RLS) is the authorization layer in Power BI that restricts which rows a user sees in a report or dataset. Done well, RLS scales to Fortune 500 with thousands of users, dozens of authorization patterns, and integrates with Microsoft Entra ID, Microsoft Fabric, and Microsoft Copilot.
This is the working enterprise RLS guide EPC Group uses for Fortune 500 Power BI deployments — pattern selection, dynamic vs static RLS, performance tuning, multi-tenancy, and integration with Object-Level Security (OLS) and sensitivity labels.
EPC Group has implemented Power BI RLS for Fortune 500 healthcare, financial services, government, manufacturing, and technology since the Power BI GA wave (2015).
| Pattern | Use Case |
|---|---|
| Static RLS | Hard-coded role membership, low scale |
| Dynamic RLS via USERPRINCIPALNAME() | Identity-driven authorization (most common) |
| Dynamic RLS via USEROBJECTID() | Microsoft Entra Object ID anchored |
| Path-based RLS (Org Hierarchy) | Manager sees own + all reports |
| Group-based RLS (Microsoft Entra) | Authorization tied to Microsoft Entra group |
| Multi-tenant RLS | SaaS scenarios with one model serving many customers |
Combine with Object-Level Security (OLS) when columns must be hidden, and sensitivity labels for Microsoft Copilot grounding control.
-- Role: "Northwest Region"
-- Filter on Sales table
[region] = "Northwest"
Use case: Small number of static authorization scopes that never change.
Limitation: Hard to maintain, doesn't scale beyond ~10 roles.
-- Role: "Sales Rep"
-- Filter on Sales table
[sales_rep_email] = USERPRINCIPALNAME()
Use case: Each user sees their own data. Most common pattern.
-- Role: "Department Lead"
-- Filter on Sales table via department mapping
[department_id] IN
LOOKUPVALUE(
Departments[department_id],
Departments[lead_email], USERPRINCIPALNAME()
)
Use case: Manager sees their department(s).
-- Role: "Project Member"
-- Filter on Project table via Microsoft Entra Object ID
[project_id] IN
SELECTCOLUMNS(
FILTER(
ProjectMembership,
ProjectMembership[user_oid] = USEROBJECTID()
),
"project_id", ProjectMembership[project_id]
)
Use case: Anchored on Microsoft Entra ID Object ID rather than UPN. More resilient to email/UPN changes during organizational moves.
-- Role: "Manager Hierarchy"
-- See own data + all subordinates
PATHCONTAINS(Employees[manager_path], LOOKUPVALUE(
Employees[employee_id],
Employees[email], USERPRINCIPALNAME()
))
Use case: Hierarchical authorization where manager sees own + entire reporting chain.
Implementation: Pre-compute org hierarchy manager_path column using PATH() function during ETL, then PATHCONTAINS() at query time.
Best practice for enterprise scale — authorization tied to Microsoft Entra group membership rather than per-user mappings.
-- Role: "Region Group Member"
[region_id] IN
LOOKUPVALUE(
RegionGroupMapping[region_id],
RegionGroupMapping[entra_group_oid], <user's group OIDs>
)
Pattern: Power BI semantic model has a RegionGroupMapping table that maps Microsoft Entra group OIDs to data scopes. Application code (or refresh-time prep) snapshots user-to-group mapping.
Advantage: Authorization changes via Microsoft Entra group membership flow automatically. No per-user model update.
For software vendors embedding Power BI for multi-customer SaaS:
-- Role: "Tenant Filter"
[customer_id] = USERPRINCIPALNAME() -- typically configured via JWT claim
Multi-tenant pattern requires:
OLS hides specific columns or tables from specific users. Useful when:
-- Role: "Standard User" — OLS rule
-- Hides Salary column
TABULAR EDITOR: select Salary column → Object Level Security → Standard User → None
OLS is configured via Tabular Editor or XMLA endpoint, not Power BI Desktop UI.
Microsoft Purview sensitivity labels on Power BI:
RLS + sensitivity label = layered authorization (RLS limits rows, label enforces encryption + Copilot grounding control).
RLS adds query overhead. Common patterns and impact:
| Pattern | Query Overhead |
|---|---|
| Static RLS | Negligible |
| Dynamic via USERPRINCIPALNAME() with LOOKUPVALUE | Low |
| Dynamic via USEROBJECTID() with SELECTCOLUMNS/FILTER | Low-Medium |
| Path-based with PATHCONTAINS | Medium |
| Group-based with multi-table join | Medium-High |
| Multi-tenant with effective_identity | Low (Power BI optimizes) |
DirectQuery RLS pushes filters down to the underlying source. Critical:
DirectLake mode in Microsoft Fabric reads Parquet/Delta from OneLake without import. RLS works natively. Performance is typically 60-80% faster than Import for typical workloads.
Microsoft Fabric OneLake supports:
Power BI semantic models on Microsoft Fabric inherit Fabric warehouse RLS, which can complement (or in some cases replace) Power BI RLS.
Power BI Copilot respects:
This is a critical differentiator — Power BI Copilot is the only major BI Copilot that natively respects RLS/OLS without custom configuration.
RLS, almost always. Separate reports per role create maintenance burden and inconsistency. RLS scales to thousands of users with one report. The exception is when authorization is so different per role that data semantics differ (in which case, consider separate semantic models).
Dynamic, almost always. Static doesn't scale and requires manual updates per personnel change. Dynamic via USERPRINCIPALNAME() or USEROBJECTID() with mapping tables is the EPC Group standard.
Microsoft Entra B2B guest users can authenticate to Power BI. RLS works for B2B guests via USERPRINCIPALNAME() — but the UPN format differs (guest_user_email#EXT#@hosttenant.onmicrosoft.com). Mapping tables must accommodate this.
Embedded Power BI (Power BI Embedded for ISVs, embedded for organization) uses the embed token to assert user identity. App owns data scenario uses effective_identity to assert RLS roles per user. User owns data scenario uses the user's actual identity.
Power BI workspace owners and Premium capacity admins can bypass RLS via Tabular Editor or by editing the model. Mitigation: Microsoft Purview audit log captures admin actions, role-based admin separation, and PIM (Privileged Identity Management) for elevation.
EPC Group senior architects with Power BI experience since the Project Crescent beta (2010-2013). Errin O'Connor was on the original Microsoft Power BI beta team and is a 4-time Microsoft Press author including a Power BI book.
Schedule a 30-minute Power BI RLS discovery call at /schedule or call (888) 381-9725. Senior architects (not sales) take discovery calls.
Related reading: Power BI Premium Pricing Licensing Guide, Healthcare Analytics Power BI HIPAA Enterprise Guide, Government Analytics Power BI FedRAMP Enterprise Guide, and Microsoft Fabric Quickstart Assessment.
CEO & Chief AI Architect
Microsoft Press bestselling author with 29 years of enterprise consulting experience.
View Full ProfileWhy Fortune 500 enterprises are consolidating Tableau workloads to Microsoft Power BI in 2026. The 4-phase migration runbook, cost comparison, governance continuity, and Power BI Beta Team founding-member methodology from 29 years of Microsoft consulting.
Power BIMicrosoft is consolidating Power BI Premium capacity into Microsoft Fabric F-SKUs. When existing Power BI Premium customers should migrate, the F64 inflection point, and the migration playbook for Fortune 500.
Power BIPower BI May 2026 enterprise rollout: Visual Calculations GA, Exploration Perspective, Copilot Summarize. Governance patterns, migration plan, semantic model impact.
Our team of experts can help you implement enterprise-grade power bi solutions tailored to your organization's needs.