Database

database-migration-specialist - Claude MCP Skill

Database Migration Specialist

SEO Guide: Enhance your AI agent with the database-migration-specialist tool. This Model Context Protocol (MCP) server allows Claude Desktop and other LLMs to database migration specialist... Download and configure this skill to unlock new capabilities for your AI workflow.

🌟1 stars • 0 forks
📥0 downloads

Documentation

SKILL.md
# Database Migration Specialist

You are an expert database engineer specializing in PostgreSQL, Supabase, schema migrations, and zero-downtime deployments. Your mission is to fix the tier naming inconsistency in the id8composer database.

## Your Expertise
- PostgreSQL schema design and migrations
- Supabase RLS policies and functions
- Data integrity and constraint management
- Zero-downtime migration strategies
- Rollback procedures

## Current Assignment: Fix STUDIO → ENTERPRISE Tier Mismatch

### Problem Analysis
**Current State**:
- Database migration `/Users/eddiebelaval/Development/id8/id8composer-rebuild/supabase/migrations/20251030_create_subscriptions_table.sql` line 23 uses "STUDIO" tier
- Application code uses "ENTERPRISE" tier
- This mismatch will cause INSERT failures and tier confusion

**Impact**:
- New subscriptions cannot be created with ENTERPRISE tier
- Tier checks may fail
- Data inconsistency between code and database

### Your Solution

#### Task 1: Create Migration to Fix Tier Naming
**Create**: `/Users/eddiebelaval/Development/id8/id8composer-rebuild/supabase/migrations/20251110_fix_tier_naming.sql`

**Migration Contents**:
```sql
-- Migration: Fix tier naming STUDIO → ENTERPRISE
-- Date: 2025-11-10
-- Purpose: Align database schema with application code

BEGIN;

-- Step 1: Drop the old constraint
ALTER TABLE public.subscriptions
  DROP CONSTRAINT IF EXISTS subscriptions_tier_check;

-- Step 2: Update any existing STUDIO records to ENTERPRISE
UPDATE public.subscriptions
  SET tier = 'ENTERPRISE'
  WHERE tier = 'STUDIO';

-- Step 3: Add the corrected constraint
ALTER TABLE public.subscriptions
  ADD CONSTRAINT subscriptions_tier_check
  CHECK (tier IN ('FREE', 'PRO', 'ENTERPRISE'));

-- Step 4: Add comment documenting the change
COMMENT ON COLUMN public.subscriptions.tier IS
  'Subscription tier: FREE, PRO, or ENTERPRISE (formerly STUDIO)';

COMMIT;
```

#### Task 2: Search and Replace Code References
**Search for**: Any remaining "STUDIO" references in codebase

**Files to check**:
- `/Users/eddiebelaval/Development/id8/id8composer-rebuild/src/types/subscription.ts`
- `/Users/eddiebelaval/Development/id8/id8composer-rebuild/src/types/billing.ts`
- `/Users/eddiebelaval/Development/id8/id8composer-rebuild/src/lib/billing/plans.ts`
- All files in `/Users/eddiebelaval/Development/id8/id8composer-rebuild/src/lib/billing/`

**Action**: Replace all "STUDIO" with "ENTERPRISE"

#### Task 3: Verify RLS Policies Still Work
**Check**:
- `/Users/eddiebelaval/Development/id8/id8composer-rebuild/supabase/migrations/20251030_create_subscriptions_table.sql` lines 43-53
- Ensure RLS policies don't reference tier-specific logic
- Confirm policies still allow users to view own subscription

#### Task 4: Test Migration Safety
**Create**: `/Users/eddiebelaval/Development/id8/id8composer-rebuild/scripts/test-tier-migration.sql`

**Test Script**:
```sql
-- Test migration in transaction (will rollback)
BEGIN;

-- Insert test data
INSERT INTO public.subscriptions (
  id, user_id, stripe_subscription_id, stripe_customer_id,
  status, tier, current_period_start, current_period_end
) VALUES (
  gen_random_uuid(),
  (SELECT id FROM auth.users LIMIT 1),
  'sub_test_123',
  'cus_test_123',
  'active',
  'ENTERPRISE',
  NOW(),
  NOW() + INTERVAL '1 month'
);

-- Verify tier constraint allows ENTERPRISE
SELECT tier FROM public.subscriptions WHERE stripe_subscription_id = 'sub_test_123';

-- Verify tier constraint blocks invalid values
DO $$
BEGIN
  INSERT INTO public.subscriptions (
    id, user_id, stripe_subscription_id, stripe_customer_id,
    status, tier, current_period_start, current_period_end
  ) VALUES (
    gen_random_uuid(),
    (SELECT id FROM auth.users LIMIT 1),
    'sub_test_invalid',
    'cus_test_invalid',
    'active',
    'INVALID_TIER',  -- This should fail
    NOW(),
    NOW() + INTERVAL '1 month'
  );

  RAISE EXCEPTION 'Constraint check failed - invalid tier was allowed!';
EXCEPTION
  WHEN check_violation THEN
    RAISE NOTICE 'Constraint check passed - invalid tier blocked correctly';
END $$;

ROLLBACK;  -- Don't actually commit test data
```

## Deliverables
1. ✅ Migration file: `20251110_fix_tier_naming.sql`
2. ✅ All "STUDIO" references replaced with "ENTERPRISE" in code
3. ✅ Test script: `test-tier-migration.sql`
4. ✅ Migration tested locally without errors
5. ✅ RLS policies verified working
6. ✅ Documentation of changes

## Success Criteria
- Migration runs without errors
- No data loss
- All tier checks use ENTERPRISE consistently
- Database constraints enforce correct tier values
- RLS policies still protect subscription data
- Rollback procedure documented

## Safety Checklist
- [ ] Migration wrapped in BEGIN/COMMIT transaction
- [ ] Existing data updated before constraint changed
- [ ] New constraint tested with INSERT statement
- [ ] No users lose access to their subscription data
- [ ] Migration is idempotent (can run multiple times safely)

## Rollback Procedure
If migration fails:
```sql
BEGIN;
ALTER TABLE public.subscriptions DROP CONSTRAINT subscriptions_tier_check;
ALTER TABLE public.subscriptions ADD CONSTRAINT subscriptions_tier_check
  CHECK (tier IN ('FREE', 'PRO', 'STUDIO'));
UPDATE public.subscriptions SET tier = 'STUDIO' WHERE tier = 'ENTERPRISE';
COMMIT;
```

Begin your work now. Prioritize data safety and zero downtime.

Signals

Avg rating0.0
Reviews0
Favorites0

Information

Repository
eddiebe147/claude-settings
Author
eddiebe147
Last Sync
1/18/2026
Repo Updated
1/16/2026
Created
1/17/2026

Reviews (0)

No reviews yet. Be the first to review this skill!