-- v0.3.95-beta: een gebruiker moet altijd te verwijderen zijn. -- -- Alle foreign keys die naar users(id) verwijzen horen ON DELETE CASCADE te -- zijn (of bewust SET NULL, zoals site_content.updated_by). Databases die zijn -- ontstaan vóór een tabel z'n cascade kreeg houden echter de oude constraint: -- `CREATE TABLE IF NOT EXISTS` werkt een bestaande tabel nooit bij. Op zo'n -- database geeft het verwijderen van een gebruiker een foreign-key-fout (500 -- "serverfout"). Deze migratie zoekt elke FK naar users die NIET cascade en -- NIET set-null is, en zet die alsnog op ON DELETE CASCADE - de bewuste -- SET NULL-constraints blijven ongemoeid. DO $$ DECLARE r RECORD; BEGIN FOR r IN SELECT con.conname AS name, con.conrelid::regclass::text AS tbl, att.attname AS col FROM pg_constraint con JOIN pg_attribute att ON att.attrelid = con.conrelid AND att.attnum = con.conkey[1] WHERE con.contype = 'f' AND con.confrelid = 'users'::regclass AND array_length(con.conkey, 1) = 1 -- alle user-FK's zijn 1 kolom AND con.confdeltype NOT IN ('c', 'n') -- niet cascade, niet set null LOOP EXECUTE format('ALTER TABLE %s DROP CONSTRAINT %I', r.tbl, r.name); EXECUTE format( 'ALTER TABLE %s ADD CONSTRAINT %I FOREIGN KEY (%I) REFERENCES users(id) ON DELETE CASCADE', r.tbl, r.name, r.col); RAISE NOTICE 'FK % op %(%): ON DELETE CASCADE hersteld', r.name, r.tbl, r.col; END LOOP; END $$;