diff --git a/db/migrations/20260924220000_reporting_lines_ohne_zeilenschutz.sql b/db/migrations/20260924220000_reporting_lines_ohne_zeilenschutz.sql index 9b1046f..a76a6ee 100644 --- a/db/migrations/20260924220000_reporting_lines_ohne_zeilenschutz.sql +++ b/db/migrations/20260924220000_reporting_lines_ohne_zeilenschutz.sql @@ -141,6 +141,7 @@ grant execute on function public.om_reporting_lines(p_as_of date) to alpenwerk_a do $$ declare v_def text := pg_get_functiondef('public.om_reporting_lines(date)'::regprocedure); + v_teil text; begin -- Ohne die Prüfung in der ersten Zeile wäre aus der Funktion ein Loch im -- Zeilenschutz geworden: security definer liest an den Policies vorbei. @@ -154,14 +155,18 @@ begin raise exception 'om_reporting_lines hat keinen festen search_path — bei security definer ist das Pflicht.'; end if; - -- Und das Ergebnis bleibt, was es war: eine Zeile je laufender Besetzung. - if (select count(*) from om_reporting_lines(current_date)) - <> (select count(*) - from position_assignments pa - join om_positions p on p.id = pa.position_id - where pa.valid_from <= current_date and (pa.valid_to is null or pa.valid_to > current_date) - and p.valid_from <= current_date and (p.valid_to is null or p.valid_to > current_date)) then - raise exception 'om_reporting_lines liefert nicht mehr eine Zeile je laufender Besetzung.'; - end if; + -- Der Körper wird **gelesen, nicht ausgeführt**. Ein Aufruf hier wäre der + -- erste Fehlversuch dieser Migration gewesen: sie läuft als Administrator + -- ohne `app.user_id`, und require_hr_admin() weist sie damit zu Recht ab. + -- Eine Selbstprüfung darf nichts aufrufen, was einen angemeldeten + -- Anwendungsbenutzer voraussetzt. + foreach v_teil in array array[ + 'holder as', 'chief as', 'ancestry as', 'base as', + 'formal_manager_id', 'acting_manager_id', 'order by a.depth' + ] loop + if position(v_teil in v_def) = 0 then + raise exception 'Im Koerper fehlt „%" — beim Uebertragen ist etwas verlorengegangen.', v_teil; + end if; + end loop; end $$;