Row-Level Security — Complete Guide
Row-Level Security — Complete Guide: free step-by-step lesson with examples, common mistakes, and interview tips — part of SQL Server Tutorial on Toolliyo Academy.
On this page
SQL Server Tutorial · Lesson 74 of 100
Row-Level Security
SQL basics ✓ → Queries ✓ → Advanced
Advanced · 3 — Procedures · ~10 min · SQL — Security & High Availability
What is this?
RLS filters or blocks rows using security predicates so one table can serve many tenants safely.
Why should you care?
SaaS apps share tables but must never leak Tenant A’s invoices to Tenant B.
See it live — copy this example
Run in SQL Server Management Studio (SSMS) or Azure Data Studio.
USE DataVerse;
IF COL_LENGTH('dbo.Orders', 'TenantId') IS NULL
ALTER TABLE dbo.Orders ADD TenantId INT NOT NULL CONSTRAINT DF_Orders_Tenant DEFAULT (1);
CREATE OR ALTER FUNCTION dbo.fn_TenantPredicate(@TenantId INT)
RETURNS TABLE
WITH SCHEMABINDING
AS RETURN SELECT 1 AS access_result
WHERE @TenantId = CONVERT(INT, SESSION_CONTEXT(N'TenantId'));
GO
CREATE SECURITY POLICY dbo.OrdersTenantPolicy
ADD FILTER PREDICATE dbo.fn_TenantPredicate(TenantId) ON dbo.Orders
WITH (STATE = ON);
EXEC sys.sp_set_session_context @key = N'TenantId', @value = 1;
SELECT TOP (20) OrderId, TenantId FROM dbo.Orders;
What happened?
- SESSION_CONTEXT holds the tenant id for the connection.
- The filter predicate hides other tenants’ rows automatically.
Practice next
- Add TenantId and create the policy in lab.
- Set session context to 1 and select.
- Switch to tenant 2 and confirm different rows.
- Add a BLOCK PREDICATE for writes.
- Test db_owner behavior vs app user.
Remember
RLS enforces per-row access. Predicates use session context or user info. Perfect for multi-tenant tables.
Shared SaaS Orders table
DataVerse SaaS sets TenantId in SESSION_CONTEXT per request.
Outcome: Tenants never see each other’s orders.
Interview prep for this lesson
Practice these questions aloud after reading—each links to a full structured answer.
Sign in to ask a question or upvote helpful answers.
No questions yet — be the first to ask!