Loading...
Loading...
Clean and format SQL migrations for Supabase - idempotency, RLS policies, formatting, schema fixes. Use when: fix this SQL, clean migration, RLS policy, Supabase schema, format postgres, prepare for SQL Editor, idempotent migration.
npx skill4agent add scientiacapital/skills supabase-sql- -- IF NOT EXISTSDROP ... IF EXISTSTO service_roleNOW()TIMESTAMPTZDROP POLICY IF EXISTS "Policy name" ON table_name;
CREATE POLICY "Policy name" ON table_name ...DROP ... IF EXISTSCREATETO service_roleIF NOT EXISTS- -- IF NOT EXISTSDROP ... IF EXISTSTO service_roleNOW()now()TIMESTAMPTZtimestamptz-- ============================================
-- Migration Name
-- Created: YYYY-MM-DD
-- Purpose: One-line description
-- ============================================
-- ============================================
-- Table Name
-- ============================================
CREATE TABLE IF NOT EXISTS ...
-- ============================================
-- Indexes
-- ============================================
CREATE INDEX IF NOT EXISTS ...
-- ============================================
-- Row Level Security
-- ============================================
ALTER TABLE ... ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS "..." ON ...;
CREATE POLICY "..." ON ...
-- ============================================
-- Functions
-- ============================================
CREATE OR REPLACE FUNCTION ...
-- ============================================
-- Triggers
-- ============================================
DROP TRIGGER IF EXISTS ... ON ...;
CREATE TRIGGER ...-- WRONG (doesn't work reliably)
CREATE POLICY "Service role access" ON my_table
FOR ALL
USING (auth.jwt() ->> 'role' = 'service_role');
-- CORRECT
CREATE POLICY "Service role access" ON my_table
FOR ALL
TO service_role
USING (true)
WITH CHECK (true);-- Always drop before create
DROP POLICY IF EXISTS "Policy name" ON table_name;
CREATE POLICY "Policy name" ON table_name ...DROP TRIGGER IF EXISTS trigger_name ON table_name;
CREATE TRIGGER trigger_name ...TEXT CHECK (...)-- DELETE THIS - never used
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'my_enum') THEN
CREATE TYPE my_enum AS ENUM ('a', 'b', 'c');
END IF;
END$$;
-- Table actually uses TEXT with CHECK (keep this)
status TEXT NOT NULL CHECK (status IN ('a', 'b', 'c'))-- Dependencies: businesses, call_logs, subscription_plans
-- Requires function: update_updated_at_column()reference/rls-patterns.mdreference/function-patterns.md