INSIGHTS
Cybersecurity

Microsoft DP-600: Row-Level Security in Fabric and Power BI

In this article
  1. Understand where Power BI RLS is enforced
  2. Choose static roles only when the audience is truly stable
  3. Use dynamic RLS for identity-driven access
  4. Model relationships so security filters propagate predictably
  5. Validate role behavior with representative identities
  6. Know the interaction between RLS and workspace roles
  7. Coordinate semantic RLS with OneLake and source security
  8. Design for Direct Lake, Import, and DirectQuery behavior
  9. Keep security tables small, stable, and auditable
  10. Treat RLS as part of the model lifecycle

Row-level security controls which records a user can see without requiring a separate report or dataset for every audience. In Microsoft Fabric and Power BI, RLS is especially useful when many people should use the same semantic model but are allowed to see different slices of data, such as their own region, department, customer portfolio, or legal entity. The security rule becomes part of the analytical model instead of being copied into every report.

The current DP-600 role includes implementing and managing semantic models, while PL-300 covers Power BI data modeling and report delivery. RLS sits directly between those responsibilities because a role is technically implemented in the model but experienced by report consumers.

A strong RLS design begins with identity and model grain. Decide who the user is, which business entity determines visibility, how that entity relates to the facts, and how access should change when roles or assignments change.

Understand where Power BI RLS is enforced

Power BI RLS filters rows in a semantic model according to role definitions. Roles are normally created in the model with DAX filter expressions, then members are assigned to those roles after publication. When a qualifying user queries the model, the filter context limits the rows that can contribute to the result.

RLS is not a substitute for every other permission layer. Workspace roles matter. Microsoft documents that RLS restricts users with Viewer permissions, while workspace Admin, Member, and Contributor roles are not constrained in the same way. That means an organization cannot give broad workspace edit rights and then expect semantic RLS to serve as the final security boundary.

Separate authoring access from consumption access. Developers and model owners may require elevated permissions, while business consumers should usually access the published artifact through a role that allows RLS to apply as intended.

Choose static roles only when the audience is truly stable

Static RLS uses rules that represent a fixed audience, such as a role that always filters Region to “West.” It is simple to understand and can be appropriate when there are only a few stable groups with clear business definitions. A small executive model might have Finance, Operations, and Sales roles with deliberately different slices.

The weakness of static design is operational growth. If the organization has fifty territories, creating fifty roles can become difficult to maintain and test. Every organizational change can require model updates or repeated role administration. Static roles are strongest when the number of access patterns is small and unlikely to change frequently.

Do not create a static role for every user. That moves identity administration into the model and creates an avoidable maintenance problem.

Use dynamic RLS for identity-driven access

Dynamic RLS derives access from the current user identity and a mapping table rather than creating a different role for every audience. DAX functions such as USERPRINCIPALNAME can identify the querying user, while a security mapping table relates that identity to permitted business entities.

A common pattern stores user principal names and region keys in a bridge table. The role filters the bridge to the current user, relationships propagate permitted region keys to a dimension, and the dimension filters the fact table. The same model can then support hundreds or thousands of users without hundreds of roles.

Keep the mapping authoritative. If access is driven by a spreadsheet that no one owns, the technical RLS may be correct while the business authorization is wrong. Prefer a governed source tied to HR, CRM ownership, territory management, or another system with a defined process for changes.

Model relationships so security filters propagate predictably

RLS depends on model relationships. The security table, business dimensions, and facts should form a filter path that is easy to reason about. Ambiguous relationships, excessive bidirectional filtering, or many-to-many structures can make security behavior difficult to test and can affect performance.

A star schema is usually easier to secure because dimensions describe business entities and facts carry transactional grain. If a user is allowed to see specific stores, a Store dimension provides a natural place for that access rule to propagate to sales facts.

The broader principles in semantic-model design matter directly here. A model that is difficult to understand is also difficult to secure with confidence.

Validate role behavior with representative identities

Security testing should include more than confirming that an allowed user sees data. Test that unauthorized users see nothing they should not, users with multiple assignments receive the union of their intended access, and users whose mapping has been removed lose access promptly.

Power BI provides “View as” and “Test as role” capabilities that help validate model logic. Use them during development and after significant changes. Include edge cases such as users with no mapping, users in multiple regions, external users, and test identities that should have zero data access.

Document expected row counts or business totals for a few representative roles. A test that simply confirms “the report loads” can miss overexposure.

Know the interaction between RLS and workspace roles

One of the most important operational rules is that RLS is designed for consumers, not privileged workspace authors. A user assigned Admin, Member, or Contributor access to the workspace can have broader model access than a Viewer. Treat workspace membership as a powerful entitlement.

This matters during troubleshooting. If a developer says RLS “does not work” while testing with an elevated workspace role, the issue may be the identity’s permissions rather than the DAX rule. Use dedicated Viewer-level test accounts or other supported test methods when validating production behavior.

Review workspace membership periodically. Users often accumulate edit rights while helping with a project and retain them long after the need has ended.

Coordinate semantic RLS with OneLake and source security

Power BI RLS protects the semantic model’s query results. It does not automatically secure every direct path to underlying Fabric data. If a user can query a lakehouse table or warehouse directly with broader storage permissions, the semantic-model rule is not the only security layer that matters.

OneLake and Fabric item permissions should therefore align with the reporting design. Storage-level controls can limit direct access, while semantic RLS provides business-facing filtering in the model. In some scenarios, row-level controls can also exist in the underlying data platform.

The general principle behind policy-driven access control applies: permissions should reflect identity and business authorization consistently across access paths, not only inside the most visible report.

Design for Direct Lake, Import, and DirectQuery behavior

RLS can be used with imported models and with supported DirectQuery scenarios, and Microsoft also supports RLS for Direct Lake semantic models. Storage mode changes performance characteristics, so security testing should include realistic query patterns rather than only functional checks.

DirectQuery sends more work to the source, which means source performance and query design matter. Direct Lake can provide fast access to OneLake-resident Delta data, but fallback behavior and model design can still influence query cost. Import provides in-memory performance but requires refresh planning.

The security rule itself should remain business-focused. Avoid embedding storage-mode assumptions into complex DAX when a clean relationship and mapping model can express the authorization more clearly.

Keep security tables small, stable, and auditable

Dynamic RLS tables are often small compared with business facts, but their correctness is critical. Store only the identity and business keys required for authorization. Give the mapping a clear owner and history so changes can be reviewed.

If access changes frequently, automate ingestion from the authoritative system. Manual edits are hard to scale and difficult to audit. For high-risk datasets, consider approval workflows or separation of duties so one person cannot silently grant themselves broader access.

Do not expose the security mapping unnecessarily in reports. It is an operational artifact used to enforce policy, not usually a business-facing dimension.

Treat RLS as part of the model lifecycle

Schema changes, renamed dimensions, new relationships, and redesigned measures can affect RLS. Include security tests in deployment and regression procedures. A model release should not be considered complete until role behavior has been verified alongside functional and performance checks.

The Power BI skills discussed in Power BI data analysis are strongest when modeling, calculation, and security are considered together. A polished visual cannot compensate for a model that exposes the wrong rows.

Dynamic RLS mapping tables should have explicit uniqueness and validity rules. A duplicate identity-to-region row may not change the visible result, but duplicates can signal upstream entitlement quality problems. More importantly, mappings should support effective dates when business assignments change over time. If a sales representative moves territories, decide whether access should change immediately or at a defined cutover and make that behavior auditable.

Complex organizational structures sometimes require hierarchical security. A regional manager may see all branches below a region while an individual branch manager sees only one branch. Model this using a maintained hierarchy or bridge rather than long hard-coded DAX expressions. Security logic should be driven by business structure, not by a growing list of names embedded in formulas.

Performance testing matters because security filters change query shape. A model that is fast for an unrestricted developer can behave differently when a dynamic security bridge filters thousands of entities. Test with representative high- and low-access users, observe query plans and latency, and simplify relationship paths where possible. Security should not create an unpredictable experience for the very users it protects.

External users require special planning. Guest identities may use different principal-name formats, licensing and tenant policies can affect access, and business owners need a lifecycle for removing guest entitlements when collaboration ends. Test external scenarios with actual guest identities rather than assuming internal-user behavior will be identical.

Role membership changes should be separated from model deployment wherever possible. Business access changes occur more frequently than measure or relationship changes. A governed group or mapping source lets authorized owners update entitlements without republishing the semantic model for every staffing change.

Use negative tests deliberately. Create identities that should see no rows, identities that should see exactly one entity, and identities that belong to conflicting groups. Confirm the model fails closed when a mapping is missing or malformed. Positive testing proves that authorized work is possible; negative testing proves that the boundary exists.

Document the security model in business language. “Role X filters BridgeSecurity on UPN” is useful to a developer, but governance reviewers also need to know “regional managers see all stores assigned to their region; branch managers see only their branch.” Both descriptions belong in the operational documentation because the technical rule must be traceable to an approved business policy.

Hierarchical access can also be modeled with path or bridge techniques when managers inherit visibility from organizational structures. The design should be based on a maintained organizational dataset rather than a hand-built list inside DAX. Test reorganization scenarios because hierarchy changes can affect many users at once.

RLS should be reviewed whenever a new fact table or dimension is added. A new table that is not connected to the security path may expose data that appears in the same report but is not filtered by the intended role. Security regression testing should therefore cover new model objects, not only existing measures.

Composite and cross-source models deserve extra caution. A role that works correctly on one source may interact differently with another storage mode or remote model. Keep the security boundary as simple as possible and validate end-to-end behavior after architectural changes.

Support teams need a safe troubleshooting method. Instead of granting permanent elevated access, use test identities, controlled impersonation features where supported, or time-bound roles. Troubleshooting should not quietly turn into a standing exception that bypasses the production security model.

Documentation should also state the fallback behavior when identity data is unavailable. If the mapping table fails to refresh, the safest design is usually to preserve the last known valid policy or fail closed rather than silently grant broad access. Recovery procedures should identify who can repair the mapping and how affected users are informed.

When report authors build composite experiences from several semantic models, confirm that users do not infer restricted information indirectly through totals, drill-through, or cross-highlight behavior. RLS validation should include the report experience, not only isolated model queries.

Operational ownership should be split clearly between model developers and business entitlement owners. Developers maintain the security mechanism, relationships, and DAX; business owners approve who belongs to which access group. That separation prevents technical teams from becoming the informal authority for organizational permissions they are not positioned to judge.

When requirements change, update the business policy and test cases before changing the DAX. This preserves a traceable chain from approved access intent to technical enforcement and makes later audits easier.

Keep role names and security-table columns descriptive enough that a reviewer can understand their intent without decoding internal project abbreviations.

Security should remain understandable after the original developer leaves.

For teams operating in the Microsoft ecosystem, the best RLS design is the one that is easy to explain: authoritative identities map to permitted business entities, relationships propagate those permissions through a clean model, workspace roles preserve the boundary, and tests prove both allowed and denied behavior. That combination scales far better than duplicating reports for every audience.

Filed under Cybersecurity