-- Idempotent: gleicher Zielzustand wie 048, auch wenn die CHECK schon existiert (z. B. 048 DB-seitig -- erfolgreich, aber nicht in schema_migrations). Ein einziges DO vermeidet Mehrfach-Statement-Probleme. DO $$ DECLARE r RECORD; BEGIN FOR r IN SELECT c.conname FROM pg_constraint c JOIN pg_class t ON c.conrelid = t.oid JOIN pg_namespace n ON n.oid = t.relnamespace WHERE n.nspname = 'public' AND t.relname = 'vitals_baseline' AND c.contype = 'c' AND ( c.conname = 'vitals_baseline_source_check' OR COALESCE(pg_get_constraintdef(c.oid), '') ILIKE '%source%' ) LOOP EXECUTE format('ALTER TABLE public.vitals_baseline DROP CONSTRAINT %I', r.conname); END LOOP; EXECUTE $ddl$ ALTER TABLE public.vitals_baseline ADD CONSTRAINT vitals_baseline_source_check CHECK (source IN ('manual', 'apple_health', 'garmin', 'withings', 'csv')) $ddl$; EXCEPTION WHEN duplicate_object THEN NULL; END $$;