Skip to content

Row-level security (RLS) in BI tools restricts which data rows each user can see based on identity, role, or attributes — enforcing access control at the query level rather than the dashboard level. Among the major platforms, Power BI and Looker offer the most mature native RLS implementations, Sigma and ThoughtSpot provide attribute-based filtering with strong embedded analytics support, and AI-native tools like Basedash enforce RLS through database-level policies that extend to natural language queries. According to IBM’s 2025 Cost of a Data Breach Report, malicious insider breaches — the kind RLS is designed to prevent — cost organizations an average of $4.92 million per incident (IBM, “Cost of a Data Breach Report,” 2025, analysis of 6,000+ organizations across 17 industries).

As self-service analytics adoption accelerates, RLS has moved from a nice-to-have enterprise feature to a baseline requirement. The 2025 Dresner Wisdom of Crowds Business Intelligence Market Study found that security and data quality have overtaken efficiency and revenue impact as the top user priorities when evaluating BI platforms (Dresner Advisory Services, “Wisdom of Crowds BI Market Study,” 2025, survey of 5,000+ BI users and vendors). When any team member can ask questions in plain English and an AI generates SQL on their behalf, the attack surface for accidental data exposure grows exponentially — making automated, policy-based row filtering essential.

TL;DR

  • Row-level security restricts which data rows each user can see based on identity, role, or attributes — it is the most critical data governance primitive in self-service BI
  • Power BI offers both static and dynamic RLS using DAX, with deep Microsoft ecosystem integration including Azure AD
  • Looker enforces RLS through LookML access filters that apply to every query, including embedded and API-driven ones
  • Sigma Computing implements RLS via user attributes and functions like CurrentUserEmail(), with strong embedded analytics support
  • ThoughtSpot provides rule-based RLS with access control list (ACL) table patterns that scale to thousands of groups
  • Basedash enforces RLS at the database level, meaning PostgreSQL RLS policies apply to every AI-generated query automatically
  • The right approach depends on whether you want BI-layer enforcement (faster to set up, vendor-locked) or database-layer enforcement (more portable, requires database expertise)

How does row-level security work in BI tools?

Row-level security filters query results based on the authenticated user’s identity before data reaches the dashboard, chart, or AI-generated answer. BI tools implement RLS through one of three architectural patterns: application-layer filtering (the BI tool appends WHERE clauses to every query), database-layer enforcement (the database itself restricts rows using native RLS policies), or a hybrid approach where the BI tool passes user context to database-level policies.

Application-layer RLS is the most common approach. The BI tool maintains a mapping between users (or groups/roles) and the data they can access, then automatically injects filter conditions into every SQL query. Power BI, Looker, Sigma, and ThoughtSpot all use this pattern. The advantage is that RLS rules are defined and managed within the BI tool. The disadvantage is that those rules only apply within that specific tool — a user who queries the same database through a SQL editor or a different BI tool bypasses the restrictions entirely.

Database-layer RLS pushes enforcement to the database itself. PostgreSQL, Snowflake, and BigQuery all support native RLS policies that filter rows regardless of which tool connects. Tools like Basedash that connect directly to the database and execute queries as the authenticated user inherit these policies automatically. The advantage is universality — the same rules apply to every client. The disadvantage is that defining and managing policies requires database administration skills rather than BI tool configuration.

Why the enforcement layer matters

The enforcement layer determines your security posture when things go wrong. If an API key leaks, a new tool connects to the warehouse, or an AI agent generates an unexpected query, application-layer RLS only protects data accessed through the BI tool that defines those rules. Database-layer RLS protects data regardless of the access path.

For organizations subject to SOC 2, HIPAA, or GDPR compliance requirements, auditors increasingly ask where access control is enforced. Database-layer enforcement provides a simpler compliance story because the control exists at the data layer, not scattered across individual applications.

Which BI tools have the strongest row-level security?

Seven BI platforms represent the primary approaches to RLS in 2026. The comparison below evaluates each tool across RLS method, granularity, embedded analytics support, AI query coverage, compliance features, and pricing model.

ToolRLS methodGranularityEmbedded RLSAI query coverageAudit trailPricing model
Power BIDAX-based static and dynamic rolesRow and columnYes (embed tokens with RLS roles)Copilot queries filtered by RLS rolesActivity log + Azure Monitor$10–$20/user/month; Premium/Fabric capacity
LookerLookML access_filter and sql_always_whereRow and column (via hidden dimensions)Yes (embed SSO passes user attributes)Gemini queries filtered by access filtersSystem Activity Explore + Cloud Audit LogsGoogle Cloud pricing; starts ~$5,000/month
TableauUser filters, calculated fields, data policiesRow (column via data source filtering)Yes (user attribute functions in JWT/SAML)Pulse respects workbook-level RLSAdmin Insights + audit tablesCreator $75/user/month; Viewer $15/user/month
Sigma ComputingUser attributes with CurrentUserEmail/Team functionsRow and columnYes (dynamic role switching in embeds)AI queries filtered by user attributesUsage analytics + warehouse query logsStarts free; Pro from $25/user/month
ThoughtSpotRule-based with ts_groups/ts_username variablesRow, column, and objectYes (trusted authentication passes user context)Spotter NLQ filtered by RLS rulesSpotIQ audit + governance consoleCustom pricing; typically $25–$95/user/month
MetabaseData sandboxing (SQL-based row/column filtering)Row and columnYes (SSO attributes passed to sandboxes)Limited (no native NLQ; sandboxing applies to dashboard queries)Audit log (Enterprise plan)Open-source free; Pro $85/month per 10 users; Enterprise custom
BasedashDatabase-native RLS (PostgreSQL policies, Snowflake masking)Inherits database granularityYes (database policies apply to all connections)All AI-generated queries filtered by database RLSDatabase audit logs + query historyFree tier; Team from $24/user/month

What the comparison reveals

The seven platforms split into two camps. Power BI, Looker, Sigma, ThoughtSpot, and Tableau manage RLS within the application layer — you define rules in the BI tool, and those rules apply to every query the tool generates. Metabase occupies a middle ground with SQL-based sandboxing that can reference database-level attributes. Basedash takes the database-native approach, inheriting whatever RLS policies exist in PostgreSQL, MySQL, Snowflake, or BigQuery.

The trade-off is configuration convenience versus enforcement scope. Application-layer tools are faster to configure (a Looker developer can add an access_filter in five minutes), but the rules only protect data accessed through that tool. Database-layer enforcement requires more upfront setup but protects data universally.

How does Power BI implement row-level security?

Power BI implements RLS through DAX (Data Analysis Expressions) role definitions that filter data based on the authenticated user’s identity. Static RLS uses hardcoded filters per role — for example, a “West Region” role sees only rows where Region = "West". Dynamic RLS uses a security mapping table that automatically resolves the current user’s email to their permitted data scope, eliminating the need to create individual roles for each user or group.

Dynamic RLS is the recommended approach for organizations with more than a handful of roles. You create a security table mapping user emails to their permitted values (regions, departments, customer IDs), then write a DAX filter expression like [UserEmail] = USERPRINCIPALNAME(). Power BI evaluates this expression against every row at query time, returning only matching results.

Strengths

  • Deep integration with Azure Active Directory for identity resolution
  • Both static and dynamic patterns available, covering simple to complex scenarios
  • RLS applies to both Power BI Service and embedded content via embed tokens
  • Power BI Premium and Fabric workspaces support object-level security in addition to RLS

Limitations

  • DAX knowledge required to define and debug role expressions
  • RLS rules live in the Power BI data model, creating vendor lock-in
  • No native support for multi-dimensional RLS (e.g., user sees Finance for Company A but not Company B) without complex DAX workarounds
  • Extract-based RLS cannot filter at the database level — the full dataset is imported first, then filtered at query time

How does Looker handle row-level security?

Looker enforces RLS through LookML model definitions using two mechanisms: access_filter (which maps a user attribute to a field and filters every query) and sql_always_where (which injects a WHERE clause into every SQL query generated from an Explore). Both approaches ensure that RLS applies to every visualization, scheduled report, API call, and embedded dashboard built on that Explore — there is no way for a Looker user to bypass the filter.

“Effective row-level security must be invisible and inescapable — the user should never see data they’re not entitled to, and they should never realize data is being hidden,” said Jordan Tigani, co-founder of MotherDuck and former engineering director at Google Cloud (DuckDB Blog, “Building Secure Multi-Tenant Analytics,” 2025).

Strengths

  • Access filters are defined in code (LookML), enabling version control, code review, and CI/CD workflows
  • Filters apply universally — no gap between dashboard views, API calls, and embedded content
  • User attributes can be passed from SAML/OIDC identity providers, enabling zero-touch provisioning
  • Embedded SSO passes user attributes automatically, so embedded customers see only their data

Limitations

  • Requires LookML expertise to configure and maintain
  • Tight coupling to Google Cloud ecosystem (Looker is now part of Google Cloud)
  • Pricing starts at approximately $5,000/month, placing it out of reach for smaller teams
  • Access filters are Looker-specific — the same rules don’t transfer if you switch BI tools

What RLS options do Sigma, ThoughtSpot, and Metabase offer?

Sigma Computing, ThoughtSpot, and Metabase each take distinct approaches to row-level security that reflect their target audiences and architectural philosophies.

Sigma Computing

Sigma implements RLS through user attributes and built-in functions — CurrentUserEmail(), CurrentUserTeam(), and CurrentUserAttributeText() — that resolve at query time. RLS is configured at the data model level, and Sigma recommends applying filters as close to the source data as possible. For embedded analytics, Sigma supports dynamic role switching that passes user context to RLS rules automatically.

Sigma’s warehouse-native architecture means it pushes all queries to the cloud data warehouse (Snowflake, BigQuery, Databricks, or PostgreSQL). RLS filters become WHERE clauses in the pushed-down SQL, so the warehouse handles enforcement. This approach combines application-layer configuration with warehouse-level execution.

ThoughtSpot

ThoughtSpot uses rule-based RLS with system variables ts_groups and ts_username that resolve the authenticated user’s group memberships and username at query time. Rules support two patterns: direct column filtering (e.g., Region = ts_groups) and access control list (ACL) tables that map users to permitted values in a separate entitlements table. ACL tables scale to thousands of groups without requiring individual rule definitions.

ThoughtSpot’s Strict RLS mode (enabled by default) ensures RLS rules are always included in database queries. When disabled for performance optimization on large datasets, ThoughtSpot still enforces RLS but may use a less restrictive evaluation strategy. RLS rules defined on source tables automatically extend to all Models, saved Answers, and Liveboards.

Metabase

Metabase calls its RLS feature “data sandboxing” (available on Pro and Enterprise plans). Sandboxes use saved SQL queries with user attribute variables to filter rows and restrict columns. An administrator creates a SQL query with filter conditions like WHERE user_id = {{user_id}}, saves it to an admin-only collection, and assigns it as the sandboxed view of a table for specific user groups.

The SQL-based approach gives Metabase sandboxing significant flexibility — any filtering logic expressible in SQL can be used — but it requires manual query maintenance. There is no declarative configuration like Looker’s access filters or Power BI’s DAX roles. For teams already comfortable with SQL, this is a strength. For teams without database expertise, it adds operational complexity.

How does database-native RLS compare to BI-layer RLS?

Database-native RLS — where access control policies are defined and enforced by the database engine itself — provides a fundamentally different security model than BI-layer RLS. PostgreSQL RLS policies, Snowflake row access policies, and BigQuery row-level access controls all filter data before it leaves the database, regardless of which application requests it.

The Verizon 2025 Data Breach Investigations Report found that compromised credentials were the initial access vector in 22% of confirmed breaches, and exploited application vulnerabilities accounted for 20% — a 34% year-over-year increase (Verizon, “2025 Data Breach Investigations Report,” 2025, analysis of 12,195 breaches across 139 countries). Database-layer enforcement mitigates both vectors because the policy is enforced at the data layer, independent of the application’s security.

PostgreSQL RLS

PostgreSQL’s built-in RLS uses CREATE POLICY statements that define filter conditions based on the current session user. When enabled on a table, PostgreSQL evaluates the policy for every query — SELECT, INSERT, UPDATE, and DELETE — ensuring no row is returned or modified unless the policy permits it. Tools that connect as the authenticated user (or pass user context via SET ROLE or current_setting()) inherit these policies automatically.

Snowflake row access policies

Snowflake row access policies use SQL expressions that evaluate the current user’s role, account, or custom session variables. Policies are attached to tables or views and filter rows at the engine level. The policy applies to every query, whether from a BI tool, a notebook, or a scheduled job.

When to use database-native RLS

Database-native RLS is the right choice when multiple tools access the same data, compliance requirements demand enforcement at the data layer, or your team has database administration expertise. For teams using AI-powered BI tools where an LLM generates SQL on behalf of users, database-native RLS ensures the AI cannot return unauthorized data — the filter is applied by the database, not by the application that generated the query.

Basedash takes this approach by connecting directly to databases and executing queries with the user’s connection context. PostgreSQL RLS policies, Snowflake row access policies, and BigQuery row-level access controls apply to every query — including those generated by Basedash’s AI from natural language input. For a detailed guide on configuring these policies, see How to enable row-level security (RLS) in PostgreSQL.

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

Evaluating BI tools for row-level security requires assessing six dimensions beyond the basic “does it support RLS?” checkbox. The depth and reliability of RLS implementation varies significantly between platforms, and the wrong choice creates security gaps that are expensive to discover.

Enforcement scope

Does RLS apply only to dashboards, or does it cover API queries, exports, scheduled reports, embedded content, and AI-generated queries? Looker and ThoughtSpot enforce RLS across all query paths. Power BI enforces RLS for all content types except when users have direct access to the underlying dataset in DirectQuery mode. Ask vendors specifically: “If a user exports data to CSV, does the export respect RLS rules?”

Identity resolution

How does the tool determine who the current user is? The strongest implementations integrate with your identity provider (Okta, Azure AD, Google Workspace) and resolve user attributes — department, region, customer ID — from SAML assertions or OIDC tokens. Weaker implementations require manual user-to-role mapping within the BI tool, which drifts from your identity source over time.

Embedded analytics RLS

If you embed analytics in your product, RLS must work seamlessly in the embedded context. The BI tool needs to accept user identity from your application (via JWT, signed URLs, or OAuth) and apply RLS rules based on that identity. Sigma, Looker, and Tableau handle this well. Power BI requires embed tokens with explicit role assignments.

Audit and compliance

Can you prove which user saw which data at which time? SOC 2 Type II, HIPAA, and GDPR compliance require audit trails that demonstrate access controls are enforced consistently. ThoughtSpot and Looker provide the most comprehensive audit capabilities natively. Power BI requires Azure Monitor integration for detailed query-level auditing.

Performance impact

RLS adds filter conditions to every query, which can impact performance on large datasets. ThoughtSpot’s Strict RLS mode prioritizes security over performance by default. Power BI’s import mode evaluates DAX filters in memory (fast) while DirectQuery mode pushes filters to the database (variable). Ask vendors for benchmark data on RLS overhead with your data volume.

Multi-tenancy support

For SaaS companies embedding analytics, multi-tenant RLS — where each customer sees only their data — is the primary use case. Evaluate whether the tool supports tenant isolation natively (Sigma’s dynamic role switching, Looker’s embed SSO) or requires custom implementation. For a deeper dive into embedded analytics architecture, see Embedded analytics for SaaS: the complete guide.

How do you implement RLS in a BI tool step by step?

Implementing row-level security follows a predictable sequence regardless of which BI tool you choose. The process takes 1–3 days for a basic setup and 2–4 weeks for a production-grade implementation with testing, audit logging, and embedded analytics support.

Step 1: Map your access control requirements

Define which data dimensions require row-level filtering. Common patterns include geographic (users see data for their region), organizational (users see data for their department), and customer-level (embedded analytics users see only their tenant’s data). Document every combination.

Step 2: Create or identify your security mapping

Build a reference table that maps user identities (email, group, role) to permitted data values. For Power BI, this is a security table joined to your data model. For Looker, user attributes are defined in the admin panel or passed from your identity provider. For database-native RLS, this is an entitlements table referenced by the RLS policy.

Step 3: Configure RLS rules in your chosen tool

Apply the security mapping using the tool’s RLS mechanism. In Power BI, create a role with a DAX filter. In Looker, add access_filter to the relevant Explore in LookML. In PostgreSQL, create a policy on the table. Test with multiple user accounts to verify each sees only permitted data.

Step 4: Validate edge cases

Test scenarios that commonly expose RLS gaps: cross-table joins (does RLS apply to joined tables?), aggregated queries (can a user infer restricted data from aggregated results?), export and download (do exports respect RLS?), and AI-generated queries (if the tool has NLQ, does the AI’s SQL include RLS filters?).

Step 5: Enable audit logging

Turn on query-level audit logging to track which user queried which data. For compliance-sensitive environments, ensure logs capture the RLS filter applied to each query, not just the user and timestamp. For governance best practices beyond RLS, see Data governance for AI-powered BI.

Frequently asked questions

What is row-level security in a BI tool?

Row-level security (RLS) in a BI tool restricts which rows of data each user can access based on their identity, role, or attributes. When a sales manager views a revenue dashboard, RLS ensures they see only revenue data for their region — not the entire company. The filtering happens at the query level, transparently, so users never see data they are not authorized to access.

Which BI tool has the best row-level security?

Power BI and Looker offer the most mature application-layer RLS implementations with deep identity provider integration and comprehensive enforcement across dashboards, exports, and embedded content. For database-native enforcement that applies regardless of which tool connects, PostgreSQL RLS policies (used by Basedash) provide the strongest universality. The best choice depends on your architecture.

Does row-level security slow down queries?

RLS adds filter conditions to every query, which introduces some overhead. The impact depends on the implementation. Power BI import mode evaluates DAX filters in memory with minimal latency. Database-native RLS in PostgreSQL or Snowflake adds WHERE clauses that the query optimizer can evaluate efficiently if the filtered column is indexed. ThoughtSpot reports sub-second overhead for most RLS configurations when data is indexed appropriately.

Can users bypass row-level security?

In properly implemented BI-layer RLS, users cannot bypass restrictions within the BI tool. Looker’s access filters and ThoughtSpot’s Strict RLS mode inject filters into every query with no override mechanism. The vulnerability exists outside the tool: if a user accesses the same database through another application that lacks RLS, they may see unfiltered data. Database-native RLS eliminates this risk by enforcing the filter at the data layer.

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

AI-powered BI tools that generate SQL from natural language must apply RLS to the generated query. Power BI’s Copilot inherits the user’s RLS role. Looker’s Gemini integration respects access filters. Basedash’s AI generates queries that execute against the database with the user’s connection context, so PostgreSQL or Snowflake RLS policies filter the results automatically. Always verify that your tool’s AI feature respects RLS — some early implementations did not.

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

Row-level security filters which rows a user sees (e.g., only customers in their region). Column-level security restricts which columns a user sees (e.g., hiding salary data from non-HR users). Most BI tools support both. Power BI handles column-level security through object-level permissions. Looker uses hidden dimensions. Metabase’s data sandboxing restricts both rows and columns in a single configuration.

Do I need RLS if I use separate databases per customer?

Separate databases per customer (physical multi-tenancy) provide data isolation by default, but this architecture does not scale cost-effectively beyond a few hundred customers and complicates cross-customer analytics. Logical multi-tenancy with RLS — one database, one schema, row-level filtering — is the industry standard for SaaS analytics because it scales to thousands of customers while maintaining isolation through policy enforcement.

How does RLS interact with data exports and downloads?

Properly implemented RLS should filter data before export. Power BI and Looker enforce RLS on all exports. Tableau respects RLS for most export types but has documented edge cases with certain extract configurations. Always test exports specifically during RLS validation — a dashboard that looks correctly filtered may export unfiltered data if the export path bypasses the RLS layer.

What compliance standards require row-level security?

SOC 2 Type II requires access controls that enforce the principle of least privilege. HIPAA requires role-based access to protected health information (PHI) with audit trails. GDPR requires that personal data is accessible only to authorized users for specified purposes. While none of these standards mandate “row-level security” by name, RLS is the technical mechanism that satisfies these requirements in analytics environments.

Can I combine database-native RLS with BI-layer RLS?

Combining both layers provides defense in depth — if the BI tool’s RLS has a gap, the database-layer policy catches it. The risk is complexity: maintaining two sets of rules that must agree. The simplest pattern is defining RLS at the database level and using a BI tool like Basedash that inherits database policies, or defining RLS in the BI tool and restricting direct database access to prevent bypasses.

How do I test row-level security before going live?

Create test accounts for each role or permission level in your RLS configuration. Log in as each test user and verify they see only permitted data across dashboards, exports, API queries, and AI-generated answers. Use SQL queries against your audit log to confirm the correct WHERE clauses were applied. Power BI provides “View As Role” testing in the desktop client. Looker supports sudo as another user for testing.

What is the biggest mistake teams make with row-level security?

The most common mistake is implementing RLS on dashboards but not on the data model. A user who can query the underlying table directly — through an ad hoc query feature, an export, or a different tool — bypasses dashboard-level filters. The fix is enforcing RLS as close to the data as possible: at the Explore level in Looker, at the data model level in Power BI, or at the database level in PostgreSQL or Snowflake.

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 →

Looking for an AI-native BI tool?

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