Trigger oder auf falschen Weg?!?

Hallo zusammen erstmal,

ich möchte an einem Beispiel mein Problem verdeutlichen.

Es gibt zwei Tabellen in meinem Beispiel “Tabelle 1” und “Tabelle 2”.
Beide Tabellen haben die Spalten “Wert a” und “Wert b”.

Wenn nun ein INSERT auf “Tabelle 1” gemacht wird, in dem “Wert a” und “Wert b” festgelegt werden, dann möchte ich, dass der “Wert b” auch in die “Tabelle 2” geschrieben wird.

Kann ich dies mit Triggern machen oder bin ich mit dieser Idee auf dem Holzweg?

Ja, das geht.

Ok, nachdem wir die theoretische Möglichkeit dazu haben.

Wie wird das technisch realisiert.

CREATE TRIGGER test AFTER INSERT ON “Tabelle 1”
FOR EACH ROW EXECUTE PROCEDURE testfunction();

CREATE OR REPLACE FUNCTION testfunction() RETURNS trigger AS $$
BEGIN
INSERT INTO “Tabelle 2” (‘Wert a’, ‘Wert b’) VALUES (11, 34);

END;
$$ LANGUAGE plpgsql;

Würde das so funktionieren?
Seht ihr Fehler oder bin ich da wieder aufm Holzweg?

Du hast in einer Triggerfunktion (zumindest wenn du sie in plpgsql realisierst) die Variablen OLD und/oder NEW zur Verfügung. Bei einem Insert ist das nur NEW. Dort drin stehen die Werte, die aktuell in die Tabelle geschrieben werden sollen.

Legst du deinen Trigger jetzt als AFTER aus, kannst du diese Werte in einen eigenen Query übertragen und in eine zweite Tabelle schreiben.

Etwas ähnliches erzeugt eine Software für PostgreSQL von mir (tablelog), aber die ist etwas umfangreicher und in C geschrieben. Hier werden alle Änderungen an einer Tabelle mitgeloggt.

CREATE OR REPLACE FUNCTION testfunction() RETURNS trigger AS $$
BEGIN
INSERT INTO “Tabelle 2” (‘Wert a’, ‘Wert b’) VALUES (NEW.[Wert a], NEW.[Wert b]);

END;
$$ LANGUAGE plpgsql;

Soll das in etwa so aussehen?

Du hast noch den Return- Wert vergessen. Also:

CREATE OR REPLACE FUNCTION testfunction() RETURNS trigger AS $$
BEGIN
INSERT INTO “Tabelle 2” (‘Wert a’, ‘Wert b’) VALUES (NEW.[Wert a], NEW.[Wert b]);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

Ansonsten denke ich, könnte das so funktionieren. Dann hast du die Funktion, fehlt noch der Auslöser (Trigger), also etwas wie:

create trigger trg_loeseTestfunktionAus
AFTER insert
on “TABELLE 1”
for each row
execute procedure testfunction();