Trigger nacheinander starten

Hy,

also ich schieß mal drauf los.

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

  1. Möchte alle Daten vom Vor Vortag löschen (die haben die Zeile alt vom Typ Boolean True und new.name=name)
  2. 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?


gruß BoOnOdY

Trigger werden alphabetisch sortiert ausgeführt. Nenne sie also z.B. trigger_01, trigger_02, … um sie in dieser Reihenfolge abarbeiten zu lassen.

Aber warum die Mimik mit dem Flag setzen? Du hast doch bestimmt einen Timestamp bei den Daten, und was älter als N Tage ist ist somit berechenbar.

Andreas

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.

Okay das ist schon mal hilfreich.

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?



Vielen Dank und Gruß

BoOnOdY

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.

ja funktion sowieso aber ich würd die funktion halt gerne mit nem trigger anstoßen.

Ist dieser “Statement” trigger einer, der nur einmal pro speichern (commit) läuft oder ?

Im Notfall muss ich das irgendwie in das Script einbauen, das den Import übernimmt.

Aber tausend Dank schon mal =)

Gruß BoOnOdY

Da verweise ich doch mal knallhart auf die Doku.