From a6d24ab86cc752ab8502240f7770dff7f6aff47f Mon Sep 17 00:00:00 2001 From: Christian Gick Date: Tue, 27 Jan 2026 19:14:00 +0200 Subject: [PATCH] fix(CF-518): Add ON UPDATE CASCADE to all projects foreign keys Fixes task project rename command by adding ON UPDATE CASCADE to all foreign key constraints that reference projects(key). Updated 10 FK constraints: task_sequences, epic_sequences, versions, epics, tasks, project_locks, project_archives, sessions, session_sequences, project_documentation. Migration drops old constraints and adds new ones with both ON DELETE CASCADE and ON UPDATE CASCADE (except sessions which uses ON DELETE SET NULL). Co-Authored-By: Claude Sonnet 4.5 --- migrations/023_fix_task_sequences_cascade.sql | 109 ++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 migrations/023_fix_task_sequences_cascade.sql diff --git a/migrations/023_fix_task_sequences_cascade.sql b/migrations/023_fix_task_sequences_cascade.sql new file mode 100644 index 0000000..384365d --- /dev/null +++ b/migrations/023_fix_task_sequences_cascade.sql @@ -0,0 +1,109 @@ +-- Migration 023: Add ON UPDATE CASCADE to all projects foreign keys +-- Allows project key updates (rename) to cascade to all dependent tables +-- Fixes: CF-518 - task project rename command fails due to FK constraints + +-- Fix task_sequences table +ALTER TABLE task_sequences + DROP CONSTRAINT IF EXISTS task_sequences_project_fkey; + +ALTER TABLE task_sequences + ADD CONSTRAINT task_sequences_project_fkey + FOREIGN KEY (project) REFERENCES projects(key) + ON DELETE CASCADE + ON UPDATE CASCADE; + +-- Fix epic_sequences table +ALTER TABLE epic_sequences + DROP CONSTRAINT IF EXISTS epic_sequences_project_fkey; + +ALTER TABLE epic_sequences + ADD CONSTRAINT epic_sequences_project_fkey + FOREIGN KEY (project) REFERENCES projects(key) + ON DELETE CASCADE + ON UPDATE CASCADE; + +-- Fix versions table +ALTER TABLE versions + DROP CONSTRAINT IF EXISTS versions_project_fkey; + +ALTER TABLE versions + ADD CONSTRAINT versions_project_fkey + FOREIGN KEY (project) REFERENCES projects(key) + ON DELETE CASCADE + ON UPDATE CASCADE; + +-- Fix epics table +ALTER TABLE epics + DROP CONSTRAINT IF EXISTS epics_project_fkey; + +ALTER TABLE epics + ADD CONSTRAINT epics_project_fkey + FOREIGN KEY (project) REFERENCES projects(key) + ON DELETE CASCADE + ON UPDATE CASCADE; + +-- Fix tasks table +ALTER TABLE tasks + DROP CONSTRAINT IF EXISTS tasks_project_fkey; + +ALTER TABLE tasks + ADD CONSTRAINT tasks_project_fkey + FOREIGN KEY (project) REFERENCES projects(key) + ON DELETE CASCADE + ON UPDATE CASCADE; + +-- Fix project_locks table (from migration 004) +ALTER TABLE project_locks + DROP CONSTRAINT IF EXISTS project_locks_project_fkey; + +ALTER TABLE project_locks + ADD CONSTRAINT project_locks_project_fkey + FOREIGN KEY (project) REFERENCES projects(key) + ON DELETE CASCADE + ON UPDATE CASCADE; + +-- Fix project_archives table (from migration 009) +ALTER TABLE project_archives + DROP CONSTRAINT IF EXISTS project_archives_project_key_fkey; + +ALTER TABLE project_archives + ADD CONSTRAINT project_archives_project_key_fkey + FOREIGN KEY (project_key) REFERENCES projects(key) + ON DELETE CASCADE + ON UPDATE CASCADE; + +-- Fix sessions table (from migration 010) +-- Note: sessions.project uses ON DELETE SET NULL, so we use ON UPDATE CASCADE +ALTER TABLE sessions + DROP CONSTRAINT IF EXISTS sessions_project_fkey; + +ALTER TABLE sessions + ADD CONSTRAINT sessions_project_fkey + FOREIGN KEY (project) REFERENCES projects(key) + ON DELETE SET NULL + ON UPDATE CASCADE; + +-- Fix session_sequences table (from migration 010) +ALTER TABLE session_sequences + DROP CONSTRAINT IF EXISTS session_sequences_project_fkey; + +ALTER TABLE session_sequences + ADD CONSTRAINT session_sequences_project_fkey + FOREIGN KEY (project) REFERENCES projects(key) + ON DELETE CASCADE + ON UPDATE CASCADE; + +-- Fix project_documentation table (from migration 016) +ALTER TABLE project_documentation + DROP CONSTRAINT IF EXISTS project_documentation_project_fkey; + +ALTER TABLE project_documentation + ADD CONSTRAINT project_documentation_project_fkey + FOREIGN KEY (project) REFERENCES projects(key) + ON DELETE CASCADE + ON UPDATE CASCADE; + +-- Record migration +INSERT INTO schema_migrations (version, applied_at) +VALUES ('023_fix_task_sequences_cascade', NOW()) +ON CONFLICT DO NOTHING;