Row Level Security in Azure Analysis Services

Published
Length
3 min read

Luis Felipe Dias

All posts

You set up row level security in azure analysis services by adding model roles with filter rules. These rules check who logs in and limit which table rows they can read. Data teams often build a few shared roles to move fast. Broad roles let users read rows that belong to other teams or regions. This extra visibility puts private company records at risk during daily work. How row level security in azure analysis services works Tabular models use roles to control who reads data inside the clou

Row-Level Security + Just-in-Time Access: the complete guide

Architecture patterns, implementation strategies, and security best practices. Delivered to your inbox.

Free white paper. No spam. Unsubscribe anytime.

You set up row level security in azure analysis services by adding model roles with filter rules. These rules check who logs in and limit which table rows they can read. Data teams often build a few shared roles to move fast. Broad roles let users read rows that belong to other teams or regions. This extra visibility puts private company records at risk during daily work.

How row level security in azure analysis services works

Tabular models use roles to control who reads data inside the cloud server. An admin creates a role inside the model project before deployment. Each role holds user accounts or directory groups from your identity system. You then attach a filter rule to one or more tables in that role. The rule evaluates to true or false for every single row.

Teams choose between two main ways to filter rows in a model. The first method uses fixed rules for specific groups, like a sales region. You create one role per region and assign the matching group to it. This works well when you only have a few regions to manage. It breaks down fast when your company grows to hundreds of regions.

The second method uses dynamic rules based on the active user login. You build a mapping table inside the model that links user emails to allowed values. When a user runs a report, the engine reads their login name. It checks the mapping table and filters the related fact tables on the fly. One role can now serve the whole company without building dozens of separate roles.

Managing model roles and permissions at scale

Good role design depends on clean table links inside your tabular model. Filter rules travel from lookup tables to fact tables along active relationships. If a relationship points the wrong way, the filter will not block rows. Admins must test each role using the test view before publishing changes. A small mistake in a relationship can expose the entire table to everyone.

You also have to keep the user mapping table fresh at all times. When someone changes teams, the mapping table must update right away. If your data refresh runs once a day, old permissions stay active for hours. Also, service accounts and admin roles bypass row filters by design. Engineers who log in with admin rights for maintenance read every single row.

Row-Level Security + Just-in-Time Access: architecture patterns and best practices

Continue reading? Get the full guide.

Free. No spam. Unsubscribe anytime.

What native model roles solve and where gaps remain

Native model roles work well for standard business reports and dashboards. They keep regular report viewers inside their assigned data lanes during normal use. Once you set up the mapping table, the engine handles report filters. You do not need to build separate models for each department.

Still, model roles only check who logs in to the server. They do not inspect what individual queries do in flight or mask columns. If an allowed row holds a phone number or card number, the user reads it. And engineers who connect to fix underlying SQL databases bypass model roles completely. Native roles cannot rewrite sensitive fields in results or require approval for risky queries.

Govern statements and responses across databases and APIs

Good config and scoped roles are needed setup. They do not check single queries in flight or mask sensitive fields in returned rows. Across Postgres, MySQL, SQL Server, MongoDB, ClickHouse, Kubernetes APIs, SSH, and internal HTTP endpoints, hoop.dev runs beside each supported service as an open-source proxy, a sidecar for your database or API.

First, hoop.dev guardrails block banned queries before they run. Then hoop.dev data masking rewrites matched sensitive values in responses in memory. The audit trail records every statement and verdict per resource. Furthermore, hoop.dev holds SOC 2 Type II and is open source on GitHub.

Frequently asked questions

What happens when a user belongs to two model roles?

The engine combines the permissions from both roles using an additive model. The user can read any row allowed by either of the two roles. You should avoid mixing broad roles with strict roles for the same user.

Do model administrators follow row filter rules?

No, users with server or database admin rights bypass all row filters by default. They can read every table and every row inside the model. Keep admin roles small and use standard viewer roles for daily report checks.

Can row filters hide specific columns like emails or card numbers?

Row filters only hide whole rows based on a true or false rule. They cannot rewrite or mask specific fields like emails inside an allowed row. You need column security or runtime data masking to protect specific fields.

Save the open-source gateway.

hoop is MIT-licensed infrastructure for controlling how AI agents reach production data. Star hoophq/hoop so you can inspect it, deploy it, or share it when your team starts governing agent access.