Trigger-Procedure um Stoffe auf Lager wiederherzustellen

Kampfgummibaerlie

Datenbank-Guru
Beiträge
736
Also, ich arbeite nach wie vor an meinem Lieblings-Projekt und komme einmal wieder zu einem Problem ;)

Ich möchte eine Trigger-Procedure aufbauen, die sich on delete zündet, und den Lagerstand in der Tabelle Stoffe wieder höher setzt, wenn eine Bestellung abgebrochen wird (gelöscht).

Mein Tabellenaufbau (Bestellungen):
Code:
create table bestellungen(id serial primary key, produkte int[]);

ich stoße auf das Problem on delete von dieser Tabelle wegen dem Trigger...

Meine Funktion:
Code:
create or replace function return_stoffe_on_delete() returns trigger as $$ 
declare
produkte int[] := bestellungen.produkte from bestellungen where bestellungen.produkte limit 1;
var int;
begin
    foreach var in array produkte loop
    update stoffe set lagermenge = lagermenge+schnittmuster.stoffmenge
    from schnittmuster
    inner join produkte on (produkte.schnittmuster = schnittmuster.id)
    where var = produkte.id;
    end loop;
return new;
end;
$$ language plpgsql;

der trigger:
Code:
create trigger return_stoffe_on_delete before delete on bestellungen for each row execute procedure return_stoffe_on_delete();

Mein Problem:
der oben genannte trigger führt 0 deletes durch...

ein after-trigger meint dann, dass kein wert im loop NULL sein darf...

Kann mir hierbei jemand helfen?

LG Kampfgummibaerlie
 
Werbung:
Nach googlen und so weiter die Lösung gefunden ;)

Hier die Funktion:
Code:
create or replace function stoffgutschrift_on_delete() returns trigger as $$
begin
update stoffe set lagermenge = lagermenge+schnittmuster.stoffmenge from schnittmuster
inner join produkte on (schnittmuster.id = produkte.schnittmuster)
where produkte.id = old.produkt
and produkte.schnittmuster = schnittmuster.id
and stoffe.id = produkte.stoff;
return old;
end;
$$
language plpgsql;

der trigger:
Code:
create trigger stoffgutschrift_on_delete before delete on aufträge for each row execute procedure stoffgutschrift_on_delete();

das eigentliche Problem welches ich hatte war das return new statt dem return old.

wenn sich jemand findet, der mir das erneut beschreiben kann, bin ich natürlich sehr dankbar ;)

LG Kampfgummibaerlie

EDIT:
oder ist das ganze selbst erklärend, wenn man mit einem new.column arbeitet muss man return new angeben und im anderen fall mit einem old value einfach return old?
 
oder ist das ganze selbst erklärend, wenn man mit einem new.column arbeitet muss man return new angeben und im anderen fall mit einem old value einfach return old?
Ich finde schon, dass es selbsterklärend ist.

Der Rückgabewert der Triggerfunktion wird bei der weiteren Abarbeitung des Statements verwendet. Gibt man den alten Wert zurück, wird mit den alten Werten weitergearbeitet. Gibt man den neuen Wert zurück, eben mit den neuen.
 
Werbung:
new und old erklären sich am besten aus einem Update Trigger.
Es liegt auf der Hand, dass hier neue (new) Werte reinkommen wegen des Update und alte (old) Werte ggf. weichen müssen.

Der Trigger feuert grundsätzlich bei Update, die eigentliche Datenänderung hängt fast immer von den Wünschen des Entwicklers ab. Dazu braucht er eine Entscheidungsbasis.
Um bestimmte Reaktionen on update durchzuführen, gehört die Auswertung der Feldänderung anhand eines Vergleichs alter und neuer Werte eines Feldes (oder mehrerer) fast immer dazu.

Bei Insert oder Delete Triggern ist die Unterscheidung natürlich new/old natürlich bedeutungslos. Der Anlass (insert, delete) impliziert, wie new und old belegt sein müssten.
 
Zurück
Oben