원클릭으로
db-rollback
Restore database to previous snapshot or run rollback script
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Restore database to previous snapshot or run rollback script
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Execute story development with selectable automation modes to accommodate different developer preferences, skill levels, and story complexity.
Set up a Kord-aligned documentation baseline (no legacy frameworks)
Create Next Story Task methodology and workflow
Validate Next Story Task methodology and workflow
advanced-elicitation methodology and workflow
No checklists needed - this task facilitates brainstorming sessions, validation is through user interaction methodology and workflow
| name | db-rollback |
| description | Restore database to previous snapshot or run rollback script |
| agent | architect |
| subtask | false |
Restore database to previous snapshot or run rollback script
Parameter:* mode (optional, default: interactive)
Purpose:* Definitive pass/fail criteria for task completion
Checklist:*
acceptance-criteria:
- [ ] Data persisted correctly; constraints respected; no orphaned data
type: acceptance-criterion
blocker: true
validation: |
Assert data persisted correctly; constraints respected; no orphaned data
error_message: "Acceptance criterion not met: Data persisted correctly; constraints respected; no orphaned data"
Strategy:* abort
Common Errors:*
Error:* Connection Failed
Error:* Query Syntax Error
Error:* Transaction Rollback
target (string): Path to snapshot file or rollback scriptCRITICAL WARNING*: Display to user before proceeding
⚠️ DATABASE ROLLBACK WARNING ⚠️
You are about to restore the database to a previous state.
Target: {target}
This will:
✓ Drop and recreate all schema objects
✓ Preserve existing data (if schema-only snapshot)
✗ Lose any schema changes made after snapshot
✗ Potentially break application if schema incompatible
Are you ABSOLUTELY SURE you want to proceed?
Ask user to type: ROLLBACK to confirm
# Create emergency snapshot before rollback
echo "Creating emergency snapshot before rollback..."
TS=$(date +%Y%m%d_%H%M%S)
EMERGENCY="supabase/snapshots/${TS}_emergency_before_rollback.sql"
pg_dump "$SUPABASE_DB_URL" \
--schema-only \
--clean \
--if-exists \
> "$EMERGENCY"
if [ $? -eq 0 ]; then
echo "✓ Emergency snapshot: $EMERGENCY"
else
echo "❌ Emergency snapshot failed - ABORTING ROLLBACK"
exit 1
fi
TARGET="{target}"
# Check file exists
if [ ! -f "$TARGET" ]; then
echo "❌ Rollback target not found: $TARGET"
exit 1
fi
# Check file is valid SQL
if ! grep -q "CREATE\|DROP\|ALTER" "$TARGET"; then
echo "❌ File doesn't appear to be valid SQL"
exit 1
fi
echo "✓ Rollback target validated: $TARGET"
echo " File size: $(ls -lh "$TARGET" | awk '{print $5}')"
echo " Modified: $(ls -lh "$TARGET" | awk '{print $6, $7, $8}')"
Prevent concurrent operations:
echo "Acquiring exclusive lock..."
psql "$SUPABASE_DB_URL" -v ON_ERROR_STOP=1 -c \
"SELECT pg_try_advisory_lock(hashtext('dbsage:rollback')) AS got" \
| grep -q t || { echo "❌ Another operation is running"; exit 1; }
echo "✓ Lock acquired"
echo ""
echo "=== EXECUTING ROLLBACK ==="
echo "Started: $(date -Iseconds)"
echo ""
# Run rollback in single transaction
psql "$SUPABASE_DB_URL" -v ON_ERROR_STOP=1 -f "$TARGET"
RESULT=$?
echo ""
echo "Completed: $(date -Iseconds)"
echo ""
if [ $RESULT -eq 0 ]; then
echo "✅ ROLLBACK SUCCESSFUL"
else
echo "❌ ROLLBACK FAILED"
echo "Emergency snapshot available: $EMERGENCY"
echo "Attempting to restore from emergency snapshot..."
# Try to restore emergency snapshot
psql "$SUPABASE_DB_URL" -v ON_ERROR_STOP=1 -f "$EMERGENCY"
if [ $? -eq 0 ]; then
echo "✓ Restored from emergency snapshot"
else
echo "❌ Emergency restore also failed - DATABASE MAY BE INCONSISTENT"
echo "Manual intervention required"
fi
exit 1
fi
echo ""
echo "=== POST-ROLLBACK VALIDATION ==="
echo ""
# Count schema objects
echo "Schema object counts:"
psql "$SUPABASE_DB_URL" -t -c \
"SELECT
(SELECT COUNT(*) FROM pg_tables WHERE schemaname='public') AS tables,
(SELECT COUNT(*) FROM pg_policies WHERE schemaname='public') AS policies,
(SELECT COUNT(*) FROM pg_proc WHERE pronamespace='public'::regnamespace) AS functions;"
# Check for basic sanity
echo ""
echo "Quick sanity checks:"
psql "$SUPABASE_DB_URL" -v ON_ERROR_STOP=1 <<'SQL'
-- Check tables exist
SELECT 'Tables exist' AS check, COUNT(*) > 0 AS pass
FROM pg_tables WHERE schemaname='public';
-- Check functions exist
SELECT 'Functions exist' AS check, COUNT(*) > 0 AS pass
FROM pg_proc WHERE pronamespace='public'::regnamespace;
-- Check for orphaned objects (optional)
-- SELECT 'No orphaned triggers' AS check, COUNT(*) = 0 AS pass
-- FROM pg_trigger WHERE tgrelid NOT IN (SELECT oid FROM pg_class);
SQL
# Release lock
psql "$SUPABASE_DB_URL" -v ON_ERROR_STOP=1 -c \
"SELECT pg_advisory_unlock(hashtext('dbsage:rollback'));"
echo "✓ Lock released"
# Create post-rollback snapshot
POST_SNAPSHOT="supabase/snapshots/${TS}_post_rollback.sql"
pg_dump "$SUPABASE_DB_URL" --schema-only --clean --if-exists > "$POST_SNAPSHOT"
echo "✓ Post-rollback snapshot: $POST_SNAPSHOT"
✅ DATABASE ROLLBACK COMPLETED
Rolled back to: {target}
Timestamp: {TS}
Snapshots created:
- Emergency (before): $EMERGENCY
- Post-rollback (after): $POST_SNAPSHOT
Next steps:
1. smoke-test - Validate schema
2. rls-audit - Check security
3. Test application functionality
4. Monitor for issues
If issues detected:
rollback $EMERGENCY # Restore to pre-rollback state
Use when*: Reverting schema changes
rollback supabase/snapshots/20251026_pre_migration.sql
Pros*:
Cons*:
Use when*: Surgical changes to specific objects
-- supabase/rollback/20251026_rollback_user_roles.sql
BEGIN;
-- Undo changes in reverse order
DROP TRIGGER IF EXISTS set_user_role_timestamp ON user_roles;
DROP FUNCTION IF EXISTS update_user_role_timestamp();
DROP TABLE IF EXISTS user_roles;
-- Restore previous state if needed
-- ...
COMMIT;
rollback supabase/rollback/20251026_rollback_user_roles.sql
Pros*:
Cons*:
Use when*: Rollback is dangerous, fix forward instead
-- Instead of rolling back, apply corrective migration
-- migration: 20251026_fix_user_roles_bug.sql
Pros*:
Cons*:
| Situation | Strategy | Command |
|---|---|---|
| Migration failed mid-way | Restore snapshot | rollback snapshot_before.sql |
| Schema breaks app | Restore snapshot | rollback snapshot_before.sql |
| Wrong migration applied | Restore snapshot | rollback snapshot_before.sql |
| Minor bug in function | Forward fix | Create fix migration |
| Data corruption risk | Forward fix | Don't rollback |
| Production with users | Forward fix | Avoid schema rollback |
Before executing rollback:
# Fast and loose - just do it
rollback snapshot.sql
# Test the rollback process
rollback snapshot.sql
smoke-test
# Test app functionality
# CAREFUL - follow full checklist
# 1. Notify stakeholders
# 2. Enable maintenance mode
# 3. Create emergency snapshot (automatic)
# 4. Coordinate with team
rollback snapshot.sql
# 5. Validation
smoke-test
rls-audit
# 6. Test critical flows
# 7. Disable maintenance mode
# 8. Monitor closely
Situation*: apply-migration failed halfway
Action*: PostgreSQL already rolled back transaction ✓
No rollback needed*: Database unchanged
Next steps*:
dry-run to testapply-migration againSituation*: Schema change incompatible with application
Action*: Rollback to pre-migration snapshot
rollback supabase/snapshots/20251026_143022_pre_migration.sql
smoke-test
# Deploy previous app version or fix app
Situation*: Applied v1.3.0 migration instead of v1.2.5
Action*: Rollback to last known good state
rollback supabase/snapshots/20251026_120000_v1_2_4.sql
smoke-test
# Apply correct migration
apply-migration v1_2_5.sql
Situation*: Schema change caused data integrity issues
Action*: DON'T rollback schema - fix data
-- Forward fix with data correction
BEGIN;
-- Fix data
UPDATE users SET status = 'active' WHERE status IS NULL;
-- Add constraint to prevent recurrence
ALTER TABLE users ADD CONSTRAINT status_not_null CHECK (status IS NOT NULL);
COMMIT;
Problem*: Objects from new schema still exist
Fix*: Snapshot should have DROP ... IF EXISTS statements
Check snapshot file:
grep -c "DROP.IF EXISTS" snapshot.sql
If missing, regenerate snapshot with --clean --if-exists flags.
Problem*: Application incompatible with rolled-back schema
Solutions*:
Problem*: Cannot create safety snapshot
Action*: ABORT ROLLBACK
❌ ROLLBACK ABORTED
Cannot proceed without emergency snapshot
Check database connectivity and disk space
Problem*: Some objects not cleaned up
Fix*: Manually identify and remove
-- Find orphaned triggers
SELECT tgname FROM pg_trigger
WHERE tgrelid NOT IN (SELECT oid FROM pg_class);
-- Find orphaned indexes
SELECT indexname FROM pg_indexes
WHERE tablename NOT IN (SELECT tablename FROM pg_tables);
Instead of rollback, consider:
Track these after rollback:
# Log rollback event
echo "$(date -Iseconds) | ROLLBACK | $TARGET | Duration: ${DURATION}s" \
>> supabase/rollback/rollback.log
snapshot {label} - Create rollback pointapply-migration {path} - Creates automatic snapshotssmoke-test - Validate after rollbackrls-audit - Check security after rollbackIf rollback fails critically:
$EMERGENCYNever panic*: Emergency snapshot has your back.