faz
Reference

Permission Levels

The six permission codes and the operations each one allows. Quick reference matrix.

The six values that can appear in a permissions: baseline or per-table override. Use this page to look up exactly which operations a code grants. For the conceptual walk-through, see Permissions.

The matrix

CodeSELECTEXPLAININSERTUPDATEDELETEDDL¹
R
W
RW
RA
RWA
A

¹ DDL covers CREATE, DROP, ALTER, TRUNCATE, GRANT, REVOKE, and equivalent schema-mutation operations across every supported query language (e.g. MongoDB dropCollection, Elasticsearch index template ops, Cypher index/constraint creation, DynamoDB CreateTable).

What each code is for

  • R — the safe default. Pick this when an agent should look but never touch.
  • W — narrow write surface. Useful for dedicated audit / event tables where the agent should only append. Note that W excludes SELECT, so an agent with W on a table cannot read what it just wrote.
  • RW — the trusted baseline. Pick this for working tables where an agent will both read state and update it.
  • RA — append-only with read. The right shape for log tables, event streams, and immutable-history patterns: agents can record new entries and read them back, but cannot retroactively edit or delete.
  • RWA — write-with-update, no delete. For tables where rows can be added or amended but never removed (think soft-delete schemas, financial ledgers).
  • A — admin. Everything plus DDL. Reserve for development, schema migrations, or trusted operational tooling. Granting A is a deliberate choice — see the warning on Permissions.

Operation mapping per database family

The matrix above uses SQL verbs. Other query languages map onto the same operation classes:

Operation classSQLMongoDBCypherElasticsearch / OpenSearchVector (Weaviate, Qdrant, Milvus, Pinecone)DynamoDB
SELECTSELECTfind, findOne, aggregate, count, distinctMATCH ... RETURN_search, _countquery, fetch, scroll, count, recommendQuery, Scan, GetItem, BatchGetItem
INSERTINSERTinsertOne, insertManyCREATE, MERGE_doc, _createupsert, insertPutItem, BatchWriteItem (put)
UPDATEUPDATEupdateOne, updateMany, replaceOneSET_updateupdateUpdateItem
DELETEDELETEdeleteOne, deleteManyDELETE, DETACH DELETE, REMOVE_delete_by_querydeleteDeleteItem
DDLCREATE/DROP/ALTER/TRUNCATEdropCollection, createIndex, dropCollectionCREATE INDEX, DROP CONSTRAINT_template, mapping mutationscreate_collection, delete_collectionCreateTable, DeleteTable, UpdateTable

If a query touches multiple tables (via JOIN, $lookup, _reindex, Cypher rebound labels, etc.), every touched target is checked independently with the operation it requires.

Special cases

No none value

There is no none access level. To deny reads on a specific table while leaving the database otherwise readable, set the table's override to W (write-only). To deny everything, don't connect the database to faz, or restrict access at the database role level outside faz. See Blocking a table from reads.

Implicit fallback

If the request is authenticated and a query target has no matching permission row, an implicit R is granted for that single target. This means undeclared databases and undeclared tables on declared databases default to read-only. See What happens to tables you didn't declare.

The * wildcard in audit logs

Internally, the per-database baseline is stored as a permission row with table_name = "*". You'll see this in faz policy output and in audit log entries. You don't write * in faz.yaml; the parser produces it from the access: field on each database entry.

On this page