SQLITE_AUTH
SQLiteERRORNotableAccess ControlHIGH confidence

not authorized

What this means

SQLITE_AUTH (result code 23) is returned when an authorizer callback (registered via sqlite3_set_authorizer()) denies permission for a specific SQL operation. SQLite itself has no built-in user/role permission system — this error only appears when the application explicitly installs an authorizer to restrict what SQL can be executed, a common pattern in embedded scripting and untrusted query environments.

Why it happens
  1. 1The application registered an authorizer callback that returns SQLITE_DENY for the attempted operation
  2. 2A security wrapper around SQLite is blocking DDL operations (CREATE, DROP) from untrusted input
  3. 3Read-only authorizer blocks an INSERT, UPDATE, or DELETE
How to reproduce

An authorizer callback blocks all write operations.

trigger — this will error
trigger — this will error
import sqlite3

conn = sqlite3.connect(':memory:')
conn.execute('CREATE TABLE t (x INTEGER)')

def authorizer(action, arg1, arg2, db_name, trigger):
    import sqlite3 as _sqlite3
    if action == _sqlite3.SQLITE_INSERT:
        return _sqlite3.SQLITE_DENY  # block all inserts
    return _sqlite3.SQLITE_OK

conn.set_authorizer(authorizer)
conn.execute('INSERT INTO t VALUES (1)')  # triggers SQLITE_AUTH

expected output

sqlite3.DatabaseError: not authorized

Fix

Adjust the authorizer callback logic

WHEN When a legitimate operation is being incorrectly blocked.

Adjust the authorizer callback logic
def authorizer(action, arg1, arg2, db_name, trigger):
    import sqlite3 as _sqlite3
    # Allow reads, block writes from untrusted path
    if action in (_sqlite3.SQLITE_INSERT, _sqlite3.SQLITE_UPDATE, _sqlite3.SQLITE_DELETE):
        if db_name == 'untrusted':
            return _sqlite3.SQLITE_DENY
    return _sqlite3.SQLITE_OK

Why this works

The authorizer callback receives the action code and object names. Returning SQLITE_DENY blocks the operation; SQLITE_OK allows it; SQLITE_IGNORE suppresses the column access without error. Refine the logic to allow legitimate operations.

What not to do

✕ Remove the authorizer entirely to fix the error

If the authorizer was installed deliberately (e.g., to sandbox untrusted SQL), removing it defeats the security layer.

Version notes
All versions

SQLITE_AUTH is only raised if sqlite3_set_authorizer() has been called. Standard SQLite applications without an authorizer will never see this error.

Content generated with AI assistance and reviewed for accuracy. Found an error? hello@errcodes.dev

← All SQLite errors