Hallo zusamen,
ich möchte eigentlich, auch wenn es sich für einen Neuling vielleicht nicht gehören mag, ohne Umschweife direkt zum Kern meines Problems kommen.
Ich habe eine Tabelle in welcher neben einigen Daten unter anderem zwei Datumsangaben für die Bildung eines Zeitraums gespeichert werden. Ferner ist in dieser Tabelle ein Fremdschlüssel gespeichert der auf eine Tuple in einer anderen Tabelle verweist, um so den Zeitraum z.B. einer Person zuordnen zu können. Nun möchte/muss ich mittels Trigger die Überschneidung zweier Zeiträume einer Person verhindern. Sprich, weder Anfangsdatum noch Enddatum einer Person, dürfen in einem bereits in der Tabelle existierenden Zeitraum der betreffenden Person liegen. Wenn also bereits ein Datensatz der Art "PersonA vom 10.Dezember.2011 bis 20.Dezember.2011" existiert darf ich keinen weiteren Datensatz mit PersonA einfügen, in welcher weder Anfangs- noch das Enddatum im Zeitraum vom 10.Dezember.2011 bis 20.Dezember.2011 liegen darf.
Meine eigene Recherche hat bisher zu Tage gefördert, dass ich keinen "before update"-Trigger verwenden darf. Ich habe auch verstanden das es etwas mit der Reihenfolgenunabhängigkeit zutun hat, wieso das nun so ist jedoch leider nicht. Ich habe jetzt auch desöfteren gelesen das Problem durch einen "after-update"-Trigger umgehen zu können, dies leider ohne bisherigen Erfolg.
Meine bisherige Idee bestand vor allem darin:
1) Cursor für die Datumsangaben einer Person anlegen.
2) Den Cursor durchlaufen un prüfen ob es eine Datumüberschneidung gibt.
3) Gibt es einer Überschneidung, rollback starten. (Noch ohne eigene Exception)
Das unter Insert-Statement gehört eigentlich nicht dazu, die Tabelle "trigger_log"ist rein experimenteller Natur. Dort speicher ich derzeit nur die
ld... und :new... Variablen umzusehen, was wann wo drin steht.
Leider erhalte ich auch hier eine Mutating-Table-Warnung und weiss so langsam nicht mehr was ich tun soll noch warum.
Jemand nettes hier der mir meinen Fehler erklären mag? Wäre wirklich nett.
Schonmal Danke im voraus.
ich möchte eigentlich, auch wenn es sich für einen Neuling vielleicht nicht gehören mag, ohne Umschweife direkt zum Kern meines Problems kommen.
Ich habe eine Tabelle in welcher neben einigen Daten unter anderem zwei Datumsangaben für die Bildung eines Zeitraums gespeichert werden. Ferner ist in dieser Tabelle ein Fremdschlüssel gespeichert der auf eine Tuple in einer anderen Tabelle verweist, um so den Zeitraum z.B. einer Person zuordnen zu können. Nun möchte/muss ich mittels Trigger die Überschneidung zweier Zeiträume einer Person verhindern. Sprich, weder Anfangsdatum noch Enddatum einer Person, dürfen in einem bereits in der Tabelle existierenden Zeitraum der betreffenden Person liegen. Wenn also bereits ein Datensatz der Art "PersonA vom 10.Dezember.2011 bis 20.Dezember.2011" existiert darf ich keinen weiteren Datensatz mit PersonA einfügen, in welcher weder Anfangs- noch das Enddatum im Zeitraum vom 10.Dezember.2011 bis 20.Dezember.2011 liegen darf.
Meine eigene Recherche hat bisher zu Tage gefördert, dass ich keinen "before update"-Trigger verwenden darf. Ich habe auch verstanden das es etwas mit der Reihenfolgenunabhängigkeit zutun hat, wieso das nun so ist jedoch leider nicht. Ich habe jetzt auch desöfteren gelesen das Problem durch einen "after-update"-Trigger umgehen zu können, dies leider ohne bisherigen Erfolg.
Meine bisherige Idee bestand vor allem darin:
1) Cursor für die Datumsangaben einer Person anlegen.
2) Den Cursor durchlaufen un prüfen ob es eine Datumüberschneidung gibt.
3) Gibt es einer Überschneidung, rollback starten. (Noch ohne eigene Exception)
Das unter Insert-Statement gehört eigentlich nicht dazu, die Tabelle "trigger_log"ist rein experimenteller Natur. Dort speicher ich derzeit nur die

Code:
create or replace trigger trgprojektarbeitafterupdate after update on projektarbeit
for each row
declare
intprojektarbeit integer := 0;
cursor crsprojektarbeit is select anfangsdatum, enddatum from projektarbeit
where (matrikelnr = :new.matrikelnr or (thema like :new.thema and DozKn like :new.DozKn));
datumanfang Projektarbeit.anfangsdatum%type;
datumende projektarbeit.enddatum%type;
begin
open crsprojektarbeit;
loop
fetch crsprojektarbeit into datumanfang, datumende;
if ((:new.anfangsdatum between datumanfang and datumende) or (:new.enddatum between datumanfang and datumende)) then
raise_application_error(-20001, 'FEHLER!!!');
end if;
end loop;
close crsprojektarbeit;
insert into trigger_log (oldanfangsdatum, newanfangsdatum, oldenddatum, newenddatum, oldmatrikelnr, newmatrikelnr, oldthema, newthema)
values (:old.anfangsdatum, :new.anfangsdatum, :old.enddatum, :new.enddatum, :old.matrikelnr, :new.matrikelnr, :old.thema, :new.thema);
end trgUpdateProjektarbeit;
/
Leider erhalte ich auch hier eine Mutating-Table-Warnung und weiss so langsam nicht mehr was ich tun soll noch warum.
Jemand nettes hier der mir meinen Fehler erklären mag? Wäre wirklich nett.
Schonmal Danke im voraus.
