# How Wren AI Enforces Role-Based Access Control on AI-Generated SQL

> Source: <https://getwren.ai/post/how-wren-ai-enforces-role-based-access-control>
> Published: 2026-09-28 00:00:00+00:00

[The Wren Journal](https://getwren.ai/blog)

Product, Tutorial

# How Wren AI Enforces Role-Based Access Control on AI-Generated SQL

Wren AI doesn't replace your data security policy, it enforces it. Row-level and column-level security are applied in Wren Engine at query time, driven by who is asking, even when the SQL was written by an AI.

Wren AI Product Team

Updated: Sep 28, 2026

Published: Sep 28, 2026

Every company already has a data security policy. The question an AI analytics tool has to answer is not "do you have one?" but "will you actually follow it when a model is writing the SQL?"

That is the problem this short demo walks through. Wren AI doesn't replace your policy. It enforces it: who sees which rows, which columns, and what happens when the rules aren't met, applied at query time for every question, chart and API call.

## Why AI-generated SQL needs a different kind of guardrail

In a traditional BI tool, access control often lives in the dashboard. An analyst builds a report, someone scopes it to a team, and the report is the boundary.

A natural-language interface has no such boundary. Anyone can ask anything, and the SQL is composed on the fly. If a model can write `SELECT salary FROM employees`, then "please don't show salaries" in a prompt is not a control. It is a suggestion.

So the enforcement has to sit below the model, at the point where a query is about to run. In Wren AI, that point is **Wren Engine**. Every query, whether a person or an agent wrote it, is routed through the engine. Policies are attached there, before anything executes against your warehouse.

## Start with who is asking: session properties

The demo opens with a single user, Erin, and the attributes that describe her:

- **department:** HR
- **region:** APAC
- **organization:** Acme

In Wren AI these are **session properties**: contextual values that travel with each request, such as a user ID, department, role, or region. For API and embedded use, the calling application supplies them with each request in the `X-Wren-Session-Properties` header.

Session properties are what policies evaluate against. Critically, they are never pasted into SQL as raw strings. Wren Engine validates them and binds them as parameters while it parses the query and generates dialect SQL for your data source. No string concatenation means no SQL injection path through a crafted user attribute.

## Row-level security: which rows each person sees

Row-level security (RLS) filters the rows of a model based on the session. You write a condition once, apply it to one or more models, and Wren Engine adds it to every query that touches them.

The common patterns are the ones you would expect from Snowflake, BigQuery, SQL Server or PostgreSQL:

- **Tenant or organization isolation.** Each customer only sees its own data.
- **Regional access.** Users see only the regions they are assigned.
- **Owner or team access.** Reps see the deals they own, or those shared with their team.
- **Role-driven access.** Rows tagged for a role are visible only to users who hold it.

For Erin, an organization rule looks like this:

She asks a plain question, the model writes a plain query, and the engine compiles the policy into it before execution:

Nothing about the question had to mention Acme. The filter comes from the session, not the prompt. The same approach extends to region allow-lists (`region_id IN (...)`) and, for users entitled to thousands of accounts, to an entitlement mapping table resolved with a subquery so the request stays small.

## Column-level security: which columns each person sees

Row filters don't help when the sensitive part is an attribute rather than a record. Salaries, SSNs, emails, unit costs and internal margins sit on rows that many people legitimately need to see.

Column-level security (CLS) protects those columns without locking the whole table. A policy picks the models and columns to protect and one access rule, which compares a session property to a value:

| Protected columns | Session property | Rule | Result | 
|---|---|---|---|
| `employees.salary` ,`employees.ssn` | `department` | equals `HR` | HR can query them. Sales cannot. | 
| `products.internal_cost` | `role` | equals `finance` | Only Finance sees internal cost. | 
| `orders.unit_cost` ,`orders.profit_margin` | `role` | in `finance, executive` | Both roles see both columns. | 

This is where Erin's `department: HR` matters. She can ask about compensation by team and get an answer. A colleague in Sales asking the same question doesn't get a quietly truncated result. The query is rejected with a clear **Restricted by policy** message that names the column, so nobody mistakes a blocked answer for an empty one.

## What happens when the rules aren't met

Two behaviors in the demo are worth pausing on, because they are where many systems get lenient.

**Missing context blocks the query.** If a policy depends on a session property that is marked required and the request doesn't carry it, Wren AI blocks the query before any data leaves your warehouse. It doesn't fall back to "no filter." For optional properties you set an explicit default, which lets you build default-deny rules, for example showing `customers.email` only when `is_internal` is `true` and treating every other request as external.

**Admin is not the same as all access.** Owning or administering a Wren AI project lets you manage models and policies. It does not let you bypass them when you query. The person who configures the security rules is still subject to them, which is exactly what an auditor wants to hear.

## One enforcement path across every surface

Because the policy lives in the engine rather than in a particular screen, it follows the query wherever it comes from:

| Surface | Row-level security | Column-level security | 
|---|---|---|
| Asking questions | Yes | Yes | 
| Generating charts | Yes | Yes | 
| Data previews | Yes | Yes | 
| API requests (ask, chart) | Yes | Yes | 
| Spreadsheets | Yes | Yes | 
| Dashboard-embedded charts | Not yet | Not yet | 

That is the practical meaning of "governed at execution." A question asked in the Wren AI UI and the same question sent through the API resolve against the same context layer and pass through the same policies.

## Try it on your own data

Data security is available on the Enterprise Cloud and Enterprise Plus plans, and existing Business plan customers keep access. You can preview a policy by simulating session property values before you save it, then ask a question in Home to confirm what a given user sees.

To go deeper:

- [Data Security Overview](https://docs.getwren.ai/cp/guide/security/data-security)
- [Row-Level Security examples](https://docs.getwren.ai/cp/guide/security/rls-examples)
- [Column-Level Security examples](https://docs.getwren.ai/cp/guide/security/cls-examples)
- [Watch more product demos](https://getwren.ai/demos?demo=wren-ai-role-based-access-control)

Or [start with Wren AI Cloud](https://cloud.getwren.ai/) and set up your first policy on a model you already have.

### See governed GenBI in action

Watch short demos of Wren AI turning business questions into governed SQL, charts, and reusable GenBI apps.

[Watch product demos](https://getwren.ai/demos)

## Related posts

[Jul 14, 2026](https://getwren.ai/post/trust-ai-agent-thread-tracing-evaluation)

### You Can't Trust an AI Agent You Can't Debug.

An AI agent that answers business questions has to be debuggable and measurable, or 'earned trust' is just a slogan. How thread tracing, benchmarks, and the AI Advisor close the loop.

[Aug 10, 2026](https://getwren.ai/post/wren-ai-microsoft-teams-connector)

### Wren AI Is Now Available in Microsoft Teams

Wren AI is now listed on Microsoft Marketplace. Ask a question in plain language inside a Teams chat or channel and get the answer in-thread, with the SQL and a chart, resolved against the same context layer every other surface uses.

[Apr 02, 2026](https://getwren.ai/post/the-missing-context-layer-for-ai-agents-over-business-data)

### The Missing Context Layer for AI Agents Over Business Data

Why we rebuilt Wren Engine from a context layer into an open context engine, and what we learned along the way

The Wren Journal

## Get the next deep dive in your inbox

Practical GenBI guides, product updates, and customer lessons from the Wren AI team. A couple of emails a month, no noise.

### Keep reading

Insight, Product

### [You Can't Trust an AI Agent You Can't Debug.](https://getwren.ai/post/trust-ai-agent-thread-tracing-evaluation)

An AI agent that answers business questions has to be debuggable and measurable, or 'earned trust' is just a slogan. How thread tracing, benchmarks, and the AI Advisor close the loop.

Product, News

### [Wren AI Is Now Available in Microsoft Teams](https://getwren.ai/post/wren-ai-microsoft-teams-connector)

Wren AI is now listed on Microsoft Marketplace. Ask a question in plain language inside a Teams chat or channel and get the answer in-thread, with the SQL and a chart, resolved against the same context layer every other surface uses.

Insight, Product

### [The Missing Context Layer for AI Agents Over Business Data](https://getwren.ai/post/the-missing-context-layer-for-ai-agents-over-business-data)

Why we rebuilt Wren Engine from a context layer into an open context engine, and what we learned along the way
