# Datensatz / Tupel automatisch nach xy Tagen / Stunden löschen



## Java.getSkill() (3. Feb 2010)

Hallo,

Ich frage mich gerade wie ich einen Datensatz, also einen Eintrag in einer Tabelle, nach XY Tagen oder Stunden automatisch löschen kann.

Als Beispiel nehme ich eine Bibliothek, wo ich mir Bücher zum Ausleihen vorreservieren kann. Nach der Reservierung habe ich 3h Zeit um das Buch abzuholen, sonst wird meine Reservierung gelöscht und Buch wieder ins System als ausleihbar gestellt.

Ich reserviere es um 13:00 und hätte nun bis 16:00 Zeit es abzuholen. Um 16:01 soll es gelöscht werden, doch wie? Trigger, Stored Procedure, Java??

Ich suche nach einer Lösung ohne Rootrechte oder irgendwelche anderen grösseren Spielereien.


----------



## ice-breaker (3. Feb 2010)

Datenbank und Version?


----------



## Java.getSkill() (3. Feb 2010)

mysql aktuellste oder DB2 v9

wenn jemand sourcecode hätte, wäre das natürlich sehr nice 

simple Sachen mit PL/SQL und java/jsp kann ich auch. Der Trick an der ganzen Sache ist eben, dass sich diese eine "Funktion" welche die Uhrzeiten vergleicht selber aufrufen muss. Einfach einen Knopf hinbauen, der einen Trigger oder Stored Procedure startet und gemütlich alle Tupel in der Tabelle durchschaut könnte ich mir wohl ohne grössere Probleme machen.


----------



## ice-breaker (3. Feb 2010)

Es gibt keine Trigger für Selects, von daher müsste man da etwas mehr Aufwand in Kauf nehmen:
1. StoredProcedure die alte Daten löscht und den regelmäßig aufruft (MySQL hat in 5.1 intern nen Cron-Manager)
2. Beim Auslesen aus der Datenbank prüfen, ob der Datensatzz veraltet ist, aber noch nicht gelöscht wurde, dann ihn löschen und weiterbehandeln als wenn er von Anfang nicht existent war.


----------



## Java.getSkill() (3. Feb 2010)

```
create table zeitStunden(
id int not null,
von_zeit time not null,
bis_zeit time
)

insert into zeitStunden (id, von_zeit)values(2,current time - 3 HOURS)

select * from zeitStunden

delete from zeitStunden where von_zeit < current time
```
für die Nachwelt: DB2 Basics: Fun with Dates and Times

Bin selber noch am suchen: Wie starte ich auf einem Linux/mysql/DB2 Server, wo ich mich mit ftp oder ssh verbinden kann, also 0 weitere Rechte außer webspace für meine Daten, einen Cronjob, welcher eben jetzt alle 30 Minuten eine Tabelle mit SQL Statements durchpflügen kann

crontab -e kann ich schon mal aufrufen

Rufe ich da ein Stored Procedure auf? wenn ja wie? sind ja in der DB gespeichert?

oder rufe ich eine SQL FILE, welche sich mit user und pw connectet und dann eben die SQL Statements durchführt?

need einfach nur etwas code, kann auch ein simples insert sein, am besten mit einer schleife


----------



## Gast2 (3. Feb 2010)

Java.getSkill() hat gesagt.:


> crontab -e kann ich schon mal aufrufen
> 
> Rufe ich da ein Stored Procedure auf? wenn ja wie? sind ja in der DB gespeichert?
> 
> ...



Du müsstest schon deine StoredProcedure über einen SQL Befehl auslösen. Du kannst aber auch einfach dir ein kleines Javaprogramm anlegen das die StoredProcedure anstößt - allerdings kann das dann auch gleich den SQL für löschen alter Daten absetzten was die StoredProcedure unnötig macht 


```
String query = "CALL PURGE_JOB()";
```

Selbiges gilt für ein SQL File per shellskript laden.

Also wenn du einen cronjob einrichten darfst - lass alle drei stunden den SQL zum Löschen alter Daten von einem Programm oder Skript deiner Wahl abschießen.

In ORACLE gäbe es intern Möglichkeiten mit Hintergrundjobs ( DBMS_SCHEDULER), evlt gibt es da ja auch für DB2.


----------



## kama (4. Feb 2010)

Hallo,

ich würde auf keinen Fall eine solche Logik in die Datenbank packen. Dafür ist die Applikation zuständig...Ich würde eine Applikation haben die so etwas löst...Das kann man z.B. Quartz Scheduler - Home sehr schön lösen...
Ich gehe davon aus, dass sowieso eine Applikation läuft....
Das ganze ist dann auch unabhängig von der Datenbank....

MfG
Karl Heinz Marbaise


----------



## tme (4. Feb 2010)

Also ich frage mich ja, warum es notwendig ist, überhaupt eine zeitgesteuerte Ausführung für die Löschung zu haben. Will jemand Anderes das Buch ausleihen, läßt sich doch herausfinden, ob man es herausgeben darf:


```
Calendar cal = new GregorianCalendar();
cal.subtract(3, Calendar.HOUR);
strQuery = "SELECT * FROM Reservierungen WHERE created > '" + FormatSQLDate(cal) + "';";
```

Frei nach Schnauze und nicht geprüft, die Logik ist aber IMHO korrekt.

Falls die Datensätze trotzdem in jedem Falle dort raus sollen, und das ist bei indizierten Zugriffen nicht unbedingt nötig, könnte ein von dieser Logik separater Löschprozeß diese Aufgabe übernehmen.


----------

