27 lines
1.2 KiB
SQL
27 lines
1.2 KiB
SQL
CREATE TABLE IF NOT EXISTS user_key_audit_events (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
event_id TEXT UNIQUE NOT NULL,
|
|
actor_subject_id TEXT NOT NULL,
|
|
actor_role TEXT NOT NULL CHECK (actor_role IN ('admin','user','system')),
|
|
target_key_id TEXT NOT NULL,
|
|
action TEXT NOT NULL CHECK (action IN ('create','reset','pause','resume','delete')),
|
|
result TEXT NOT NULL CHECK (result IN ('success','denied','failed')),
|
|
reason TEXT NOT NULL DEFAULT '',
|
|
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ','now'))
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_user_key_audit_target_key_id ON user_key_audit_events(target_key_id, created_at DESC);
|
|
CREATE INDEX IF NOT EXISTS idx_user_key_audit_actor_subject_id ON user_key_audit_events(actor_subject_id, created_at DESC);
|
|
|
|
CREATE TABLE IF NOT EXISTS subject_rate_limits (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
subject_id TEXT NOT NULL,
|
|
action TEXT NOT NULL,
|
|
window_start TEXT NOT NULL,
|
|
hit_count INTEGER NOT NULL DEFAULT 0,
|
|
updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ','now')),
|
|
UNIQUE(subject_id, action, window_start)
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_subject_rate_limits_lookup ON subject_rate_limits(subject_id, action, window_start);
|