| name | rls-design-checklist |
| description | Gate-by-gate checklist for designing Tableau row-level security (RLS): mechanism selection (user filter vs entitlement table vs data-policy VDM), implementation verification, performance impact assessment, and the mandatory security-reviewer escalation criteria. Owned by tableau-admin. |
RLS Design Checklist
When to invoke
- Designing RLS for a new Tableau workbook or data source.
- Auditing an existing RLS implementation before a security review.
- A user reports seeing data they should not, or not seeing data they should.
- Migrating RLS from user filters to a data-policy / entitlement-table approach.
Critical preamble
RLS is a security control, not a convenience filter. Every RLS design must be reviewed by ravenclaude-core/security-reviewer before production publish. This checklist prepares the design for that review — it does not substitute for it.
Gate 1 — Choose the RLS mechanism
| Mechanism | How it works | Use when |
|---|
| User filter (calculated field) | USERNAME() or USERDOMAIN() in a calculated filter; user-to-value mapping in the workbook | Small, stable user-to-dimension mapping; Tableau Server/Cloud with named users |
| Entitlement table (data-source join) | Join/blend a permission table that maps [Username] → [Allowed Dimension Value]; filter on match | Dynamic, database-managed entitlements; many users; self-service permission updates |
| Virtual Connection / Data Policy (Tableau Cloud) | Centralised RLS defined once in a Virtual Connection; enforced at the data layer for all downstream workbooks | Multi-workbook or multi-user organisation; Tableau Cloud; need central governance |
| Initial SQL injection | Session-level variables injected at connect time; filter applied in SQL | Live connections to databases that support session variables (Snowflake, Redshift, BigQuery) |
Decision rule: prefer the entitlement-table or data-policy approach for any deployment with > 20 users or > 1 data source — user filters in workbooks are fragile, duplicated, and hard to audit.
Gate 2 — Implementation checklist (entitlement table approach)
Gate 3 — Performance impact assessment
RLS implemented via a join to an entitlement table adds a per-query filter. Measure:
- Before RLS: record average query time on the target workbook (Performance Recording).
- After RLS: record the same query with RLS active for a mid-cardinality user (50–200 allowed values).
- If query time increases > 2×: add an index on the join key in the entitlement table, or materialise the entitlement join in the extract using Tableau Prep.
High-cardinality RLS (e.g., per-customer data in a 10 M row table, 100 K customers) may require partitioned extracts or Virtual Connections — a single filtered extract for all users will not scale.
Gate 4 — Security escalation criteria
Escalate to ravenclaude-core/security-reviewer whenever ANY of the following are true:
Gate 5 — Ongoing governance
Pitfalls
- A user filter built into the workbook as a calculated field with a hardcoded mapping — breaks every time a user is added/removed; must be edited in every workbook.
- RLS applied only on a "Total" sheet but not on the underlying detail sheet — users navigate directly to the detail via a URL and see unfiltered data.
- Testing RLS only with the workbook owner's account — the owner bypasses RLS (Tableau Server). Always test with a named test user with no admin rights.
- Using
ISMEMBEROF() (group membership) as the RLS control — group membership changes are often delayed by AD sync; test the lag before relying on it.