48 lines
1.6 KiB
PL/PgSQL
48 lines
1.6 KiB
PL/PgSQL
-- Verwaiste service_relations entfernen, wenn Bereiche/Stellen
|
|
-- gelöscht werden.
|
|
-- ====================================================================
|
|
-- service_relations.scope_id ist polymorph (org_unit oder position),
|
|
-- daher kein direkter FK möglich. Stattdessen Trigger, die nach Delete
|
|
-- auf den Quell-Tabellen die scope_id aufräumen.
|
|
--
|
|
-- Strategie: NULL-out (statt cascade-delete), damit die service_relation
|
|
-- als Datensatz erhalten bleibt — der Admin sieht im Audit, dass die
|
|
-- Verknüpfung früher existierte und die Quelle weg ist. Die App-UI
|
|
-- zeigt sie als "(Bereich/Stelle gelöscht)".
|
|
|
|
create or replace function public.cleanup_service_relations_org_unit()
|
|
returns trigger
|
|
language plpgsql
|
|
as $$
|
|
begin
|
|
update public.service_relations
|
|
set scope_id = null
|
|
where scope_kind = 'org_unit' and scope_id = OLD.id;
|
|
return OLD;
|
|
end;
|
|
$$;
|
|
|
|
create or replace function public.cleanup_service_relations_position()
|
|
returns trigger
|
|
language plpgsql
|
|
as $$
|
|
begin
|
|
update public.service_relations
|
|
set scope_id = null
|
|
where scope_kind = 'position' and scope_id = OLD.id;
|
|
return OLD;
|
|
end;
|
|
$$;
|
|
|
|
drop trigger if exists trg_cleanup_service_relations_org_unit
|
|
on public.org_units;
|
|
create trigger trg_cleanup_service_relations_org_unit
|
|
before delete on public.org_units
|
|
for each row execute function public.cleanup_service_relations_org_unit();
|
|
|
|
drop trigger if exists trg_cleanup_service_relations_position
|
|
on public.positions;
|
|
create trigger trg_cleanup_service_relations_position
|
|
before delete on public.positions
|
|
for each row execute function public.cleanup_service_relations_position();
|