Create Supabase database migrations for Optika Zoom — tables, enums, triggers, RLS policies, indexes. Use when creating new tables, altering schema, adding migrations, setting up audit triggers, or when the user says "добавь таблицу", "создай миграцию", "измени схему БД".
supabase/migrations/YYYYMMDD_HHMMSS_<description>.sql
-- Migration: create_<table_name>
-- Description: ...
BEGIN;
-- 1. Enums (если нужны)
DO $$ BEGIN
CREATE TYPE <table>_status AS ENUM ('value1', 'value2');
EXCEPTION WHEN duplicate_object THEN NULL;
END $$;
-- 2. Таблица
CREATE TABLE IF NOT EXISTS <table_name> (
id uuid DEFAULT gen_random_uuid() PRIMARY KEY,
branch_id uuid REFERENCES branches(id) NOT NULL,
-- ... бизнес-колонки ...
status <table>_status NOT NULL DEFAULT 'value1',
created_at timestamptz DEFAULT now() NOT NULL,
updated_at timestamptz DEFAULT now() NOT NULL
);
-- 3. Индексы
CREATE INDEX idx_<table>_branch_id ON <table_name>(branch_id);
CREATE INDEX idx_<table>_status ON <table_name>(status);
-- Для таблиц с поиском по телефону:
-- CREATE UNIQUE INDEX idx_patients_phone ON patients(phone);
-- 4. updated_at триггер
CREATE TRIGGER set_<table>_updated_at
BEFORE UPDATE ON <table_name>
FOR EACH ROW EXECUTE FUNCTION moddatetime(updated_at);
-- 5. RLS
ALTER TABLE <table_name> ENABLE ROW LEVEL SECURITY;
ALTER TABLE <table_name> FORCE ROW LEVEL SECURITY;
-- (добавить политики через supabase-rls skill)
-- 6. Audit trigger (для критичных таблиц)
CREATE TRIGGER audit_<table_name>
AFTER INSERT OR UPDATE OR DELETE ON <table_name>
FOR EACH ROW EXECUTE FUNCTION log_audit_event();
COMMIT;
CREATE OR REPLACE FUNCTION log_audit_event() RETURNS trigger AS $$
BEGIN
INSERT INTO audit_logs (
user_id, action_type, entity_table, entity_id,
old_payload, new_payload
) VALUES (
auth.uid(),
TG_OP,
TG_TABLE_NAME,
COALESCE(NEW.id, OLD.id),
CASE WHEN TG_OP != 'INSERT' THEN to_jsonb(OLD) ELSE NULL END,
CASE WHEN TG_OP != 'DELETE' THEN to_jsonb(NEW) ELSE NULL END
);
RETURN COALESCE(NEW, OLD);
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;
Каждая миграция должна иметь rollback-секцию в комментарии:
-- ROLLBACK:
-- DROP TABLE IF EXISTS <table_name>;
-- DROP TYPE IF EXISTS <table>_status;
YYYYMMDD_HHMMSS_description.sqlBEGIN; ... COMMIT;CHECK ограничения на критичные поля (quantity >= 0)branch_id, status, внешние ключи