Ich schreibe jeden Tag in eine Datenbank mehrere hundert einträge (alle auf einmal)
In der werden alle daten in eine History Tabelle kopiert. und dann Trigger in der History Tabelle ausgeführt.
Also
Wenn Insert in tabelle1 schießt trigger los und schreibt daten auch in tabelle 2
In Tabelle 2 soll dann folgendes passieren.
Before Insert
Möchte alle Daten vom Vor Vortag löschen (die haben die Zeile alt vom Typ Boolean True und new.name=name)
Möchte alle Daten vom Vortag (nach einem wochende halt vom Freitag)
alt true setzen
also
update alt set alt=true
where new.name=name )
After Insert
Da ist die Reihenfolge egal.
Wie kann ich es anstellen, dass die Trigger genau in der von mir gewollten Reihenfolge abgeschossen werden?
Außerdem habe ich noch ein Problem. Da er es nur einmal machen soll kann es kein Zeilentrigger sein, aber da ich eine new.* variable unabkömmlich verwende kann ich auch keinen statement trigger mit before verwenden… was soll ich tun?
Wenn du das alles auf einmal schreibst, pack die alle in eine einzelne Transaktion. Für Trigger gibt es sowohl Row-basierte wie Statement-basierte Trigger … und du suchst dann sicherlich letzteres.
Ja Timestamp natürlich, aber es kann auch mal sein, das ich einen Monat keine Daten mit dem Namen importiere.
Deswegen will ich alle löschen die den Namen haben und auf alt gestellt sind
und dann die vorhandenen daten mit dem namen auf alt stellen
aber das ist ja ein “before” trigger.
Da hab ich ja das Problem, dass ich kein new.* variablen benutzen kann.
Mir fällt keine Lösung ein wie ich das sonst machen könnte, außer ganz umständlich, dass ich den namen “select distinct” nehme und dann order by timestamp uns das dann lösche. dann könnte ich das mit nem after mache. Also:
delete from tabelle
where timestamp=(select distinct (name) timestamp
where name=new.name
order by timestamp) and name=new.name
aber das is mir zu doof, ich will die new.* variable auch in nem before trigger haben.
Kann ich irgendwie sagen, dass der Trigger nur einmal abgefeuert wird? Weil wenn ich 200 Zeilen importiere, dann muss ich den trigger ja pro zeile laufen lassen und müsste den entsprechend umformulieren. Aber ich würd den gerne nur ein ma abschießen
Ist das der Statement trigger?
Klar gibt es (in deinem Insert Query) die ‘new’ Daten … warum sollten die nicht da sein? Zur Not übergibst du diese Daten an eine weitere Funktion, die die Arbeit erledigt.