Helios co.
Lt. Commander
- Registriert
- März 2005
- Beiträge
- 1.863
Hallo @all,
ich brauche dringend eure Hilfe, bezüglich (wie der Titel schon sagt) Trigger in Postgre.
Ich brauche einen Trigger, der VOR einem INSERT in eine Tabelle prüft, ob in einer anderen Tabelle ein bestimmter Wert gesetzt ist.
Konkret:
Ich habe eine Tabelle Ressource,die auch Fotos enthalten kann. Hier gibts pro Zeile einen boolischen Wert: "istFoto", der definiert ob das Ding ein Foto ist oder ein andere Ressource.
Jetzt möchte ich einen Eintrag aus Ressourceals in FotoFavorit abspeichern können, also in einer Tabelle FAVORIT.
In FAVORIT dürfen nur "Fotos" gespeichert werden...
D.h. ich muss diesen boolleschen Wert vor jedem Einfügen prüfen...wenn er gesetzt ist, so soll das Einfügen klappen, sonst soll es eine Fehlermeldung geben.(bzw. EInfügen darf keinesfalls klappen)
Urpsrünglich wollte ich das Problem mit Constraints lösen, was aber leider nicht ging:
da man in der CHECK-Anweisung keine Unteranfragen stellen darf.
Mit Triggern in Postgre kenne ich mich aber leider absolut nicht aus (anscheinend unterscheidet sich auch die Syntax stark z.B. von der in Oracle)
Adequate Beispiele habe ich leider auch keine gefunden.
Ich vermute aber, dass es in etwa so gehen muss:
D.h. ich definiere zunächst den Trigger (hier die Frage: Warum kann man NO CASCADE nicht verwenden?) und muss auch noch eine Funktion definieren, die die Überprüfung dann durchführt...
Oder kann man die Überprüfung auch direkt im Trigger durchführen lassen,so wie es in Oracle möglich zu sein scheint!
Mir ist z.B. auch absolut nicht klar, wie die entsprechende Funktion aussheen könnte.
(kann ich in ihr die Select Anweisung durchführen?->Wie gesagt, ich bin sehr konfus!)
Ich wäre sehr dankbar besonders für schnelle Hilfe (Tips)!!!
THX
Helios
ich brauche dringend eure Hilfe, bezüglich (wie der Titel schon sagt) Trigger in Postgre.
Ich brauche einen Trigger, der VOR einem INSERT in eine Tabelle prüft, ob in einer anderen Tabelle ein bestimmter Wert gesetzt ist.
Konkret:
Ich habe eine Tabelle Ressource,die auch Fotos enthalten kann. Hier gibts pro Zeile einen boolischen Wert: "istFoto", der definiert ob das Ding ein Foto ist oder ein andere Ressource.
Jetzt möchte ich einen Eintrag aus Ressourceals in FotoFavorit abspeichern können, also in einer Tabelle FAVORIT.
In FAVORIT dürfen nur "Fotos" gespeichert werden...
D.h. ich muss diesen boolleschen Wert vor jedem Einfügen prüfen...wenn er gesetzt ist, so soll das Einfügen klappen, sonst soll es eine Fehlermeldung geben.(bzw. EInfügen darf keinesfalls klappen)
Urpsrünglich wollte ich das Problem mit Constraints lösen, was aber leider nicht ging:
Code:
CREATE TABLE Favorit (FavoritID INTEGER, ReferenceFotoID INTEGER REFERENCES Ressource, FavoritBesitzerID INTEGER, PRIMARY KEY (FavoritID),
CONSTRAINT FavoritIstFoto
CHECK (EXISTS (SELECT * FROM Ressource WHERE Favorit.ReferenceFotoID = Ressource.RessourceBesitzerID AND Ressource.istFoto=t)));
Mit Triggern in Postgre kenne ich mich aber leider absolut nicht aus (anscheinend unterscheidet sich auch die Syntax stark z.B. von der in Oracle)
Adequate Beispiele habe ich leider auch keine gefunden.
Ich vermute aber, dass es in etwa so gehen muss:
Code:
CREATE TRIGGER istFoto
BEFORE INSERT ON Favorit
FOR EACH ROW
EXECUTE PROCEDURE checkIstFoto();
CREATE INSERT FUNCTION() RETURNS TRIGGER AS $$
D.h. ich definiere zunächst den Trigger (hier die Frage: Warum kann man NO CASCADE nicht verwenden?) und muss auch noch eine Funktion definieren, die die Überprüfung dann durchführt...
Oder kann man die Überprüfung auch direkt im Trigger durchführen lassen,so wie es in Oracle möglich zu sein scheint!
Mir ist z.B. auch absolut nicht klar, wie die entsprechende Funktion aussheen könnte.
(kann ich in ihr die Select Anweisung durchführen?->Wie gesagt, ich bin sehr konfus!)
Ich wäre sehr dankbar besonders für schnelle Hilfe (Tips)!!!
THX
Helios
Zuletzt bearbeitet: