Skip to content

Operate and deploy

Access Control

Define fine-grained operational roles and assign them by project and target.

Every authenticated user can inspect project definitions and live operational state. Mutating operations, plus reading raw source messages, require an explicit permission. System administrators can perform every operation; everyone else receives permissions from project roles in access.yml.

This keeps responsibility split cleanly:

OwnerResponsibility
Project authorsDefine reviewable roles and grants in access.yml
System administratorsAssign those roles to user accounts in Users
SQLTideResolve the affected scope and enforce complete coverage on every request

Commit access.yml at the project root:

roles:
payments_operator:
description: Build and promote payment pipelines
grants:
- pipelines: [payments_ingestion, payments_reporting]
permissions:
- build.direct.run
- deployment.create
- deployment.promote
- pipeline.destroy
quality_analyst:
description: Run quality checks across the project
grants:
- scope: project
permissions:
- quality.test.run
- quality.audit.run
production_support:
description: Recover production automation and deployments
grants:
- scope: target
permissions:
- build.kill
- deployment.cleanup
- target.reset
- automation.manage

sqt compile rejects unknown roles, pipelines, permissions, keys, and invalid scopes. The built-in admin and viewer roles cannot be redefined. Account management and role assignment remain system-administrator operations and cannot be granted in this file.

Each grant contains exactly one scope:

GrantCoversTypical permissions
pipelines: [...]Only the named pipelinesBuild, stage, cancel, promote, destroy, tests, audits
scope: projectThe served projectReload, project-wide quality, messages, automation
scope: targetThe selected warehouse targetMessages, force-kill, cleanup, reset, automation

The permission vocabulary is intentionally closed:

PermissionAllows
project.reloadRecompile the served project
source.messages.readRead retained raw source records and facets
quality.test.runRun SQL tests
quality.audit.runRun SQL audits
build.direct.runExecute direct pipeline writes
deployment.createCreate a staged virtual deployment
build.cancelCooperatively cancel an owned build
build.killForce-kill build processes for recovery
deployment.promotePromote a staged deployment
deployment.cleanupRemove retained deployment artifacts
pipeline.destroyDestroy exact selected pipelines after frozen-plan confirmation
target.resetReset all SQLTide-managed relations in the selected target
automation.manageStart, stop, reset, retry, or skip sensors

Open Users, select an account, and choose a compiled role. Leave the target empty to assign the role across every target, or enter one target name to constrain it.

For example, assign Alice:

RoleAssignment targetResult
payments_operatorprodOperate the two payment pipelines only when this server targets prod
quality_analystAll targetsRun project quality checks in any target

The page shows the roles compiled from access.yml as read-only definitions and lists Alice’s assignments separately. Assignment changes apply on the next request. If a role is later removed from access.yml, its assignment is shown as stale and authorizes nothing.

The UI disables controls the current user cannot operate, but the API is the security boundary. SQLTide derives the actual affected pipelines from the compiled plan or warehouse metadata; it does not trust pipeline names supplied by the browser.

An operation must be authorized in full. If Alice selects payments_ingestion and an unauthorized customer_exports pipeline in one build, SQLTide rejects the whole request:

Direct build writes are not permitted
required permission: build.direct.run
missing pipelines: customer_exports
target: prod

There is no partial execution. Missing policies, missing assignments, stale roles, target mismatches, unknown pipeline ownership, and incomplete pipeline coverage all fail closed.