/
t3
/
iam-server
Обзор
Документация
Войти
/
t3
/
iam-server
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
internal/storage/schema.sql
133 строки
5 KB
Ivan Shibkikh
UserRepo.Create fix
19 июл 2026, 23:07
19 июл 2026, 23:07
f73b7ca
Код
Авторство
О чём код?
-- Таблица пользователей -- Учётные данные хранятся исключительно в access_keys (один-ко-многим). CREATE TABLE IF NOT EXISTS users ( id TEXT PRIMARY KEY, display_name TEXT NOT NULL, version INTEGER NOT NULL DEFAULT 1, created_at TEXT NOT NULL, updated_at TEXT NOT NULL, deleted_at TEXT ); -- Таблица ключей доступа (один-ко-многим к пользователю) CREATE TABLE IF NOT EXISTS access_keys ( id TEXT PRIMARY KEY, user_id TEXT NOT NULL, access_key TEXT NOT NULL UNIQUE, access_secret_encrypted TEXT NOT NULL, status TEXT NOT NULL CHECK(status IN ('Active','Inactive')), created_at TEXT NOT NULL, updated_at TEXT NOT NULL, expires_at TEXT, last_used_at TEXT, last_used_ip TEXT, FOREIGN KEY (user_id) REFERENCES users(id) ); -- Таблица ролей CREATE TABLE IF NOT EXISTS roles ( id TEXT PRIMARY KEY, name TEXT NOT NULL, description TEXT, version INTEGER NOT NULL DEFAULT 1, created_at TEXT NOT NULL, updated_at TEXT NOT NULL, deleted_at TEXT ); -- Уникальность имени только среди активных (не удалённых) ролей CREATE UNIQUE INDEX IF NOT EXISTS idx_roles_name_active ON roles(name) WHERE deleted_at IS NULL; -- Связь пользователей и ролей (Many-to-Many) CREATE TABLE IF NOT EXISTS user_roles ( user_id TEXT NOT NULL, role_id TEXT NOT NULL, created_at TEXT NOT NULL, PRIMARY KEY (user_id, role_id), FOREIGN KEY (user_id) REFERENCES users(id), FOREIGN KEY (role_id) REFERENCES roles(id) ); -- Прямые права пользователя CREATE TABLE IF NOT EXISTS user_permissions ( id TEXT PRIMARY KEY, user_id TEXT NOT NULL, effect TEXT NOT NULL CHECK(effect IN ('Allow', 'Deny')), action TEXT NOT NULL, resource TEXT NOT NULL, created_at TEXT NOT NULL, updated_at TEXT NOT NULL, FOREIGN KEY (user_id) REFERENCES users(id) ); -- Права ролей CREATE TABLE IF NOT EXISTS role_permissions ( id TEXT PRIMARY KEY, role_id TEXT NOT NULL, effect TEXT NOT NULL CHECK(effect IN ('Allow', 'Deny')), action TEXT NOT NULL, resource TEXT NOT NULL, created_at TEXT NOT NULL, updated_at TEXT NOT NULL, FOREIGN KEY (role_id) REFERENCES roles(id) ); -- Версионирование коллекций для optimistic locking на отношениях CREATE TABLE IF NOT EXISTS collection_versions ( key TEXT PRIMARY KEY, version INTEGER NOT NULL DEFAULT 1, updated_at TEXT NOT NULL ); -- Таблица использованных nonce (replay-защита SigV4) CREATE TABLE IF NOT EXISTS used_nonces ( nonce TEXT PRIMARY KEY, expires_at TEXT NOT NULL ); -- Индекс для очистки истёкших nonce CREATE INDEX IF NOT EXISTS idx_used_nonces_expires_at ON used_nonces(expires_at); -- Таблица аудита (append-only, hash-chain для tamper-evidence) CREATE TABLE IF NOT EXISTS audit_log ( id TEXT PRIMARY KEY, timestamp TEXT NOT NULL, request_id TEXT NOT NULL, actor_type TEXT NOT NULL, actor_id TEXT NOT NULL, actor_ip TEXT NOT NULL, action TEXT NOT NULL, resource_type TEXT NOT NULL, resource_id TEXT NOT NULL, outcome TEXT NOT NULL, detail TEXT NOT NULL DEFAULT '{}', prev_hash TEXT NOT NULL, hash TEXT NOT NULL ); -- Индексы для audit_log CREATE INDEX IF NOT EXISTS idx_audit_log_timestamp ON audit_log(timestamp); CREATE INDEX IF NOT EXISTS idx_audit_log_request_id ON audit_log(request_id); CREATE INDEX IF NOT EXISTS idx_audit_log_action ON audit_log(action); CREATE INDEX IF NOT EXISTS idx_audit_log_resource ON audit_log(resource_type, resource_id); -- Триггеры append-only защиты: UPDATE и DELETE запрещены CREATE TRIGGER IF NOT EXISTS trg_audit_log_no_update BEFORE UPDATE ON audit_log BEGIN SELECT RAISE(ABORT, 'audit_log is append-only: UPDATE not allowed'); END; CREATE TRIGGER IF NOT EXISTS trg_audit_log_no_delete BEFORE DELETE ON audit_log BEGIN SELECT RAISE(ABORT, 'audit_log is append-only: DELETE not allowed'); END; -- Индексы для быстрого поиска CREATE INDEX IF NOT EXISTS idx_user_roles_user_id ON user_roles(user_id); CREATE INDEX IF NOT EXISTS idx_user_permissions_user_id ON user_permissions(user_id); CREATE INDEX IF NOT EXISTS idx_role_permissions_role_id ON role_permissions(role_id); CREATE INDEX IF NOT EXISTS idx_access_keys_access_key ON access_keys(access_key); CREATE INDEX IF NOT EXISTS idx_access_keys_user_id ON access_keys(user_id); CREATE INDEX IF NOT EXISTS idx_access_keys_status ON access_keys(status);