Row-level security (RLS) and object-level security (OLS) are the foundational mechanisms that determine which data a user can see and which model objects they can access inside a BI platform. Implemented incorrectly, these controls leak sensitive data, degrade performance, or silently allow bypasses through workspace roles and bidirectional filter propagation. This cheat sheet covers the full security stack across Power BI, Tableau, Looker, and Qlik — from basic DAX filter expressions and dynamic identity lookups to entitlement tables, section access, audit logging, and Microsoft Fabric's cross-engine enforcement model.
What This Cheat Sheet Covers
This topic spans 12 focused tables and 74 indexed concepts, 73 flashcards. Below is a complete table-by-table outline of this topic, spanning foundational concepts through advanced details.
A jump-to index of every table row in this cheat sheet.
An interactive map of every table and concept in this topic.
Table 1: RLS Fundamentals and Types
Static and dynamic RLS differ in where the user identity is encoded — directly in the DAX filter expression versus resolved at query time from a mapping table. Understanding this distinction, plus how filters propagate across relationships, is the prerequisite for every platform-specific implementation that follows.
| Type | Example | Description | |
|---|---|---|---|
[] = "East" | • DAX filter hardcoded in a role definition • all members of the role see the same fixed slice of data | ||
[Email] = USERPRINCIPALNAME() | • Filter expression uses an identity function resolved at query time • each user automatically sees only their own rows | ||
Sales[CustomerID] = Security[CustomerID] AND Security[Email] = USERPRINCIPALNAME() | RLS filter on one table cascades across relationships to related tables following the cross-filter direction. | ||
User in both East and West roles | • When a user belongs to multiple roles, the results are a union (OR) of all allowed data • filters are never intersected | ||
WHERE Region = 'East' pushed to source | • RLS filters are pushed down to the underlying SQL source • supported but adds network round-trip overhead | ||
DAX evaluated against in-memory model | • Filters applied entirely in-memory after data is imported • no source query modification |