Best BI tools for row-level security in 2026: 9 platforms compared
Max Musing
Max MusingFounder and CEO of Basedash
· March 26, 2026

Max Musing
Max MusingFounder and CEO of Basedash
· March 26, 2026

Row-level security (RLS) in a BI tool restricts which rows each user can see based on identity, group, or attributes, enforced at the query level rather than by hiding dashboards. Every platform in this comparison supports RLS, but they differ on where the rule lives (BI layer or database), whether it covers AI-generated queries and exports, how it works in embedded dashboards, and what it costs. Power BI and Looker have the most mature BI-layer implementations. Sigma, Omni, Lightdash, and ThoughtSpot use user attributes that work well for embedded and multi-tenant use, and Metabase offers SQL-based sandboxing on paid plans. Basedash passes the user’s groups to PostgreSQL so native database policies filter every query, including the ones its AI writes.
This comparison focuses on teams for whom RLS is a hard requirement, including SaaS companies embedding customer-facing dashboards, sales and finance teams whose reps should see only their own accounts, and regulated organizations that need to prove access control to an auditor. Pricing was re-verified against each vendor’s public pricing page in September 2026.
basedash.groups session variable, so the database, not the app, filters every chat, dashboard, automation, and Slack query. RLS is Postgres-only today.Row-level security filters query results based on the authenticated user before data reaches a chart, dashboard, export, or AI answer. There are three architectural patterns:
The layer decides what happens when something goes wrong. If a credential leaks, a second tool connects to the warehouse, or an AI agent writes an unanticipated query, application-layer RLS protects only the tool that holds the rule, while database-layer RLS protects the data regardless of the access path.
Auditors increasingly ask where a control is enforced. The Verizon 2025 Data Breach Investigations Report, which analyzed 12,195 confirmed breaches, found credential abuse was the initial access vector in 22% of them and exploited vulnerabilities in 20%, a 34% year-over-year increase for the latter. Controls that hold at the data layer are simpler to defend under SOC 2, HIPAA, and GDPR because they do not depend on every application being configured correctly.
The table compares nine platforms on the attributes that decide an RLS evaluation. Prices are list prices from public pricing pages, verified September 2026; quote-based vendors are marked as such.
| Tool | RLS method | Identity source | Embedded RLS | AI query coverage | Pricing (verified Sep 2026) |
|---|---|---|---|---|---|
| Power BI | DAX roles (static and dynamic) | Microsoft Entra ID, USERPRINCIPALNAME() |
Yes, embed tokens carry roles | Copilot respects RLS roles; Copilot needs Fabric capacity | Pro $14/user/month; Premium Per User $24; Fabric capacity for Copilot and embedding |
| Looker | LookML access_filter, sql_always_where |
User attributes from SAML/OIDC | Yes, embed SSO passes attributes | Conversational Analytics respects access filters | Quote-based, annual; Standard edition includes 10 standard and 2 developer users |
| Tableau | User filters, data source filters, data policies with entitlement tables | Tableau users and groups, SAML attributes | Yes, connected apps pass user attributes | Tableau Agent and Pulse respect workbook and data policy filters | Standard from $15/user/month, Enterprise from $35 (annual); Creator, Explorer, Viewer roles |
| Sigma | User attributes in data model filters | Sigma teams and attributes, SSO | Yes, dynamic attributes per embed session | Ask Sigma queries carry user attributes | Quote-based; free trial |
| ThoughtSpot | Rule-based RLS with ts_groups, ts_username; ACL tables |
ThoughtSpot groups from SAML/OIDC | Yes, trusted authentication passes user context | Spotter answers filtered by RLS rules | From $25/user/month (5 to 50 users, no Spotter); $50/user/month with limited Spotter; Enterprise custom |
| Metabase | Data sandboxing (saved SQL with user attribute variables) | JWT or SAML attributes | Yes, sandboxes apply to embeds | Metabot AI questions run inside sandboxes | Open source free (no sandboxing); Pro $575/month for 10 users plus $12/user; Enterprise from $20,000/year |
| Omni | Access filters on user attributes in the shared model | Omni users and attributes, SSO | Yes, embed sessions set attributes | Omni AI queries are model-governed and filtered | Quote-based |
| Lightdash | User attributes referenced in dbt sql_filter |
Lightdash groups and attributes, SSO | Yes, embed tokens set attributes | AI agents query through the same semantic layer and filters | Open source free (self-hosted); Cloud Pro $3,000/month, unlimited users; Enterprise custom with SAML and SCIM |
| Basedash | PostgreSQL policies keyed on basedash.groups session variable |
Basedash groups (SAML SSO and SCIM on Enterprise) | Yes, policies apply to every connection Basedash opens | All AI-generated SQL, dashboards, automations, and Slack answers filtered by the database | Startup $1,000/month plus AI usage, up to 25 users, 14-day trial; Enterprise custom with SSO, SCIM, audit logs, self-hosting |
Eight of the nine tools define RLS inside the BI application. They differ mostly in how identity arrives (Entra ID, SAML attributes, JWT claims), how the rule is expressed (DAX, LookML, YAML, saved SQL, GUI), and how cleanly the same rule extends to embedded sessions. Basedash is the outlier: it sets a session variable and lets PostgreSQL decide, which is more portable but only works for Postgres today.
The trade-off is configuration convenience versus enforcement scope. A Looker developer can add an access_filter in five minutes and it protects every Looker query path. A PostgreSQL policy takes a database administrator and a migration, but it also protects the same table from every other tool that sets the same context.
Power BI implements RLS through DAX role definitions in the semantic model. Static RLS hardcodes a filter per role (a “West Region” role that sees Region = "West"). Dynamic RLS uses a security table that maps user principal names to permitted values and a filter such as [UserEmail] = USERPRINCIPALNAME(), so one role serves thousands of users.
Dynamic RLS is the right default for anything beyond a handful of roles. Roles apply in the Power BI service, in Teams, and in embedded reports through embed tokens that name the effective identity and roles. Copilot answers inherit the user’s RLS role, but Copilot itself requires Fabric capacity rather than a Pro license alone.
Looker enforces RLS in LookML with access_filter (map a user attribute to a field and filter every query) and sql_always_where (inject a WHERE clause into every SQL statement from an Explore). Because both live in the model, they apply to dashboards, scheduled deliveries, API calls, and embedded dashboards alike. There is no user-facing override.
These four share one idea (user attributes that resolve into SQL filters at query time) and differ in how the attribute is defined and how it reaches an embedded session.
Sigma resolves user attributes and functions such as CurrentUserEmail() and CurrentUserAttributeText() at query time and pushes the resulting WHERE clause to the warehouse (Snowflake, BigQuery, Databricks, Redshift, or PostgreSQL). For embedded analytics, the embed session sets the attributes, so each customer sees only their rows without a separate workbook per tenant. Ask Sigma, the natural-language feature, runs with the same attributes. Pricing is quote-based.
ThoughtSpot uses rule-based RLS with the system variables ts_groups and ts_username. Rules support direct column filters (Region = ts_groups) and access control list tables that map users to entitlements, which scales to thousands of groups without individual rules. Rules on source tables flow to Models, Answers, Liveboards, and Spotter responses. Trusted authentication passes user context into embedded sessions. Spotter is not included on the entry $25 per user per month tier. The $50 tier includes 25 Spotter queries per user per month.
Omni defines access filters on user attributes in its shared model, the governed layer that sits between the raw schema and workbooks. Because workbooks and AI queries resolve through that model, the filter applies to ad hoc exploration and to embedded dashboards where the embed session sets the attributes. Pricing is quote-based.
Lightdash reads user attributes (set per user or per group, or passed in an embed token) and applies them through sql_filter definitions in your dbt project’s YAML, for example filtering a table by ${lightdash.attributes.tenant_id}. The filter is part of the same version-controlled semantic layer that Lightdash’s AI agents query. The open-source edition is free to self-host; Cloud Pro is $3,000 per month with unlimited users, and SAML and SCIM sit on the Enterprise plan.
Metabase calls its RLS feature data sandboxing, available on Pro and Enterprise. An admin saves a SQL question with user attribute variables (WHERE tenant_id = {{tenant_id}}), stores it in an admin-only collection, and assigns it as the sandboxed view of a table for a group. Attributes arrive through JWT or SAML. Sandboxes restrict rows and can hide columns, and they apply to embedded dashboards and to Metabot AI questions.
Sandboxes can express anything SQL can, but they take more maintenance because they are saved queries rather than declarative filters. The free open-source edition has no row-level permissions at all. Pro is $575 per month for 10 users plus $12 per additional user.
Basedash takes the hybrid, database-first approach. When any user runs a query, Basedash sets a PostgreSQL session variable, basedash.groups, to the comma-separated list of groups that user belongs to in the workspace. You write ordinary PostgreSQL policies that reference that variable:
ALTER TABLE orders ENABLE ROW LEVEL SECURITY;
CREATE POLICY orders_group_policy ON orders
FOR SELECT
USING (
current_setting('basedash.groups', true) IS NULL
OR department = ANY (
string_to_array(current_setting('basedash.groups', true), ',')
)
);
The IS NULL branch keeps your application’s direct connections working unchanged, since only connections that set the variable (Basedash) are filtered. Because the database applies the policy, it covers every path Basedash offers: AI chat, saved charts and dashboards, scheduled automations (which run with the creator’s groups), and Slack answers (matched to the Basedash user, or no rows if unmatched). Full setup is in the row-level security docs.
CREATE POLICY statements needs someone comfortable with PostgresFor a walkthrough of the database side, see how to enable row-level security in PostgreSQL. The full set of controls (SSO, SCIM, RBAC, audit logs, self-hosting) is on the security page.
For a small company, the decision usually comes down to three questions: is there someone who can write DAX, LookML, or SQL; is one tool going to be the only access path; and does the budget tolerate per-seat pricing.
Avoid Looker, ThoughtSpot Enterprise, and Tableau Enterprise at this stage unless a specific integration requires them. Their RLS is excellent, but the pricing and modeling overhead are sized for larger teams.
Snowflake has its own row access policies, and the simplest secure design is to enforce them in Snowflake and have the BI tool connect with a role or session context Snowflake can evaluate. Sigma, Omni, ThoughtSpot, Looker, Tableau, Power BI (DirectQuery), Lightdash, and Metabase all query Snowflake live and can layer their own attribute-based filters on top. Basedash connects to Snowflake and respects the role you connect with, but its basedash.groups policy mechanism is Postgres-only, so per-user row filtering on Snowflake data in Basedash means Snowflake row access policies plus a dedicated role, or a Postgres replica. For a broader tool comparison on that warehouse, see best BI tools for Snowflake.
Six questions show whether a tool’s RLS will hold up in production.
Does RLS cover dashboards, exports, scheduled deliveries, API calls, embedded sessions, and AI-generated queries? Looker, ThoughtSpot, and Basedash cover every path by construction. For any tool, ask: if a user exports to CSV, does the export respect the filter?
Where does the tool learn who the user is? The strongest implementations read attributes from your identity provider (Okta, Entra ID, Google Workspace) via SAML or OIDC and support SCIM so group membership stays in sync. Manual user-to-role mapping inside the BI tool tends to drift out of date.
If you embed dashboards in your product, the tool must accept identity from your application (JWT, signed embed URL, trusted authentication) and set attributes per session. Sigma, Omni, Lightdash, Looker, and Metabase handle this with per-session attributes. For architecture beyond RLS, see embedded analytics for SaaS and the embedded analytics platform comparison.
Can you show which user saw which rows when? ThoughtSpot and Looker have detailed system activity logs; Power BI needs Azure Monitor for query-level detail; Basedash and Metabase (Pro) ship audit logs; database-layer designs also leave a trail in the database’s own query log.
RLS adds a predicate to every query. Keep filtered columns indexed or clustered. In Power BI, import mode evaluates DAX in memory (fast) while DirectQuery pushes to the database (variable). ThoughtSpot’s strict RLS mode favors correctness over speed. In PostgreSQL, a policy on an indexed column adds little; a policy that calls a function per row can be expensive.
Rules written in DAX, LookML, or a vendor GUI stay with that vendor, while rules written as database policies or dbt YAML move with you. Weigh this if you expect to change BI tools within a few years.
The sales-team case is the most common RLS request and a good test of any tool. The pattern is the same everywhere:
owner_email, owner_id, or team_id. If ownership lives in another table, join it into a view first.USERPRINCIPALNAME(), Sigma CurrentUserEmail(), Metabase or Lightdash attributes). Group or team is easier for managers who should see a whole region.[owner_email] = USERPRINCIPALNAME(). Looker: access_filter: { field: deals.owner_email user_attribute: email }. Metabase: a sandbox with WHERE owner_email = {{email}}. Basedash: assign reps to groups and a Postgres policy that checks team = ANY(string_to_array(current_setting('basedash.groups', true), ',')).Power BI and Looker have the most mature application-layer implementations: dynamic roles with identity-provider integration, coverage of exports and embedded content, and years of production use. For enforcement that does not depend on the BI tool, database-layer RLS in PostgreSQL (used by Basedash through the basedash.groups session variable) or Snowflake row access policies are stronger because every client is filtered. The best choice depends on whether one tool is your only access path and who on your team can write DAX, LookML, or SQL.
Yes, for PostgreSQL databases. Basedash sets a basedash.groups session variable on every query with the user’s group memberships, and you write PostgreSQL policies that reference it. The policies filter AI chat answers, dashboards, scheduled automations, and Slack queries because PostgreSQL applies them, not the app. The managed Basedash Warehouse runs on DuckDB, so it is not covered by this PostgreSQL policy model and uses Basedash’s data source and table permissions instead. RLS for other databases is not available yet; those sources use the database’s own access controls plus Basedash’s data source and table permissions.
Power BI Pro ($14 per user per month) is the cheapest mature option if you are on Microsoft 365. Basedash’s Startup plan ($1,000 per month for up to 25 users) includes RLS and flat pricing, so viewers are free to add up to that limit. Metabase open source is free but has no row-level permissions; sandboxing starts on Pro at $575 per month. Lightdash open source is free to self-host with user attribute filters, and Cloud Pro is $3,000 per month with unlimited users. Looker, ThoughtSpot Enterprise, Sigma, and Omni are quote-based and generally sized for larger teams.
All nine support SAML single sign-on on some plan, and most can read RLS attributes from the SSO assertion: Power BI via Entra ID, Looker and Omni via user attributes, Sigma via teams and attributes, ThoughtSpot via groups, Metabase via JWT or SAML attributes on Pro, Lightdash on Enterprise, Tableau via SAML attributes with connected apps. Basedash offers SAML SSO and SCIM on its Enterprise plan; groups provisioned through SCIM become the values in basedash.groups. Check which plan tier includes both SSO and RLS, because several vendors gate one or the other.
It adds a predicate to every query, so the cost depends on whether the filtered column is indexed or clustered. In-memory engines (Power BI import mode) evaluate the filter quickly; DirectQuery and live-query tools push it to the database, where an indexed equality filter is cheap and a per-row function call is not. ThoughtSpot’s strict RLS mode prioritizes correctness over speed. Test with production-sized data during evaluation rather than trusting a demo dataset.
The AI writes SQL, and the RLS layer must filter that SQL like any other. Power BI Copilot inherits the user’s role. Looker’s Conversational Analytics respects access filters. Sigma, Omni, ThoughtSpot Spotter, Lightdash agents, and Metabot run through their governed models and attributes. Basedash sends every AI-generated statement to PostgreSQL with the user’s groups set, so the database filters it. Always test by asking the AI for “all rows” as a restricted user; early natural-language features from several vendors did not enforce RLS consistently.
Not within a correctly configured tool: Looker, ThoughtSpot, and Power BI inject filters with no user override. The bypass risk is outside the tool, when the same user reaches the database through a SQL editor, a second BI tool, or a leaked credential. Database-layer policies close that gap. Also verify that dataset-level access (for example, Power BI build permission on a semantic model) is not more permissive than the report.
Physical isolation gives you tenant separation without RLS, but it does not scale past a few hundred tenants, complicates cross-customer analytics, and multiplies migrations. Most SaaS analytics use one database with a tenant_id column and row-level filtering. Several tools (Sigma, Omni, Lightdash, Metabase, Basedash on Postgres) are designed around that single-database, attribute-filtered pattern.
Row-level security decides which records a user sees; column-level security decides which fields. Power BI handles columns with object-level security, Looker with hidden or access-grant dimensions, Metabase sandboxes can hide columns, Snowflake uses masking policies, and PostgreSQL uses column privileges or views. Most compliance programs need both: rows for tenant or territory isolation, columns for PII and compensation data.
None name it explicitly, but SOC 2 requires least-privilege access controls, HIPAA requires role-based access to protected health information with audit trails, and GDPR requires that personal data be accessible only for authorized purposes. RLS is the standard technical control that satisfies those requirements in analytics, and auditors will ask where it is enforced and how you test it. Pair it with SSO, audit logging, and column masking; see data governance for AI-powered BI for the wider checklist.
Written by

Founder and CEO of Basedash
Max Musing is the founder and CEO of Basedash, an AI-native business intelligence platform designed to help teams explore analytics and build dashboards without writing SQL. His work focuses on applying large language models to structured data systems, improving query reliability, and building governed analytics workflows for production environments.
Basedash lets you build charts, dashboards, and reports in seconds using all your data.