Skip to content
Back to skills

Database Multitenancy

ASecurity

Multi-tenancy DB — RLS, schema-per-tenant, database-per-tenant.

  • 6 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 5, 2026
ai-agentsrustsqldatabasesecurity

Security analysis

A100/100

Pro scans all 2 files and shows the line behind each finding

Scanned September 5, 2026

npx -y skills add Dev-Toolbelt/dev-team-agents --skill database-multitenancy --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Database Multitenancy?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Database Multitenancy
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/dev-toolbelt-database-multitenancy/badge)](https://www.skillsdirectory.com/skills/dev-toolbelt-database-multitenancy)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: database-multitenancy
description: Multi-tenancy DB — RLS, schema-per-tenant, database-per-tenant.
---

## Choosing a Multi-Tenancy Strategy

| Strategy | Isolation | Migration complexity | Cost | Best for |
|----------|-----------|---------------------|------|---------|
| **Row-Level Security (RLS)** | Logical (DB-enforced) | Single schema | Low | SaaS with many tenants, PostgreSQL-native stacks |
| **Schema-per-tenant** | Strong (namespace) | Multiplies with tenant count | Medium | ≤ a few hundred tenants, data residency requirements |
| **Database-per-tenant** | Maximum | Highest (separate infra) | High | Regulated industries (HIPAA, SOC 2), contractual isolation |

**Default recommendation:** start with RLS. Move to schema-per-tenant only when tenant count or compliance demands it. Never add database-per-tenant complexity speculatively.

## Detection Signals

| Signal | Multi-tenancy indicator |
|--------|------------------------|
| `tenant_id` column in schema | RLS or shared-schema approach |
| Multiple schemas with identical structure | Schema-per-tenant |
| Multiple databases with identical structure | Database-per-tenant |
| `app.tenant_id` in SQL or ORM config | RLS with session variable |
| PgBouncer in transaction mode | RLS with `SET LOCAL` required |

## Quick Rules

- Always use `FORCE ROW LEVEL SECURITY` — not just `ENABLE` — so the table owner is also subject to policies.
- Use `SET LOCAL app.tenant_id` inside transactions, never at session level, when connection pooling is present.
- Include `tenant_id` as the **leading column** in all composite indexes on multi-tenant tables.
- Never trust `user_metadata` for access control in Supabase — use `app_metadata` only.

## Load on Demand

| When | Load |
|------|------|
| Implementing RLS, schema-per-tenant, database-per-tenant, or pgvector with multi-tenancy | `references/tenant-isolation.md` |

Files in this skill

  • SKILL.md1.9 KB
  • references/tenant-isolation.md7.1 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.