Sigma Row-Level Security: User Attributes, Teams, and Warehouse Rules

How to set up row-level security in Sigma with user attributes or teams, where to put the filter so it holds, and when warehouse rules are the better choice.

Written by Linus Tse, founder of Greyfield Data

ยท 8 min read

On this page 10 sections

A regional manager should see their region. A sales rep should see their own deals. The VP should see everything. In Sigma you get there with a formula column, a filter, and a place to put both where nobody downstream can remove them.

The rules are short, but where you put the filter decides whether it actually protects anything. If you want help designing access for a Sigma rollout, that's part of our Sigma Computing consulting work.

Key takeaways

  • Sigma row-level security (RLS) is a formula column that returns True or False for the person viewing, plus a filter that keeps only True rows. Sigma's Set up row-level security page lists three bases: user attributes (recommended), team membership, and user email.
  • Put the RLS column and filter in a data model, not in the workbook people view. Sigma warns that anyone viewing a table can modify its filter, so only child elements and downstream sources are fully protected.
  • Never apply RLS with a control element in a data model. A downstream workbook can change a control's value through a source parameter.
  • User attributes are assigned in Administration > User Attributes to users or teams. A user with no value and no default gets an empty string, so they match no rows.
  • If your warehouse already has row rules, Sigma can respect them: through OAuth, or by switching the connection role per user with a Role user attribute.

How does row-level security work in Sigma?

Row-level security in Sigma is a calculated column that checks the current viewer against a value in each row, and a filter that keeps only the rows where that check is True. You build both in a data model table, workbook data element, or dataset, according to Sigma's RLS docs.

The column formula uses one of three system functions:

Basis Formula pattern Best for
User attribute (recommended) CurrentUserAttributeText("Region") = [Region] Regions, customers, business units, anything you assign by value
Team membership CurrentUserInTeam([Team Assignment]) Access that already follows your Sigma teams
User email [Rep Email] = CurrentUserEmail() Each person sees only their own rows

Sigma recommends user attributes because the assignment of values lives in the Administration portal, separate from the formula. You change who sees what without editing a data model. CurrentUserAttributeText returns the attribute as text, so the column you compare against must also be text.

A synthetic example: five orders, three viewers

Here is a small synthetic sales table. The names and numbers are made up.

Order Region Rep email Amount
1001 West ana@example.com $12,400
1002 West dev@example.com $8,100
1003 East ben@example.com $15,250
1004 East ben@example.com $6,900
1005 Central kim@example.com $9,800

Three viewers open the same workbook. A member of the Sales US-West team has the Region attribute set to West. A member of Sales US-East has East. A member of the Sales Manager team should see every row.

A synthetic five-order table flows through a data model with a hidden Region RLS column. A West viewer sees 2 rows totaling $20,500, an East viewer sees 2 rows totaling $22,150, and a Sales Manager sees all 5 rows totaling $52,450.
A synthetic five-order table flows through a data model with a hidden Region RLS column. A West viewer sees 2 rows totaling $20,500, an East viewer sees 2 rows totaling $22,150, and a Sales Manager sees all 5 rows totaling $52,450.

How do you set up RLS with user attributes?

Create the attribute, assign values, then add the column and filter in the data model. You need the Admin account type or the Manage user attributes permission for the first two steps, per Configure user attributes.

  1. Go to Administration > User Attributes and click Create Attribute. Name it Region. Leave Default Value empty unless everyone should get one.

  2. Select the attribute, click Assign Attribute, pick the Sales US-West team, and enter West as the Assigned Value. Repeat for East and Central.

  3. In the data model, add a column called Region RLS:

    CurrentUserAttributeText("Region") = [Region]
    
  4. Add a filter on Region RLS that keeps only True.

  5. Hide Region RLS so downstream users don't see it by default.

In the synthetic table, the West viewer now gets orders 1001 and 1002, $20,500 in total. The East viewer gets 1003 and 1004, $22,150.

Let managers see everything

Sigma's docs show RLS rules combined with or. To give the Sales Manager team every row while everyone else stays filtered by region:

CurrentUserAttributeText("Region") = [Region] or CurrentUserInTeam("Sales Manager")

The manager sees all five orders, $52,450. Team names in CurrentUserInTeam are case-sensitive, so "sales manager" won't match.

When one person sits on two teams

Attribute values take effect in priority order on the Teams Assigned tab, top to bottom. A value assigned directly to a user overrides values from their teams. If someone is on both the West and East teams, drag the team that should win to the top.

How do you set up RLS by team or by user?

Use team-based RLS when access already follows your Sigma teams. You add two columns: one that maps each row to a team name, and one that checks membership.

Switch([Region], "West", "Sales US-West", "East", "Sales US-East")

Call that Team Region, then add Team RLS:

CurrentUserInTeam([Team Region])

Filter Team RLS to True and hide both columns. The downside is that a new region means editing the Switch formula, where a user attribute only needs a new assignment.

For rep-level access, compare an email column in your data with CurrentUserEmail:

[Rep Email] = CurrentUserEmail()

This only works if the email in your data matches the email on the person's Sigma account.

Where should the RLS filter live?

The RLS filter belongs in a data model or dataset that workbooks use as a source. Sigma's warning is direct: a filter can be modified by anyone viewing the table it's applied to, so only child elements and downstream data sources count as fully protected.

Placement Protected? Why
Filter on a table in a data model, used as a workbook source Yes All workbooks that rely on the data model are protected
Filter on a workbook table that viewers open directly No Anyone viewing that table can change its filter
Filter on a child element of a filtered parent Yes The parent's filter is applied before the child
A control element in a data model No A downstream workbook can change the control through a source parameter

For custom SQL, Sigma supports the same attribute inside the query:

WHERE STORE_REGION = {{#formula CurrentUserAttributeText('Region')}}

Should you use warehouse-level or Sigma-level controls?

Use warehouse-level controls when the warehouse already enforces row rules that other tools also rely on. Use Sigma-level RLS when the rule only matters inside Sigma, or when the people managing it are Sigma admins rather than database admins.

Approach How it works Watch for
Sigma RLS with user attributes Formula column and filter in a data model Lives in Sigma only; other tools reading the same tables need their own rules
OAuth connection Sigma respects existing RLS rules in your data platform, per the RLS docs Each user authenticates to the warehouse as themselves
Role set by user attribute A Role attribute picks the warehouse role each user or team runs queries as, per Dynamically assign roles Key pair authentication only, not OAuth, and not every platform supports it
Snowflake query variables (Beta) Sigma sets a SQL variable on every query that a Snowflake row access policy reads, per Restrict access to data in embedded content Not available on OAuth connections

You can combine them. Sigma's docs note that several options can be used together, for example a warehouse role per customer and a Sigma RLS column for region within that customer.

Columns are a separate layer. If some users shouldn't see a salary or margin column at all, look at column-level security rather than hiding columns.

What breaks RLS in Sigma?

Most RLS problems come from attribute changes and type mismatches, not from the formula.

  • Renaming or deleting an attribute. Sigma's docs say existing RLS formulas then evaluate to null. Plan renames like a schema change.
  • No value assigned. With no value and no default, CurrentUserAttributeText returns an empty string. The user sees nothing, which is the safe failure but a confusing one.
  • Type mismatch. The attribute is text. If [Region] is a number code, convert one side before comparing.
  • Sensitive values. Sigma advises against storing passwords, keys, or tokens in user attributes, because values can appear in titles and exports.

Test by viewing the workbook as each kind of user before you share it. Our Sigma migration validation guide covers access checks alongside number checks if you're moving from Tableau or Power BI.

If you embed Sigma for customers, the same attributes get passed in a signed token. See how to embed Sigma dashboards. For the full list of system functions, see the Sigma functions list.

Frequently asked questions

What is row-level security in Sigma Computing?

It restricts which rows each person sees based on who they are. You add a column that compares the viewer's user attribute, team, or email to a value in each row, then filter to True.

Should I use user attributes or teams for Sigma RLS?

Sigma recommends user attributes, because values are assigned in the Administration portal separately from the formula. Teams work well when access already matches your Sigma teams, but new teams often mean editing a formula.

Does Sigma respect row access policies in Snowflake?

With an OAuth connection, Sigma respects existing RLS rules in your data platform. Without OAuth, you can switch the warehouse role per user with a Role attribute on key pair connections, or use Snowflake query variables, which are in beta.

Can a viewer remove a row-level security filter in Sigma?

They can change a filter on a table they're viewing directly. That's why Sigma recommends putting RLS in a data model or dataset, where workbooks built on it are protected.

What happens if a user has no attribute value?

If there is no assigned value and no default, the function returns an empty string, so the RLS column is False for every row and the user sees no data.

What to do next

Pick one data model, add a Region attribute with values for two teams, and view the workbook as a member of each before you add more rules. If you're deciding between warehouse rules and Sigma rules for a wider rollout, book a call with me or see our Sigma Computing consulting work.

Part of the Sigma guides, a reading path through related articles.

Linus Tse

Founder of Greyfield Data. Built 400+ dashboards. Certified in Sigma, Snowflake, Tableau, and Power BI.

About Linus

โ† All articles