-- Run in Supabase SQL Editor or psql and export results as CSV/JSON. -- 1) App tables and columns (public only) select c.table_name, c.ordinal_position, c.column_name, c.data_type, c.udt_name, c.is_nullable, c.column_default from information_schema.columns c join information_schema.tables t on t.table_schema = c.table_schema and t.table_name = c.table_name where c.table_schema = 'public' and t.table_type = 'BASE TABLE' order by c.table_name, c.ordinal_position; -- 2) Constraints select rel.relname as table_name, con.conname as constraint_name, case con.contype when 'p' then 'PRIMARY KEY' when 'u' then 'UNIQUE' when 'f' then 'FOREIGN KEY' when 'c' then 'CHECK' else con.contype::text end as constraint_type, pg_get_constraintdef(con.oid, true) as definition from pg_constraint con join pg_class rel on rel.oid = con.conrelid join pg_namespace n on n.oid = rel.relnamespace where n.nspname = 'public' order by rel.relname, con.conname; -- 3) Indexes select tablename, indexname, indexdef from pg_indexes where schemaname = 'public' order by tablename, indexname; -- 4) Views select c.relname as view_name, case c.relkind when 'v' then 'VIEW' when 'm' then 'MATERIALIZED VIEW' end as view_type, pg_get_viewdef(c.oid, true) as definition from pg_class c join pg_namespace n on n.oid = c.relnamespace where n.nspname = 'public' and c.relkind in ('v', 'm') order by c.relname; -- 5) Functions / Procedures select p.proname as routine_name, case p.prokind when 'p' then 'PROCEDURE' else 'FUNCTION' end as routine_type, l.lanname as language, pg_get_function_identity_arguments(p.oid) as args, pg_get_functiondef(p.oid) as definition from pg_proc p join pg_namespace n on n.oid = p.pronamespace join pg_language l on l.oid = p.prolang where n.nspname = 'public' order by p.proname; -- 6) Triggers select c.relname as table_name, t.tgname as trigger_name, pg_get_triggerdef(t.oid, true) as definition from pg_trigger t join pg_class c on c.oid = t.tgrelid join pg_namespace n on n.oid = c.relnamespace where n.nspname = 'public' and not t.tgisinternal order by c.relname, t.tgname; -- 7) RLS status select c.relname as table_name, c.relrowsecurity as rls_enabled, c.relforcerowsecurity as rls_forced from pg_class c join pg_namespace n on n.oid = c.relnamespace where n.nspname = 'public' and c.relkind = 'r' order by c.relname; -- 8) RLS policies select tablename, policyname, permissive, roles, cmd, qual, with_check from pg_policies where schemaname = 'public' order by tablename, policyname; -- 9) Grants (tables) select table_name, privilege_type, grantee from information_schema.role_table_grants where table_schema = 'public' order by table_name, grantee, privilege_type;