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

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

For a small company that needs strong row-level security (RLS), four options cover most cases. Power BI Pro ($14 per user per month) is the cheapest mature choice on Microsoft 365. Metabase Pro ($575 per month for 10 users) bundles row and column security, SAML SSO, and self-hosting on one published plan. Apache Superset is free and has built-in RLS filters if you can run it yourself. Basedash ($1,000 per month for up to 25 users) passes each user’s groups to PostgreSQL, so native database policies filter every AI-generated query. Looker, Tableau, Sigma, ThoughtSpot, Omni, and Lightdash all support RLS too. They differ on where the rule runs, how it reaches embedded dashboards, and which plan includes SSO.
This comparison is for teams where RLS is a hard requirement. That includes SaaS companies embedding customer-facing dashboards, sales and finance teams whose reps should see only their own accounts, and regulated organizations that must show an auditor where access control is enforced. Every price and plan detail below was re-checked against the vendor’s official pricing page or documentation on October 5, 2026.
basedash.groups session variable so PostgreSQL policies filter chat, dashboards, automations, and Slack answers. RLS is PostgreSQL-only, and embedded dashboards isolate tenants with locked filter values rather than database policies.We built the criteria from the questions buyers actually ask AI assistants and Google about this topic, such as “best BI platform with strong row level security for a small company”, “which BI vendors include SSO and row level security in the base license”, and “which self-hosted BI dashboard tool supports PostgreSQL, row-level security, audit logs, and scheduled alerts for GDPR”. Each tool was checked on six points:
The table compares how each platform implements RLS. Prices are list prices verified October 5, 2026; quote-based vendors are marked as such.
| Tool | RLS method | Where the rule runs | Embedded RLS | AI respects RLS | Starting price (Oct 2026) |
|---|---|---|---|---|---|
| Power BI | DAX roles, static or dynamic with USERPRINCIPALNAME() |
Semantic model (BI layer) | Yes, EffectiveIdentity in the embed token |
Copilot only accesses data the user has permission to | Pro $14/user/month, PPU $24 (annual) |
| Tableau | User filters, USERNAME() / ISMEMBEROF() calcs, entitlement tables, data policies |
Workbook or virtual connection (BI layer) | Yes, connected-app JWT attributes read by USERATTRIBUTE() |
Tableau Agent and Pulse respect RLS | Creator $75, Explorer $42, Viewer $15 (Standard, annual) |
| Looker | LookML access_filter, sql_always_where, access_grant |
LookML model (BI layer) | Yes, embed users carry user attributes | Conversational Analytics respects access filters and grants | Quote only |
| Sigma | CurrentUserAttributeText(), CurrentUserInTeam(), CurrentUserEmail() filters in data models |
Data model, compiled to warehouse SQL | Yes, JWT user_attributes and teams per embed user |
Sigma Assistant works only with data the user can access | Quote only |
| ThoughtSpot | Rule-based RLS on ts_groups and ts_username |
Table and Model rules (BI layer) | Yes, trusted auth plus ABAC attributes in the JWT | Spotter enforces row- and column-level security | Essentials $25/user/month; Pro $50 with Spotter |
| Omni | access_filters on topics keyed to user attributes |
Shared semantic model (BI layer) | Yes, userAttributes in the signed embed URL |
Omni Agent queries respect Omni permissions | Quote only |
| Metabase | Row and column security (saved SQL with user attributes); impersonation | Metabase, or the database via impersonation | Yes, on Pro/Enterprise with JWT or SAML attributes | Metabot inherits the user’s permissions | Pro $575/month for 10 users |
| Lightdash | sql_filter with user attributes in dbt YAML |
dbt semantic layer (BI layer) | Yes, userAttributes in the embed JWT |
AI agents respect attributes in semantic mode only | Open source free; Cloud Pro $3,000/month |
| Superset / Preset | RLS filters assigned to datasets and roles | Superset (BI layer) | Yes, rls clauses on embedded guest tokens |
Preset Chatbot enforces RLS; AI Assist in SQL Lab does not | Superset free; Preset Professional $20/user/month |
| Basedash | PostgreSQL policies keyed on the basedash.groups session variable |
Your PostgreSQL database | Locked tenant filter values in a signed JWT, not database policies | AI chat, automations, and Slack queries filtered by PostgreSQL | Startup $1,000/month + AI usage, up to 25 users |
Nine of the 10 tools define RLS inside the BI application. They differ mostly in how identity arrives (Entra ID, SAML attributes, JWT claims) and how the rule is written (DAX, LookML, YAML, saved SQL, a formula, or a GUI). Basedash is the outlier: it sets a session variable and lets PostgreSQL decide, which protects the same table from every tool that sets that context but only works on PostgreSQL. Metabase’s impersonation is a partial exception too, since it switches the database role per user on Pro and Enterprise.
The trade-off is configuration convenience versus enforcement scope. A Looker developer can add an access_filter quickly, and it protects every Looker query path. A PostgreSQL policy takes a database administrator and a migration, but it also holds when someone reaches the table through a SQL client or a second BI tool.
Row-level security is rarely the gated feature. SAML SSO and SCIM usually are. This table shows the lowest published plan for each control, as of October 5, 2026.
| Tool | Lowest plan with RLS | SAML or OIDC SSO | SCIM | Self-hosted option | Free tier or trial |
|---|---|---|---|---|---|
| Power BI | Pro (RLS filters Viewers only) | Every plan, through Microsoft Entra ID | Provisioning happens in Entra ID | Power BI Report Server (supports RLS) | Free account; 30-day Pro trial |
| Tableau Cloud | Standard (user filters); data policies need Enterprise | Standard and above | Yes, once SAML, OIDC, or Google SSO is set up | Tableau Server | Free trial |
| Looker | All editions | All editions | No native Looker SCIM documented | No (Google-hosted) | 90-day trial instance |
| Sigma | Tier not published | SAML supported; tier not published | Supported; tier not published | No | 7-day trial |
| ThoughtSpot | Listed in plan capabilities; tier not clear | SAML, OIDC; tier not published | ThoughtSpot Cloud | ThoughtSpot Software | 14-day trial, no card |
| Omni | Tier not published | SAML and OIDC | Entra ID, Okta, Rippling | No (Omni-hosted on AWS or Azure) | Trial on request |
| Metabase | Pro | Pro (SAML and JWT) | Pro and Enterprise | Yes, every plan | Open source free; 14-day trial |
| Lightdash | Open source and every Cloud plan | Enterprise (Google SSO on Cloud Pro) | Enterprise | Yes (open source; Enterprise on-premises) | 21-day trial |
| Superset / Preset | Superset open source; Preset Professional | Superset: OAuth, OIDC, LDAP (SAML needs a custom security manager); Preset: Enterprise | Preset Enterprise | Yes (Superset) | Superset free; Preset Starter free for 5 users |
| Basedash | Startup (RLS is not on the Enterprise-only list) | Enterprise | Enterprise | Enterprise (Docker, Kubernetes with Helm, air-gapped) | 14-day trial, no card |
Only Metabase Pro publishes a self-serve price that includes row-level permissions, SAML SSO, SCIM, and self-hosting together. Power BI gets close by handling SSO and provisioning in Entra ID rather than in the BI license, and Tableau includes SAML and SCIM from Standard. For the full plan-by-plan breakdown of SSO, SCIM, audit logs, and certifications across 11 tools, see BI tool security features by plan.
Power BI defines RLS as DAX roles in the semantic model. Static roles hardcode a filter (a “West” 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. Embedded reports pass the user and roles in an EffectiveIdentity on the embed token (Microsoft RLS docs).
The detail that trips teams up is scope. Microsoft’s documentation states that “RLS only restricts data access for users with Viewer permissions. It doesn’t apply to workspace Admin, Member, or Contributor roles.” Anyone you add to a workspace as a Contributor sees every row, so share reports through apps or Viewer access when RLS matters. Object-level security hides whole tables or columns, and it also applies only to Viewers.
Power BI fact card
Tableau offers several RLS options: manual user filters, dynamic filters built on USERNAME() or ISMEMBEROF(), entitlement tables joined to the data, and centralized data policies on virtual connections (Tableau RLS overview). Data policies are the strongest option because one policy covers every workbook that uses the connection, but they need Data Management, which is included in the Enterprise edition. For embedded analytics, connected-app JWTs can pass user attributes that USERATTRIBUTE() and USERATTRIBUTEINCLUDES() read once a site admin enables the setting (embedding docs).
Tableau documents that both of its AI surfaces respect RLS. Pulse metrics respect “row-level security applied to the data source”, and for Tableau Agent “user-defined policies for row and column level security are respected” (Tableau Agent docs).
Tableau fact card
Looker enforces RLS in LookML. access_filter maps a user attribute to a field and filters every query from an Explore, sql_always_where injects a WHERE clause, and access_grant restricts fields or Explores to users with certain attribute values (access_filter reference). Because the rules live in the model, they apply to dashboards, schedules, the API, and embedded content alike, and there is no user-facing override. User attributes can be populated from SAML attributes or OIDC claims.
Conversational Analytics, Looker’s Gemini-powered chat, “respects LookML row and column level permissions (for example, access_filters, access_grants, sql_always_where)”, according to Google’s Conversational Analytics API docs. Through the API, a shared key gives every caller the same access, so per-user enforcement needs per-user tokens.
Looker fact card
These four share one idea: user attributes resolve into SQL filters at query time. They differ in how the attribute is defined and how it reaches an embedded session.
Sigma’s RLS adds a column to a data model table that calls CurrentUserAttributeText(), CurrentUserInTeam(), or CurrentUserEmail(), then filters on it (Sigma RLS docs). Sigma compiles the result to SQL that runs in the warehouse. In embedded content, the JWT’s user_attributes and team claims drive the same filters; Sigma notes that “JWT claims are specific to a user, not a session.” Sigma Assistant, the natural-language feature, “only works with data that you have access to” when RLS or column-level security is applied.
Sigma fact card
ThoughtSpot uses rule-based RLS evaluated against the system variables ts_groups and ts_username (RLS concepts). Rules support direct column filters and access control list tables that map users to entitlements, which scales to thousands of groups. For Spotter, ThoughtSpot states that “all existing security rules, including column-level and row-level security, are strictly enforced” (Spotter data handling). In embedded deployments, pass entitlements through attribute-based access control (ABAC) in the trusted-auth JWT. Do not rely on runtime filters, which ThoughtSpot says are “not a security feature”.
ThoughtSpot fact card
Omni limits rows with access_filters on topics, which “limits access to rows in a dataset based on user attributes”, and controls topic and field access with access_grants (access filters). Because workbooks and AI queries resolve through the shared model, the filter applies to ad hoc exploration, dashboards, and embeds. Omni Agent generates Omni queries rather than raw SQL, so “the generated query respects the permissions set in Omni” (AI security).
Omni fact card
userAttributes parameter.Lightdash implements RLS with the sql_filter property on dbt models combined with user attributes, for example filtering a table by ${lightdash.attributes.tenant_id} (user attributes docs). Attributes can be set per user or per group and are part of the open-source edition. Embed JWTs accept an optional userAttributes object. Lightdash AI agents respect user attributes when they answer from the semantic layer; agent SQL mode, the SQL Runner, and the MCP “Run SQL” tool do not apply them (agent data access).
Lightdash fact card
sql_filter with user attributes on every edition; Google SSO on Cloud Pro; Okta, Azure AD, OIDC, and SCIM on Enterprise.Metabase’s RLS feature is called row and column security. Metabase’s docs say it “was formerly called data sandboxing” (docs), and the rename shipped in version 0.56. An admin either filters a table by a user attribute or assigns a saved SQL question (WHERE tenant_id = {{tenant_id}}) as the restricted view of a table for a group. Attributes arrive through JWT or SAML SSO and drive the same rules in modular and full-app embeds. Metabot, the AI assistant, “inherits the permissions of the person it’s chatting with” (AI settings).
Metabase also offers impersonation, which switches the database role per user so database-side policies apply. That works on ClickHouse, MySQL, PostgreSQL, Redshift, Snowflake, SQL Server, and Starburst. Impersonation and database routing are both Pro and Enterprise features. The free open-source edition and the Starter plan have no row-level permissions.
Metabase fact card
Yes. Apache Superset includes RLS filters in the free, Apache 2.0 open-source project. An admin creates a filter with a SQL clause (department = 'finance'), assigns it to one or more datasets and roles, and Superset appends the clause to every query on those datasets; multiple filters combine with AND (Superset security docs). For multi-tenant embedding, the embedded SDK’s guest token request accepts an rls array, so your backend can attach a tenant clause to each viewer’s session (embedded SDK).
Preset, the managed Superset service, puts RLS behind role-based access control on its Professional and Enterprise plans. Two gaps matter for AI and power users. Preset documents that “RLS is not applied to SQL Editor”, and its AI Assist text-to-SQL feature runs in SQL Lab, so it is not RLS-filtered. The Preset Chatbot add-on does enforce RLS (Preset RLS docs).
Superset and Preset fact card
Basedash takes a database-first approach. When a user runs a query against PostgreSQL, Basedash sets a session variable, basedash.groups, to the comma-separated list of groups that user belongs to (an empty string if none). 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 PostgreSQL applies the policy, it covers AI chat, saved charts and dashboards, scheduled automations (which run with the creator’s groups, and only the creator can edit them), and Slack answers (matched to the Basedash user; unmatched Slack users get an empty group list and no rows from group-restricted tables). Setup is in the row-level security docs.
Basedash fact card
basedash.groups. The RLS docs cover PostgreSQL only. Basedash Warehouse is a managed DuckDB warehouse with a Postgres-compatible endpoint, so confirm policy support with Basedash before relying on RLS there.tenant_id server-side. Full-app embeds sign users in with JWT SSO (embedding docs). The basedash.groups policy model is not documented for embedded viewers.CREATE POLICY statements needs someone comfortable with PostgreSQL.For the database side, see how to enable row-level security in PostgreSQL. The full set of controls is on the security page.
For a small company, three questions decide it. Can someone on the team write DAX, LookML, YAML, or SQL? Will one tool be the only access path to the data? Does the budget tolerate per-seat pricing?
Looker, ThoughtSpot Enterprise, and Tableau Enterprise have strong RLS, but their pricing and modeling overhead are sized for larger teams.
Two open-source projects include RLS without a paid license. Apache Superset has RLS filters plus guest tokens with per-tenant rls clauses for embedding. Lightdash has sql_filter with user attributes, though embedding needs Lightdash Cloud or a self-hosted enterprise license key. Metabase open source has no row-level permissions; multi-tenant RLS in Metabase starts on Pro. For the wider open-source field, see best open source BI tools, and for tenant-isolation design patterns, see multi-tenant analytics architecture.
Snowflake has its own row access policies and masking policies (Enterprise Edition and above). The strongest design enforces them in Snowflake and has the BI tool pass each viewer’s identity through OAuth. Tableau, Power BI (DirectQuery with Entra SSO), Looker, Sigma, ThoughtSpot, Omni, and Lightdash support per-user Snowflake OAuth in some form, and Metabase can switch roles through impersonation. Each one has gaps for extracts, schedules, and embeds. Basedash connects to Snowflake with a single role, so Snowflake data in Basedash is controlled by that role plus Basedash’s data source and column permissions. For the detail by tool, see Snowflake masking and row access policies in BI tools, and for a broader tool comparison on that warehouse, see best BI tools for Snowflake.
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 unexpected query, application-layer RLS protects only the tool that holds the rule. Database-layer RLS protects the data regardless of the access path.
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. 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 trade-off is that someone has to write and maintain policies in the database.
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 row and column security rule on owner_email mapped to the email attribute. Superset: an RLS filter owner_email = '{{ current_username() }}' on the deals dataset, with the ENABLE_TEMPLATE_PROCESSING flag on. Basedash: assign reps to groups and add a PostgreSQL policy that checks team = ANY(string_to_array(current_setting('basedash.groups', true), ',')).Metabase is the most complete published option. It can be self-hosted on every plan, connects to PostgreSQL, and has alerts and dashboard subscriptions. Pro and Enterprise add row and column security, database impersonation, and usage analytics and auditing. Apache Superset is free to self-host with built-in RLS filters and alerts and reports; check whether its built-in action log meets your audit requirements. Basedash Enterprise self-hosts with Docker or Kubernetes, enforces PostgreSQL policies on every query including automations, and includes audit logs. Self-hosting helps with GDPR data residency, but you still need a lawful basis and retention rules.
Few do on their entry plan. Power BI is the closest: every Pro user signs in through Microsoft Entra ID, and DAX roles are included. Looker includes SAML and access filters on all editions, but all editions are quote-based. Tableau Cloud includes SAML and user filters on Standard, though centralized data policies need Enterprise. Metabase includes both on Pro, its second paid tier. Lightdash, Preset, and Basedash include RLS below Enterprise but keep SAML SSO for Enterprise, while Sigma, Omni, and ThoughtSpot do not publish which tier includes SSO. Ask for plan gating in writing before you sign.
Use one dynamic rule driven by a user attribute or group instead of a role per region. Source those attributes from your identity provider through SAML or SCIM so they stay in sync. Index the filtered column. Restrict who can edit models or join tables, because a new join can widen access. Check that exports, schedules, embeds, the SQL editor, and AI chat all honor the rule. Test as real restricted users, including one with no groups. Finally, review which roles bypass RLS, such as Power BI workspace Contributors, and keep those groups small.
They push the filter into the SQL the warehouse runs, so the cost is one extra predicate. Keep the filtered column indexed in PostgreSQL or MySQL, or clustered in Snowflake and BigQuery. Avoid policies that call a function or subquery per row. Per-user filters reduce cache sharing: Sigma disables its shared cache under OAuth, and Omni keeps per-user caches. To keep caching effective, filter on group or tenant rather than individual email where you can. In Power BI, import mode evaluates DAX roles in memory, which is usually faster than DirectQuery.
Most map each department to a group or attribute and let the AI generate queries through the same governed path as dashboards. Looker’s Conversational Analytics respects access filters and grants. ThoughtSpot Spotter enforces RLS and column-level security. Sigma Assistant, Omni Agent, and Metabase’s Metabot all inherit the user’s permissions. Basedash sets the user’s groups in a PostgreSQL session variable, so finance and sales can share one AI chat while the database returns different rows to each. Watch for exceptions: Lightdash agent SQL mode and Preset AI Assist in SQL Lab skip RLS.
Sigma, Omni, ThoughtSpot, Looker, and Lightdash all query Snowflake live and accept per-customer attributes in the embed token: Sigma through JWT user attributes, Omni through userAttributes in the signed URL, ThoughtSpot through ABAC claims in a trusted-auth JWT, Looker through embed user attributes, and Lightdash through userAttributes in the embed JWT. Superset’s guest tokens carry rls clauses and also query Snowflake live. Power BI Embedded with app-owns-data can apply DAX roles, but it cannot pass Snowflake SSO identities. Basedash embeds lock a tenant filter value in a signed JWT rather than using Snowflake policies.
Yes, for PostgreSQL databases, on the Startup plan and above. Basedash sets a basedash.groups session variable on every PostgreSQL query with the user’s groups, and your policies reference it. AI chat, dashboards, automations (run with the creator’s groups), and Slack answers are all filtered by PostgreSQL rather than by the app. Other databases use their own access controls plus Basedash’s data source permissions and column hiding. Embedded dashboards on Enterprise isolate customers with secure filtering, where a signed JWT locks a filter such as tenant_id server-side.
Not inside a correctly configured tool, but every tool has roles that RLS does not filter. In Power BI, workspace Admins, Members, and Contributors see all rows. Metabase admins are never impersonated. Database owners and anyone holding warehouse credentials can query directly unless the policy is forced on the owner. The larger risk sits outside the BI tool: a SQL client, a second BI tool, or a leaked credential. Database-layer policies close that gap. Also confirm the SQL editor is covered, since Preset documents that RLS does not apply there.
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.