Files
ipwhitelist-app/v2/sql/schema.sql
T

55 lines
3.3 KiB
SQL

-- ═══════════════════════════════════════════════════════════════════════════════
-- V2 schema — отдельные таблицы, не пересекаются с основным приложением
-- ═══════════════════════════════════════════════════════════════════════════════
-- Компании (по W-номеру = client_id)
CREATE TABLE IF NOT EXISTS v2_companies (
id SERIAL PRIMARY KEY,
client_id VARCHAR(64) UNIQUE NOT NULL, -- WZ01112, WZ03709 ...
name VARCHAR(255), -- название компании
custom_limit INTEGER DEFAULT NULL -- NULL = использовать DEFAULT_LIMIT
CHECK (custom_limit IS NULL OR custom_limit >= 0),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
-- Записи белого списка (soft delete через deleted_at)
CREATE TABLE IF NOT EXISTS v2_entries (
id SERIAL PRIMARY KEY,
company_id INTEGER NOT NULL REFERENCES v2_companies(id) ON DELETE RESTRICT,
value_cidr VARCHAR(18) NOT NULL -- формат: x.x.x.x/xx (CIDR или /32)
CHECK (value_cidr ~ '^(\d{1,3}\.){3}\d{1,3}/\d{1,2}$'),
comment VARCHAR(255),
created_by VARCHAR(255) NOT NULL, -- email создателя
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_by VARCHAR(255),
updated_at TIMESTAMPTZ,
deleted_by VARCHAR(255),
deleted_at TIMESTAMPTZ
);
-- Уникальность: в одной компании не может быть двух активных записей с одинаковым CIDR
CREATE UNIQUE INDEX IF NOT EXISTS uq_v2_entries_active_cidr
ON v2_entries(company_id, value_cidr) WHERE deleted_at IS NULL;
-- Быстрый список активных записей компании
CREATE INDEX IF NOT EXISTS idx_v2_entries_active
ON v2_entries(company_id, created_at DESC) WHERE deleted_at IS NULL;
-- Аудит (неизменяемый журнал)
CREATE TABLE IF NOT EXISTS v2_audit (
id SERIAL PRIMARY KEY,
user_email VARCHAR(255) NOT NULL, -- кто совершил действие
company_id INTEGER NOT NULL, -- в какой компании
action VARCHAR(32) NOT NULL -- CREATE, UPDATE, DELETE
CHECK (action IN ('CREATE','UPDATE','DELETE')),
old_value TEXT, -- предыдущий CIDR (для UPDATE)
new_value TEXT, -- новый CIDR
entry_id INTEGER, -- id записи в v2_entries
impersonated_by VARCHAR(255), -- кто реально (если имперсонация)
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_v2_audit_company_time
ON v2_audit(company_id, created_at DESC);