SumiCo DataSumiCo DataBuilt with purpose
← All notesTHE SUMICO NOTEBOOK / POWER BI

Row-level security, explained without the jargon

How the owner sees everything and a sales lead sees only their own rows, and what it actually costs to set up.

Row-level security is one of those phrases that sounds more complicated than what it actually does. Once you strip away the terminology, it is a simple idea: the same report, opened by two different people, shows different rows of the same table, because the model knows who is looking at it.

The problem it solves

Say you run a report on sales performance across a team of eight reps. The owner wants to see everyone's numbers, side by side, to spot who is ahead and who needs help. Each rep, understandably, should not see the other seven people's deal values, commission or client list. Without row-level security, you are stuck with two bad options: build one report that shows everything to everyone, which nobody feels comfortable sharing with the whole team, or build eight separate reports by hand, one per rep, which someone then has to update every time the model changes.

Row-level security removes that choice entirely. There is one report, one model, refreshed once. What each person sees when they open it depends on who they are, applied automatically at the point the data is read, not manually filtered by whoever built the report.

How it actually works, without the jargon

Underneath, the model has a table that maps each person to what they are allowed to see, usually their email address next to whatever they own: their assigned client list, their region, their department. When someone opens the report, Power BI checks who is logged in, looks them up in that mapping table, and filters every other table in the model down to only the rows connected to that person, before anything renders on screen.

The important part is that this filtering happens at the data layer, not the visual layer. It is not a matter of hiding a chart or greying out a filter option that a curious user could click around. The rows that belong to someone else are never sent to that person's screen in the first place, which is the actual security guarantee, not a cosmetic one.

Where it gets more involved

The simple case, one flat mapping of person to client list, is quick to set up. It gets more involved once the business has a hierarchy: a regional manager who should see their own region's five reps but not the other regions, an owner who sees everything, a rep who sees only themselves. That requires the mapping table to understand roles, not just individuals, and the filtering logic to apply differently depending on where someone sits in that hierarchy. It is still very buildable, it just takes real setup time to get the role logic right and, just as importantly, to test it properly before anyone with restricted access opens the report for the first time.

Testing matters more here than almost anywhere else in a Power BI build, because the failure mode is not a wrong number on a chart, it is someone seeing data they should never have had access to. I test every row-level security setup by actually logging in as each role, not just checking the logic on paper, before it goes anywhere near a live client.

What it costs to set up

For a flat structure, one person to one filtered slice of the data, this is usually a modest addition to a build, mostly the mapping table and the filter rule itself. For a role-based hierarchy with several levels, it is meaningfully more work, both to build the logic and to test every role's view before launch. We ask who should see each slice during scoping, because "everyone sees everything" and row-level security have materially different build and testing needs.

When you actually need it

If everyone who opens the report is already trusted to see everything, meaning it is just the owner and one or two managers, row-level security is unnecessary complexity for a problem you do not have. It earns its cost the moment a report needs to go to more people than should see all of the underlying data, whether that is a sales team, multiple department heads, or an external client who should only ever see their own project inside a shared platform. If you are not sure which case you are in, that is exactly the kind of question the diagnostic is built to answer before anything gets quoted.

FROM IDEA TO A USEFUL ANSWER

Have a data question of your own?

Tell us what you need to understand. We’ll shape the first step together.