Hallo, ich habe mal wieder eine Frage. Es geht darum das ich für eine bestimmte View einen UPDATE und DELETE Trigger benötige. Ich habe zur Zeit ein bisschen rumprobiert, kam aber noch zu keinem Ergebnis.
Es handelt sich um folgende Tabellen:
/* Tabelle Fachbereich anlegen */CREATE TABLE Fachbereich(
FBID serial PRIMARY KEY,
Fachbereich varchar(50)
);
/* Tabelle Fach anlegen */
CREATE TABLE Fach(
FachID serial PRIMARY KEY,
Fach varchar(100),
Studienrichtung varchar(20),
FBID integer REFERENCES Fachbereich(FBID)
);
/* Tabelle Versuche anlegen */
CREATE TABLE Versuche(
VersuchID serial PRIMARY KEY,
Versuch varchar(100),
sichtbarVersuch boolean,
FachID integer REFERENCES Fach(FachID)
);
Daraus habe ich dann folgende View gemacht:
CREATE VIEW prak_fach_fba AS select f.FachID, f.Fach, f.Studienrichtung, fb.Fachbereich From fach f INNER JOIN fachbereich fb ON f.FBId = fb.FBId WHERE fb.Fachbereich = 'Architektur';
Meine Triggerfunktion und der Trigger für UPDATE und DELETE sieht folgendermaßen aus:
CREATE OR REPLACE FUNCTION function_fach_fba()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $function$
BEGIN
IF TG_OP = 'UPDATE' THEN
UPDATE fach SET fachID = NEW.fachID, fach = NEW.fach, studienrichtung = NEW.studienrichtung, fbid = NEW.fbid WHERE fachID = old.fachID;
UPDATE fachbereich SET fachbereich = NEW.fachbereich WHERE fbid = OLD.fbid;
RETURN new;
ELSIF TG_OP = 'DELETE' THEN
DELETE FROM fach WHERE fachid = OLD.fachID;
RETURN null;
END IF;
RETURN new;
END;
$function$;
create trigger trg_insert
instead of update or delete on prak_fach_fba
for each row execute procedure
function_fach_fba();
Die Fehlermeldung beim DELETE ist mir noch klar, das ist nämlich folgende:
FEHLER: Aktualisieren oder Löschen in Tabelle »fach« verletzt Fremdschlüssel-Constraint »versuche_fachid_fkey« von Tabelle »versuche«
DETAIL: Auf Schlüssel (fachid)=(21) wird noch aus Tabelle »versuche« verwiesen.
CONTEXT: SQL-Anweisung »DELETE FROM fach WHERE fachid = OLD.fachID«
Da mein Primary Key FachID noch als Fremdschlüssel in der Tabelle Versuch auftaucht, kann man diesen nicht löschen. Muss man dann erst die Datensätze löschen die noch Bezug auf die FachID haben, oder gibt es da eine einfachere und bessere Lösung?
Beim UPDATE kommt folgende Fehlermeldung:
FEHLER: Record »new« hat kein Feld »fbid«
CONTEXT: SQL statement “UPDATE fach SET fachID = NEW.fachID, fach = NEW.fach, studienrichtung = NEW.studienrichtung, fbid = NEW.fbid WHERE fachID = old.fachID”
Da habe ich jedoch keine Ahnung was ich da verändern muss damit es klappt.
Würde mich über Tipps freuen, wie ich die beiden Probleme am besten angehen könnte.
Gruß Ulti