-- 018_protect_admin_locations.sql -- Les corrections manuelles de géocodage n'étaient protégées par rien. -- -- Corriger à la main les coordonnées d'un groupe écrit un band_locations avec -- geocode_provider='admin' et geocode_confidence=1.0 : la donnée la plus -- autoritaire du système, saisie par un humain, impossible à régénérer. -- -- Or le trigger de la migration 013 supprime TOUTES les band_locations d'un -- groupe dès que son location_text change — override compris. Et locked_fields -- ne protège que les colonnes de `bands`, jamais les points. Une correction -- disparaissait donc silencieusement à la première modification du lieu, y -- compris quand ce lieu venait d'être verrouillé par l'admin lui-même. -- -- Le trigger épargne désormais les points posés par un admin. Ils restent -- supprimables explicitement (DELETE depuis la route, reset-all ciblé), mais -- plus par effet de bord. CREATE OR REPLACE FUNCTION bands_geocode_dirty() RETURNS trigger AS $$ BEGIN IF TG_OP = 'UPDATE' AND OLD.location_text IS DISTINCT FROM NEW.location_text THEN DELETE FROM band_locations WHERE ma_id = NEW.ma_id AND COALESCE(geocode_provider, '') <> 'admin'; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; DROP TRIGGER IF EXISTS trg_bands_geocode_dirty ON bands; CREATE TRIGGER trg_bands_geocode_dirty AFTER UPDATE OF location_text ON bands FOR EACH ROW EXECUTE FUNCTION bands_geocode_dirty();