Row-Level Security in Power BI

Getting It Right the First Time

Row-level security, or RLS, is how you make one Power BI report show each person only the rows they're allowed to see: a regional manager sees their region, a client sees their own account, and nobody sees the whole table unless they should. It's one of the most useful features in Power BI and one of the easiest to get subtly wrong, in ways that either leak data or block the people who need it. This guide explains what RLS is, how it works, the two ways to build it, the mistakes that bite, and how to get it right the first time. 

01

The Plain English Definition

RLS filters the rows of your data based on who’s viewing the report. You define security roles with a rule for each, and Power BI applies that rule at query time, so every visual, export, and drill-through shows only the permitted rows. One report serves everyone, and each person sees only their own slice. 

02

Static vs Dynamic, in a Sentence

There are two ways to do RLS. Static RLS hardcodes the rule into each role, one role per group, for example a rule that says region equals West. Dynamic RLS uses a single role that reads the signed-in user’s identity and looks up their access in a mapping table, so it filters differently for every user without a role per person. 

03

Where RLS Is Set Up and Assigned

You define the roles and their rules in Power BI Desktop, then publish, then assign people or groups to those roles in the Power BI Service. The split trips people up: you can’t assign members in Desktop, and the report won’t enforce anything until members are assigned in the Service. 

04

What RLS Does Not Cover

RLS secures rows. It doesn’t hide columns or whole tables, that’s object-level security, a separate mechanism. If a salary column shouldn’t be visible at all, RLS is the wrong tool, and you’d reach for object-level security instead. Knowing which control does which job is half of getting security right. 

05

The Business Case in One Sentence

One properly secured report replaces a pile of near-duplicate reports built per team, which cuts maintenance, keeps everyone on the same definitions, and, for regulated data, turns access control into something you can demonstrate. 

How Row-Level Security Works

RLS follows a clear sequence, and understanding each step keeps the setup predictable. 

Step One: Define Roles in Power BI Desktop

In Desktop, open Manage Roles, create a role, and write a DAX filter on the table you want to secure. The filter is a boolean expression that keeps the rows where it’s true, for a static role, something like a fixed region value. 

Step Two: Choose Static or Dynamic

Decide early. Static suits a handful of fixed, rarely-changing groups. Dynamic is the recommended choice for anything beyond a few roles, because it scales to thousands of users through one role and a mapping table instead of a role per group. 

Step Three: Build the Security Mapping Table

For dynamic RLS, add a table that maps each user’s email to what they’re allowed to see, for example user to region, or user to customer. The role’s DAX filter uses USERPRINCIPALNAME to match the signed-in user against that table, and relationships carry the filter to the data. Get this table right and dynamic RLS mostly takes care of itself. 

Step Four: Assign Members in the Service

After publishing, assign members to each role in the Power BI Service. Assign Microsoft Entra security groups rather than individuals wherever you can, so access follows group membership and you’re not editing roles every time someone joins or leaves. 

Step Five: Test Every Role

Before anyone relies on it, test. Use View as in Desktop and Test as role in the Service to see exactly what each role sees, including the empty result that tells you a rule is too strict. Untested RLS is the most common way a leak or a blank report reaches a user. 

The table sums up the choice between the two approaches. 

Aspect Static RLS Dynamic RLS
How the rule works
Hardcoded value per role
Reads the user, looks up a mapping table
Roles needed
One per access group
One role for everyone
Scales to many users
Poorly
Yes, to thousands
Maintenance
Edit roles on every change
Update the mapping table
Best for
A few fixed groups
Most real deployments

Static RLS is fine for a few fixed groups. For almost everything else, dynamic RLS with a mapping table is what keeps the setup manageable as people and access change. 

Why Getting It Right the First Time Matters

RLS is worth extra care up front, for a few reasons. 

A Leak Is Worse Than a Blank Report

The two failure modes aren’t equal. A too-strict rule shows someone an empty report, annoying but safe. A too-loose rule shows someone data they shouldn’t see, which is a breach. Designing for the safe failure is the whole game. 

Retrofitting Is Painful

Adding RLS to a model and reports built without it means revisiting relationships, measures, and every visual’s assumptionsIt’s far cheaper to design security in from the start than to bolt it on once reports are in use. 

It Is a Governance Line

For regulated data, health, finance, personal information, who can see which rows is a control you may have to prove. Treating RLS as part of your data governance, rather than a last-minute report setting, is what makes that provable. 

Trust Depends on It

The first time a user spots another team’s numbers in what should be their private report, they stop trusting the platform. Correct RLS is load-bearing for confidence in every report you publish. 

What Row-Level Security Is Not

A few misconceptions cause most of the trouble. 

It Is Not Column or Table Security

RLS controls rows. Hiding specific columns or entire tables is object-level security, a different feature. Reaching for RLS to hide a column leads to awkward workarounds that don’t hold. 

It Is Not Something Viewers Can Remove

Applied correctly, RLS can’t be turned off by the person viewing the report. The filter holds through visuals, exports, and drill-through, so a user can’t export their way around it. 

It Is Not Applied to Editors and Admins

RLS filters report viewers. Workspace admins and members with edit or build access can see the underlying model in full, so RLS is not a substitute for managing who has edit rights to the workspace. 

It Is Not Free of Performance Cost

RLS adds filtering work at query time, and complex security rules can slow reports, especially with bidirectional relationships or heavy mapping tables. Good design keeps the rules and the model lean. 

It Is Not Only for Large Enterprises

A ten-person firm sharing one client dashboard needs RLS as much as a bank does. Any time one report serves audiences who shouldn’t see each other’s rows, RLS is the right tool. 

The Mistakes That Bite Most

Most RLS problems come from a short list of avoidable errors. 

Mistake What Goes Wrong
Hardcoding static roles
Roles multiply and fall out of date
Assigning individuals, not groups
Access breaks every time staff change
Ignoring relationship direction
Filters don’t reach the fact table, data leaks
Assuming editors are filtered
Workspace editors see everything
Skipping role testing
Leaks or blank reports reach users
Over-complex security rules
Reports slow to a crawl

Nearly every one of these is caught by two habits: default to dynamic RLS with security groups, and test as every role before you publish. 

How to Get RLS Right the First Time

Getting RLS right is a governance discipline as much as a DAX one. A few habits make the difference. 

Prefer Dynamic RLS With Security Groups

Default to dynamic RLS driven by a mapping table, and assign roles to security groups. This combination scales, survives staff changes, and keeps your roles few and legible. 

Handle Relationship Direction Deliberately

By default RLS filters flow in one direction, so a rule on a dimension may not reach a fact table unless you check “apply security filter in both directions” on the relationship. Map out how each rule needs to propagate before you rely on it. 

Keep the Mapping Table Clean

Your dynamic RLS is only as correct as the table behind it. Keep the user-to-access mapping current, sourced from a system of record where possible, so access reflects reality without manual edits. 

Test as Every Role, Every Release

Make role testing part of every publish, not a one-time check. Confirm each role sees exactly its rows, and that a user in no role sees nothing, before the report reaches its audience. 

Watch Performance

Keep security filters simple, avoid unnecessary bidirectional relationships, and test report speed with RLS applied, since a rule that’s correct but slow still fails the user. 

Where RLS Matters Most

RLS earns its keep wherever one report has to serve people who must not see each other's data. Client-facing dashboards where each customer sees only their own account. Regional or divisional reports where managers see only their patch. HR and finance reports carrying personal or sensitive figures. Multi-tenant setups where one model serves many organizations. In each case, the alternative, a separate report per audience, multiplies maintenance and invites the very inconsistency RLS prevents. The common thread is one dataset, many audiences, and a hard line between what each may see. 

Taking the Next Step

Map Your Access Rules First

Before touching DAX, write down who should see what: the roles, the dimensions they filter on, and where the mapping data lives. That map makes the implementation straightforward. 

Build It Into the Model From the Start

Design RLS alongside the model, not after. Getting relationships, grain, and the mapping table right up front avoids the painful retrofit later. 

Final Thoughts on Row-Level Security

Row-level security is what lets one trustworthy report serve an entire organization safely. Done deliberately, with dynamic roles, clean mapping, and real testing, it fades into the background and just works. Done in a hurry, it’s the setting most likely to leak the wrong row to the wrong person. 

Get Your Power BI Security Right With Allston Yale

If you’re sharing reports across teams, clients, or regions and need each audience walled off from the rest, RLS is the tool, and getting it right the first time is worth doing with help. We’re Texas-based Power BI and Microsoft Fabric consultants, and our Power BI consulting designs row-level security into your models so the right people see the right rows, tested and provable. Book a free data check-up with us today. 

Scroll to Top