EPC Group - Enterprise Microsoft AI, SharePoint, Power BI, and Azure Consulting
G2 High Performer Summer 2025, Momentum Leader Spring 2025, Leader Winter 2025, Leader Spring 2026
BlogContact
Ready to transform your Microsoft environment?Get started today
(888) 381-9725Get Free Consultation
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌

EPC Group

Enterprise Microsoft consulting with 29 years serving Fortune 500 companies.

(888) 381-9725
contact@epcgroup.net
4900 Woodway Drive - Suite 830
Houston, TX 77056

Follow Us

Solutions

  • All Services
  • Microsoft 365 Consulting
  • AI Governance
  • Azure AI Consulting
  • Cloud Migration
  • Microsoft Copilot
  • Data Governance
  • Microsoft Fabric
  • vCIO / vCAIO Services
  • Large-Scale Migrations
  • SharePoint Development

Industries

  • All Industries
  • Healthcare IT
  • Financial Services
  • Government
  • Education
  • Teams vs Slack

Power BI

  • Case Studies
  • 24/7 Emergency Support
  • Dashboard Guide
  • Gateway Setup
  • Premium Features
  • Lookup Functions
  • Power Pivot vs BI
  • Treemaps Guide
  • Dataverse
  • Power BI Consulting

Company

  • About Us
  • Our History
  • Microsoft Gold Partner
  • Case Studies
  • Testimonials
  • Blog
  • Resources
  • All Guides & Articles
  • Video Library
  • Client Reviews
  • Contact
  • Schedule a consultation

Microsoft Teams

  • Teams Questions
  • Teams Healthcare
  • Task Management
  • PSTN Calling
  • Enable Dial Pad

Azure & SharePoint

  • Azure Databricks
  • Azure DevOps
  • Azure Synapse
  • SharePoint MySites
  • SharePoint ECM
  • SharePoint vs M-Files

Comparisons

  • M365 vs Google
  • Databricks vs Dataproc
  • Dynamics vs SAP
  • Intune vs SCCM
  • Power BI vs MicroStrategy

Legal

  • Sitemap
  • Privacy Policy
  • Terms
  • Cookies

About EPC Group

EPC Group is a Microsoft consulting firm founded in 1997 (originally Enterprise Project Consulting, renamed EPC Group in 2005). 29 years of enterprise Microsoft consulting experience. Microsoft Gold Partner from 2003–2022 — the oldest Microsoft Gold Partner in North America — and currently a Microsoft Solutions Partner with six designations: Data & AI, Modern Work, Infrastructure, Security, Digital & App Innovation, and Business Applications.

Headquartered at 4900 Woodway Drive, Suite 830, Houston, TX 77056. Public clients include NASA, FBI, Federal Reserve, Pentagon, United Airlines, PepsiCo, Nike, and Northrop Grumman. 6,500+ SharePoint implementations, 1,500+ Power BI deployments, 500+ Microsoft Fabric implementations, 70+ Fortune 500 organizations served, 11,000+ enterprise engagements, 200+ Microsoft Power BI and Microsoft 365 consultants on staff.

About Errin O'Connor

Errin O'Connor is the Founder, CEO, and Chief AI Architect of EPC Group. Microsoft MVP for multiple years starting 2002–2003. 4× Microsoft Press bestselling author of Windows SharePoint Services 3.0 Inside Out (MS Press 2007), Microsoft SharePoint Foundation 2010 Inside Out (MS Press 2011), SharePoint 2013 Field Guide (Sams/Pearson 2014), and Microsoft Power BI Dashboards Step by Step (MS Press 2018).

Original SharePoint Beta Team member (Project Tahoe). Original Power BI Beta Team member (Project Crescent). FedRAMP framework contributor. Worked with U.S. CIO Vivek Kundra on the Obama administration's 25-Point Plan to reform federal IT, and with NASA CIO Chris Kemp as Lead Architect on the NASA Nebula Cloud project. Speaker at Microsoft Ignite, SharePoint Conference, KMWorld, and DATAVERSITY.

© 2026 EPC Group. All rights reserved. Microsoft, SharePoint, Power BI, Azure, Microsoft 365, Microsoft Copilot, Microsoft Fabric, and Microsoft Dynamics 365 are trademarks of the Microsoft group of companies.

‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
‌
Home / Blog / Row-Level Security in Power BI

Row-Level Security in Power BI: The Enterprise Configuration Guide

By Errin O'Connor, Chief AI Architect & CEO of EPC Group | Updated April 2026

Row-level security is the most critical — and most frequently misconfigured — feature in enterprise Power BI. One wrong DAX filter and your CFO's compensation data is visible to the entire sales team. This guide covers the implementation patterns, testing methodology, and architectural decisions that separate a secure deployment from a compliance incident.

Why Row-Level Security Is Non-Negotiable at Enterprise Scale

Every enterprise Power BI deployment involves data that not everyone should see. Sales reps should see their territory, not the entire pipeline. Regional managers should see their region, not the global P&L. HR should see compensation data; everyone else should not. This is not a nice-to-have — it is a compliance requirement under HIPAA, SOX, GDPR, and virtually every industry regulation that governs data access.

Power BI's row-level security (RLS) enforces these boundaries at the data model layer. When configured correctly, RLS filters every DAX query to include only the rows the current user is authorized to see. When configured incorrectly — which happens in roughly 40% of enterprise deployments EPC Group audits — RLS either blocks too much data (breaking reports) or too little (exposing sensitive information).

The challenge is not implementing basic RLS. Any analyst can create a static role in Power BI Desktop. The challenge is implementing RLS that scales to 1,000+ users, handles complex organizational hierarchies, performs well under load, and can be tested and validated automatically. That is what this guide addresses.

Static RLS vs Dynamic RLS: Choose the Right Pattern

Static RLS defines fixed filters per role. You create a role called "East Region" with the DAX filter [Region] = "East" and assign users to it. Simple, readable, and completely unmanageable beyond 15–20 roles. If you have 50 sales territories, you need 50 roles. If territories change quarterly, you rebuild 50 roles every quarter.

Dynamic RLS uses a single role with a DAX filter that references the current user's identity. The filter reads from a security mapping table in your data model that maps users (by UPN) to their authorized data scope. Adding a new user means adding a row to a table, not creating a new role.

Dynamic RLS DAX Pattern

// Single role: "Dynamic Access"
// DAX filter on the Region table:
[RegionID] IN
  SELECTCOLUMNS(
    FILTER(
      SecurityMapping,
      SecurityMapping[UserPrincipalName] = USERPRINCIPALNAME()
    ),
    "RegionID", SecurityMapping[RegionID]
  )

The SecurityMapping table lives in your data model and refreshes from your identity source (Active Directory, HR system, or a dedicated security database). When an employee transfers from East to West, you update one row in the security table. No role changes. No republishing. The next dataset refresh picks up the change automatically.

For enterprises with 100+ users, dynamic RLS is the only sustainable pattern. EPC Group has implemented dynamic RLS for organizations with 15,000+ users across 200+ security scopes with no performance degradation when the model is designed correctly.

Hierarchical RLS: Manager Sees Their Team's Data

The most common enterprise RLS requirement is hierarchical access: a district manager sees their district, a regional VP sees all districts in their region, and the SVP sees everything. This requires a parent-child security model.

The implementation uses DAX PATH() functions to flatten the organizational hierarchy into a traversable string. Each user's security mapping includes their position in the hierarchy, and the RLS filter checks whether the current user's path contains the data row's owning node.

Hierarchical Security Table Structure

UserPrincipalNameNodeIDParentNodeIDHierarchyPath
svp@company.com1NULL1
vp.east@company.com211|2
mgr.ny@company.com521|2|5
rep.nyc@company.com1251|2|5|12

The RLS DAX filter uses PATHCONTAINS() to check whether the logged-in user's node appears anywhere in the data row's hierarchy path. The SVP (Node 1) sees everything because "1" appears in every path. The NY manager (Node 5) sees nodes 5 and 12 but not node 2 (the VP level) or other regions.

Combining RLS With Object-Level Security for Defense-in-Depth

Row-level security controls which rows a user sees. Object-level security (OLS) controls which tables and columns are visible in the data model. Combining both creates defense-in-depth — essential for regulated industries like healthcare and financial services.

Common OLS use cases in enterprise Power BI:

  • HR data: Hide Salary, SSN, and Performance Rating columns from non-HR roles.
  • Healthcare: Hide PHI columns (Patient Name, DOB, MRN) from operational dashboards that only need aggregate metrics.
  • Financial services: Hide trading position details from compliance monitoring dashboards that only need exception flags.
  • M&A scenarios: Hide acquisition target financials from all but the deal team.

OLS is configured in Tabular Editor or SSMS, not in Power BI Desktop. This means it requires a more technical deployment process but provides column-level granularity that RLS alone cannot achieve. EPC Group recommends OLS for any deployment handling HIPAA-protected health information, PII, or SOX-controlled financial data.

Testing RLS: Manual Validation Is Not Enough

The "View as Role" feature in Power BI Desktop is useful for initial development but inadequate for enterprise testing. It tests one role at a time, requires manual inspection, and does not cover edge cases like users assigned to multiple roles, users with no security mapping, or users who change departments mid-refresh-cycle.

EPC Group's RLS testing framework uses the Power BI REST API to execute DAX queries as specific users and validate that the returned data matches expected results. The test matrix includes:

  • Positive tests: User A should see rows X, Y, Z — verify they appear.
  • Negative tests: User A should NOT see rows P, Q, R — verify they are absent.
  • Boundary tests: User with no security mapping should see zero rows (not all rows).
  • Multi-role tests: User assigned to two roles should see the union of both scopes.
  • Hierarchy tests: Manager should see their direct reports' data and all downstream.
  • Performance tests: RLS-filtered queries should complete within 3 seconds at P95.

These tests run automatically after every dataset publish via Azure DevOps pipeline or Power Automate flow. A single failed test blocks the deployment pipeline, preventing misconfigured RLS from reaching production.

The 5 Most Common RLS Mistakes in Enterprise Deployments

After auditing hundreds of enterprise Power BI environments, EPC Group consistently finds these five RLS configuration errors:

  1. No RLS on aggregation tables. Organizations apply RLS to detail tables but forget that their summary/aggregation tables contain the same data pre-aggregated. A user blocked from seeing individual transactions can still see the totals in the summary table. Fix: apply consistent RLS filters to every table that contains the secured dimension.
  2. BLANK() fallback exposes all data. Dynamic RLS with USERPRINCIPALNAME() that returns BLANK() when a user is not in the security table. If the DAX filter does not explicitly handle BLANK(), Power BI's default behavior may return all rows. Fix: always include an explicit IF(ISBLANK(...), FALSE()) fallback.
  3. RLS not applied to DirectQuery sources. RLS in import mode filters data after it reaches Power BI. In DirectQuery mode, the RLS filter must be pushed down to the source query. Complex DAX expressions that cannot be folded to SQL will either fail or return unfiltered results. Fix: validate query folding for every RLS filter in DirectQuery datasets.
  4. Service principal access bypasses RLS. Applications and service principals that access Power BI datasets via the API are not subject to RLS unless explicitly configured. Embedded reports using "App Owns Data" pattern require effective identity parameters. Fix: always pass effective identity in embed token generation.
  5. No monitoring for RLS changes. Someone edits the security mapping table, and nobody notices until an audit. Fix: implement change tracking on the security table with alerts for any modification, and log all RLS role membership changes in a governance audit trail.

RLS Performance Optimization for Large Datasets

RLS adds a DAX filter to every query, which means it affects every visual on every page. In a well-designed model, the overhead is 5–15%. In a poorly designed model, RLS can triple query times. The key optimizations:

  • Use relationships, not LOOKUPVALUE. RLS filters that traverse relationships are optimized by the VertiPaq engine. LOOKUPVALUE-based filters bypass this optimization and perform row-by-row evaluation.
  • Keep security tables narrow. The security mapping table should contain only UserPrincipalName and the foreign key columns needed for filtering. Do not include user display names, email aliases, or other non-filter columns.
  • Denormalize when necessary. If your RLS filter joins three tables to determine access, consider denormalizing the security mapping to include the final filter value directly.
  • Pre-calculate hierarchy paths. Do not compute PATH() at query time. Calculate hierarchy paths during data refresh and store them as a column in the security table.
  • Use Premium capacity for large-scale RLS. Premium Per User or Premium capacity provides dedicated resources that prevent RLS query overhead from affecting other tenants.

Enterprise RLS Deployment Architecture

For organizations with 1,000+ users, EPC Group recommends the following deployment architecture:

ComponentRecommendation
Security mapping sourceAzure AD groups synced to SQL Server security table via Azure Data Factory
RLS patternDynamic RLS with single role, USERPRINCIPALNAME() filter
OLS configurationTabular Editor, version-controlled in Azure DevOps
TestingAutomated REST API test suite in CI/CD pipeline
MonitoringSecurity table change tracking + Power BI audit log integration
CapacityPremium capacity with autoscale for RLS query overhead
GovernanceQuarterly RLS audit with test matrix re-validation

Integrating RLS governance with your broader Microsoft Copilot deployment ensures that AI-generated insights respect the same security boundaries as traditional reports. Copilot queries in Power BI inherit the user's RLS context, but this must be validated as part of your testing framework.

Frequently Asked Questions

What is the difference between static and dynamic row-level security in Power BI?

Static RLS uses hardcoded role definitions with fixed DAX filters — for example, [Region] = "East" for the East Sales role. Dynamic RLS uses the USERPRINCIPALNAME() or CUSTOMDATA() DAX function to filter data based on the logged-in user's identity, pulling their permissions from a security mapping table. Static RLS is simpler but unmanageable beyond 10–15 roles. Dynamic RLS scales to thousands of users because you add rows to a table instead of creating new roles.

How do you test row-level security in Power BI before deploying to production?

Use Power BI Desktop's 'View as Role' feature for initial validation, then the Power BI REST API for automated regression testing. EPC Group builds a test matrix that maps every RLS role to expected visible/hidden data combinations and runs API-based validation after every dataset publish. Manual testing alone is insufficient at scale — a single misconfigured DAX filter can expose financial data across business units.

Can row-level security in Power BI handle complex hierarchical permissions?

Yes, but it requires careful data modeling. Hierarchical RLS — where a regional VP sees all data for their region's districts — uses a parent-child security table with DAX PATH() functions. The security table maps each user to their position in the hierarchy, and the RLS DAX filter traverses the hierarchy to include all descendant nodes. EPC Group has implemented hierarchical RLS for organizations with 8+ management levels and 50,000+ employees.

What is object-level security (OLS) and when should you combine it with RLS?

Object-level security restricts visibility of entire tables or columns in the data model — for example, hiding the Salary column from non-HR users. RLS restricts which rows a user can see. Combining OLS and RLS creates defense-in-depth: RLS limits data rows to the user's scope, while OLS hides sensitive columns entirely. This hybrid approach is essential for healthcare (HIPAA), financial services (SOX), and any environment where column-level sensitivity varies by role.

Does row-level security affect Power BI report performance?

Yes, but the impact is manageable with proper design. RLS adds DAX filter evaluation to every query, which increases query time by 5–15% in well-designed models. Performance degrades when RLS DAX filters use complex calculations, reference large security tables without proper relationships, or chain multiple LOOKUPVALUE calls. EPC Group optimizes RLS performance by denormalizing security tables, using direct relationships instead of DAX lookups, and leveraging composite models to isolate security-filtered datasets.

Need Help Securing Your Power BI Data?

EPC Group's Power BI Security Assessment includes a complete RLS audit, OLS evaluation, and automated testing framework implementation. We have secured environments with 15,000+ users across healthcare, financial services, and government. Call (888) 381-9725 or schedule an assessment.

Schedule a Power BI Security Assessment

Power BI Strategy: 2026 Considerations for Blog Power BI Row Level Security Enterprise Configuration

Row-level security (RLS) and object-level security (OLS) in Power BI Premium and Fabric F-SKU capacities are the single most-overlooked compliance control in HIPAA, SOC 2, and FINRA-regulated environments. RLS scoped via service principal authentication (rather than embedded UPN passes) is the only pattern that survives a SOC 2 Type II auditor privilege-walk test. EPC Group includes service-principal RLS as a default in every regulated-industry Power BI engagement.

Power BI Copilot grounds itself on the semantic model, NOT the underlying source data. That means Copilot answers are only as accurate as the DAX measure definitions, the field metadata (display folders, descriptions, hierarchies), and the synonyms taxonomy. In practice, the difference between a Copilot deployment that drives 32% time-savings and one users abandon within 90 days is whether the semantic model was Copilot-prepared.

Decision factors EPC Group evaluates

  • License optimization audit (Pro vs Premium Per User vs F-SKU)
  • Row-level security via service principal authentication
  • Capacity sizing decision (F2/F4/F64+) tied to peak concurrent users and refresh window
  • Copilot grounding quality assessment of semantic-model metadata
  • Direct Lake mode adoption for Fabric-resident semantic models

For a tailored read on this topic in your specific tenant, contact EPC Group at contact@epcgroup.net or +1 (888) 381-9725. Engagement options at /pricing.