Skip to content

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.

TL;DR

  • All nine tools compared here support row-level security. They differ on enforcement layer, identity integration, embedded support, AI query coverage, and price.
  • Power BI (from $14 per user per month) is the cheapest way to get mature RLS with identity-provider integration, and Copilot queries respect RLS roles.
  • Looker enforces RLS through LookML access filters that apply to every query path, including API and embedded, but is quote-based and needs LookML specialists.
  • Sigma, Omni, and Lightdash use user attributes that flow into SQL filters, which is the cleanest pattern for embedded multi-tenant analytics.
  • Metabase has SQL-based data sandboxing on Pro ($575 per month for 10 users) and Enterprise; the free open-source edition has no row-level permissions.
  • Basedash enforces RLS through PostgreSQL policies keyed on a basedash.groups session variable, so the database, not the app, filters every chat, dashboard, automation, and Slack query. RLS is Postgres-only today.
  • Pick BI-layer RLS when one tool is your only access path and you want fast setup; pick database-layer RLS when several tools touch the same data or an auditor wants the control at the data layer.

How does row-level security work in BI tools?

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:

  • Application-layer RLS. The BI tool keeps a mapping from users or groups to permitted values and appends a WHERE clause to every query it generates. Power BI, Looker, Tableau, Sigma, ThoughtSpot, Omni, and Lightdash all work this way. Setup is fast and lives in the BI tool, but the rule protects only queries that go through that tool.
  • Database-layer RLS. The database enforces policies itself. PostgreSQL row-level security policies, Snowflake row access policies, and BigQuery row-level access policies filter rows for any client that connects with the right context. The rule is universal, but someone has to write and maintain policies in the database.
  • Hybrid. The BI tool passes user context (an email, a role, a list of groups) into a session variable, and database policies reference that variable. Basedash uses this pattern for PostgreSQL. Metabase’s SQL sandboxing sits between the two: rules are SQL, but they run inside Metabase.

Why the enforcement layer matters

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.

Which BI tools have the strongest row-level security?

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

What the comparison reveals

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.

How does Power BI implement row-level security?

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.

Strengths

  • Deep integration with Microsoft Entra ID for identity resolution
  • Both static and dynamic patterns, plus object-level security on Premium and Fabric
  • RLS applies to the service and to embedded content through embed tokens
  • The cheapest mature RLS on this list at $14 per user per month on Pro

Limitations

  • DAX is required to define and debug roles
  • Rules live in the Power BI model, so they do not transfer if you switch tools
  • Import mode loads the full dataset first and filters at query time; DirectQuery pushes filters down but performance varies
  • Copilot and capacity-based embedding change the cost picture considerably

How does Looker handle row-level security?

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.

Strengths

  • Filters are code, so they get version control, review, and CI
  • One rule covers every query path, including API and embed
  • User attributes can be provisioned from SAML or OIDC and passed through embed SSO
  • Conversational Analytics answers respect the same access filters

Limitations

  • Requires LookML skills to configure and maintain
  • Pricing is quote-based with annual commitment; the Standard edition is scoped to teams under 50 users
  • Conversational Analytics moves to metered data tokens with overage billing from October 1, 2026, per Google Cloud’s pricing page
  • Access filters are Looker-specific and do not transfer

What RLS options do Sigma, ThoughtSpot, Omni, and Lightdash offer?

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

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

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

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

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.

How does Metabase handle row-level security?

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.

How does Basedash implement row-level security?

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.

Strengths

  • Enforcement is in PostgreSQL, so AI-generated SQL cannot bypass it
  • Policies are portable SQL, not a vendor DSL
  • Groups can be provisioned through SAML SSO and SCIM on the Enterprise plan, and every query is captured in audit logs
  • Flat pricing: the Startup plan is $1,000 per month for up to 25 users with $1,000 of monthly AI credits included, so RLS is not gated behind a higher tier

Limitations

  • RLS is supported for PostgreSQL only. The managed Basedash Warehouse runs on DuckDB, so it uses Basedash’s data source and table permissions rather than PostgreSQL policies. Snowflake, BigQuery, MySQL, and other sources rely on those databases’ own access controls plus Basedash’s data source and table permissions instead
  • Policies are group-based rather than per-user email by default; per-user isolation means one group per tenant or a mapping table
  • Writing and testing CREATE POLICY statements needs someone comfortable with Postgres

For 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.

Which BI tool has the best row-level security for a small company?

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.

  • Already on Microsoft 365 with an Excel-literate admin: Power BI Pro at $14 per user per month. Dynamic RLS with a security table is well documented and Entra ID handles identity.
  • Small team on PostgreSQL that wants AI querying without a modeling project: Basedash. Write one policy per sensitive table, assign users to groups, and the same policy filters every question anyone asks. Flat pricing means adding viewers does not add cost within the Startup plan’s 25-user limit.
  • Small team that wants free and self-hosted: Metabase open source has no row-level permissions, so budget for Pro ($575 per month) or use database views per group instead.
  • dbt shop that wants unlimited users: Lightdash Cloud Pro at $3,000 per month, or self-host the open-source edition and manage attributes yourself.

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.

Which BI tools support row-level security on Snowflake?

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.

What should you evaluate when choosing a BI tool for row-level security?

Six questions show whether a tool’s RLS will hold up in production.

Enforcement scope

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?

Identity resolution

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.

Embedded and multi-tenant support

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.

Audit trail

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.

Performance

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.

Portability

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.

How do you set up row-level security so reps see only their own deals?

The sales-team case is the most common RLS request and a good test of any tool. The pattern is the same everywhere:

  1. Add an owner column. Every deal row needs an owner_email, owner_id, or team_id. If ownership lives in another table, join it into a view first.
  2. Choose the identity key. Email is easiest when the BI tool knows the user’s email (Power BI USERPRINCIPALNAME(), Sigma CurrentUserEmail(), Metabase or Lightdash attributes). Group or team is easier for managers who should see a whole region.
  3. Write the rule. Power BI: a dynamic DAX role [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), ',')).
  4. Handle managers. Managers need a superset. Use a mapping table (manager to reps) joined in the rule, or a “sales-managers” group whose policy branch returns the whole region.
  5. Test as a rep. Log in as a real rep account, check dashboards, exports, and an AI question like “show me all open deals,” and confirm the row count matches what the rep should see.

What questions should you ask a vendor about row-level security?

  • Where is the rule enforced, in your application or in my database, and what happens to a query that bypasses your application?
  • Does RLS apply to exports, scheduled emails, API calls, embedded sessions, and AI-generated queries? Show me.
  • How do user attributes arrive: SAML assertion, OIDC claim, JWT, SCIM, or manual mapping?
  • Can one rule serve thousands of users (dynamic RLS), or do I create a role per group?
  • Which plan includes RLS, SSO, and audit logs, and what is the price at 25 and 100 users?
  • What is the query overhead of a typical rule on a 50 million row table, and what do you recommend indexing?
  • How do I test RLS as another user before going live?

Frequently asked questions

Which BI tool has the best row-level security?

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.

Does Basedash support row-level security?

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.

Which BI tools have row-level security for small business budgets?

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.

Which BI tools support row-level security with SSO?

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.

Does row-level security slow down queries?

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.

How does RLS work with AI-generated queries in BI tools?

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.

Can users bypass row-level security?

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.

Do I need RLS if I use a separate database per customer?

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.

What is the difference between row-level and column-level security?

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.

What compliance standards require row-level security?

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

Max Musing avatar

Max Musing

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.

View full author profile →

Basedash lets you build charts, dashboards, and reports in seconds using all your data.