Pagina 1 di 2

azioni temporizzate in un DBMS

Inviato: gio 25 mar 2010, 13:42
da Paoletta
ciao a tutti,
avrei bisogno di cancellare dei record da un database dopo un certo numero di giorni dall'inserimento; a questo scopo pensavo di definire un trigger ma ho visto che permettono l'esecuzione delle azioni solo o prima o dopo l'inserimento di un record (e non dopo qualche giorno dall'inserimento...)...esiste un modo per risolvere il problema?

grazie 1000!

Paola

Re: azioni temporizzate in un DBMS

Inviato: gio 25 mar 2010, 13:57
da conraid
Lo devi fare solo lato DB o puoi farlo tramite codice? Nel senso è il sistema web da mettere in hosting?

Io solitamente imposto queste cose nel programma, anche se purtroppo è legato ad una azione, che può essere anche un accesso alla pagina.
A meno che il provider non ti dia accesso al cron, imposti un qualche controllo nelle pagine php che una volta al giorno (altro campo del db o un file di testo dove tieni il conto) cancella i record vecchi.
a dire il vero solitamente io li sposto in un'altra tabella per un po', non si sa mai :-)

Re: azioni temporizzate in un DBMS

Inviato: gio 25 mar 2010, 14:01
da voulaz
Dipende dal DB che usi.
In Oracle puoi creare un "Job" che può lanciare comandi o procedure secondo la cronologia impostata (come logica somiglia molto al cron di linux).
Per gli altri DB non ho esperienza, ma puoi cercare se esiste qualcosa di simile.

Spero di esserti stato utile.
Ciao.

PS.
In MySQL 5.1 si chiamano EVENT.

Re: azioni temporizzate in un DBMS

Inviato: gio 25 mar 2010, 14:11
da Paoletta
conraid ha scritto:Lo devi fare solo lato DB o puoi farlo tramite codice? Nel senso è il sistema web da mettere in hosting?
posso anche metterlo nel codice PHP...il problema è: come innesco l'azione?
conraid ha scritto: a dire il vero solitamente io li sposto in un'altra tabella per un po', non si sa mai :-)
finito questo "per un po'", io li devo cancellare...

Re: azioni temporizzate in un DBMS

Inviato: gio 25 mar 2010, 14:18
da conraid
Paoletta ha scritto:
conraid ha scritto:Lo devi fare solo lato DB o puoi farlo tramite codice? Nel senso è il sistema web da mettere in hosting?
posso anche metterlo nel codice PHP...il problema è: come innesco l'azione?
la inneschi sempre ad ogni accesso
se tu metti il comando in una pagina php inclusa sempre, basta che qualcuno visiti il sito e l'azione è innescata.
se hai paura di non avere visitatori metti qualche comando con curl in qualche server :-)

per esempio io per aggiornare slackers.it con i cambiamenti del changelog ho una pagina php che mi crea il tutto, ma per essere sicuro che viene lanciata ogni ora la richiamo con curl
Certo, se hai un cron e puoi usare i comandi del database direttamente li, fai prima e meglio, ma non sempre è possibile. A me per esempio il provider permette di inserire alcuni comandi nel cron, ma non i comandi mysql

Re: azioni temporizzate in un DBMS

Inviato: gio 25 mar 2010, 14:54
da aschenaz
Io tempo fa ho avuto bisogno di un'azione del genere.

Nella index ho messo questa porzione di script:

Codice: Seleziona tutto

$intervallogiorni=8; // numero giorni che devono essere trascorsi
$res=mysql_query("SELECT ID,Data FROM nometabella");
while($row=mysql_fetch_row($res)) {
   $id=$row[0];
   $startdate=$row[1];
   list($anno,$mese,$giorno)=explode("-",$startdate);
   $annocorrente=date("Y");
   $mesecorrente=date("m");
   $giornocorrente=date("d");
   if(mktime(0,0,0,$mese,$giorno+$intervallogiorni,$anno) < mktime(0,0,0,$mesecorrente,$giornocorrente,$annocorrente)) mysql_query("DELETE FROM nometabella WHERE ID='$id');
}
Volendo si può anche semplificare... :)

Re: azioni temporizzate in un DBMS

Inviato: gio 25 mar 2010, 16:38
da Paoletta
aschenaz ha scritto:Io tempo fa ho avuto bisogno di un'azione del genere.

Nella index ho messo questa porzione di script:

Codice: Seleziona tutto

$intervallogiorni=8; // numero giorni che devono essere trascorsi
$res=mysql_query("SELECT ID,Data FROM nometabella");
while($row=mysql_fetch_row($res)) {
   $id=$row[0];
   $startdate=$row[1];
   list($anno,$mese,$giorno)=explode("-",$startdate);
   $annocorrente=date("Y");
   $mesecorrente=date("m");
   $giornocorrente=date("d");
   if(mktime(0,0,0,$mese,$giorno+$intervallogiorni,$anno) < mktime(0,0,0,$mesecorrente,$giornocorrente,$annocorrente)) mysql_query("DELETE FROM nometabella WHERE ID='$id');
}
Volendo si può anche semplificare... :)
azchenaz, sei sicuro che il tuo codice sia corretto? Una somma di questo tipo:

Codice: Seleziona tutto

$giorno+$intervallogiorni
potrebbe portare a date invalide (tipo il 38 di agosto...)

Re: azioni temporizzate in un DBMS

Inviato: gio 25 mar 2010, 16:42
da DanBadJar
aschenaz ha scritto:Io tempo fa ho avuto bisogno di un'azione del genere.

Nella index ho messo questa porzione di script:

Codice: Seleziona tutto

$intervallogiorni=8; // numero giorni che devono essere trascorsi
$res=mysql_query("SELECT ID,Data FROM nometabella");
while($row=mysql_fetch_row($res)) {
   $id=$row[0];
   $startdate=$row[1];
   list($anno,$mese,$giorno)=explode("-",$startdate);
   $annocorrente=date("Y");
   $mesecorrente=date("m");
   $giornocorrente=date("d");
   if(mktime(0,0,0,$mese,$giorno+$intervallogiorni,$anno) < mktime(0,0,0,$mesecorrente,$giornocorrente,$annocorrente)) mysql_query("DELETE FROM nometabella WHERE ID='$id');
}
Volendo si può anche semplificare... :)
Si, ma in questo caso la index deve essere eseguita. Se nessuno visita la index non viene svolta nessuna azione sul DBMS.

IMHO La miglior cosa è avere accesso al crontab, della macchina (o ad un altro eventuale schedulatore) e crearsi appositi script che eseguono i compiti necessari.
Chi di voi lavora o ha lavorato su grossi DB in esercizio sa che il metodo che ho suggerito è una pratica molto comune.
Inutile dire che con i provider "standard" la cosa non è affatto possibile, a meno che non si disponga di un proprio server in housing.

Re: azioni temporizzate in un DBMS

Inviato: gio 25 mar 2010, 16:58
da Paoletta
DanBadJar ha scritto: Si, ma in questo caso la index deve essere eseguita. Se nessuno visita la index non viene svolta nessuna azione sul DBMS.
È anche vero che se nessuno visita la index vuol dire che nessuno ordina oggetti e che quindi non si sente il bisogno di eliminarli;

Re: azioni temporizzate in un DBMS

Inviato: gio 25 mar 2010, 17:09
da conraid
può arrivare al sito in altra pagina, mettilo in un header, in qualcosa che carichi sempre tipo il file dove imposti la connessione
non conosco postgresql, non so come salva i campi dati, ma mi baserei su quelli, al limite converti in timestamp

Re: azioni temporizzate in un DBMS

Inviato: gio 25 mar 2010, 19:28
da aschenaz
Paoletta ha scritto:...
azchenaz, sei sicuro che il tuo codice sia corretto? Una somma di questo tipo:

Codice: Seleziona tutto

$giorno+$intervallogiorni
potrebbe portare a date invalide (tipo il 38 di agosto...)
No, ci pensa mktime (la somma, in effetti non viene fatta sul giorno ma sul timestamp).
Prova e vedrai che funziona... :)

Poi, per quanto riguarda la necessità di visitare l'index..., beh, penso che
a te serve che i record "scaduti" non vengano visualizzati quando si visita
il sito, no? E quindi, se non si visita, i record rimangono, ma nessuno li vede;
se si visita, lo script elimina i record e hai raggiunto il tuo scopo.
Tutto questo sempre se stiamo parlando di un sito...

Re: azioni temporizzate in un DBMS

Inviato: gio 25 mar 2010, 21:04
da conraid
aschenaz ha scritto: Poi, per quanto riguarda la necessità di visitare l'index..., beh, penso che
a te serve che i record "scaduti" non vengano visualizzati quando si visita
il sito, no?
non per ripetere le solite cose nino, ma non tutti usano solo una index che richiama tutte le pagine, io per esempio no, e così altri software free ecommerce o cms
se io per esempio arrivo ad una pagina da google, posso andare su pippo.url/prodotto.php?id=123 e metterlo nel carrello senza passare dalla index, era questo che intendevo
se invece metti il codice dove hai l'accesso al db sai che viene chiamato "sempre"

Re: azioni temporizzate in un DBMS

Inviato: gio 25 mar 2010, 21:30
da aschenaz
Ma certo, l'index era solo un esempio...

Re: azioni temporizzate in un DBMS

Inviato: ven 26 mar 2010, 9:52
da DanBadJar
Paoletta ha scritto:
DanBadJar ha scritto: Si, ma in questo caso la index deve essere eseguita. Se nessuno visita la index non viene svolta nessuna azione sul DBMS.
È anche vero che se nessuno visita la index vuol dire che nessuno ordina oggetti e che quindi non si sente il bisogno di eliminarli;
Se nessuno ordina oggetti (perchè come dici tu non visita la index) non significa che non siano mai stati ordinati, quindi secondo me il bisogno di eliminarli rimane.

Re: azioni temporizzate in un DBMS

Inviato: ven 26 mar 2010, 10:42
da Paoletta
DanBadJar ha scritto: Se nessuno ordina oggetti (perchè come dici tu non visita la index) non significa che non siano mai stati ordinati, quindi secondo me il bisogno di eliminarli rimane.
Se sono stati ordinati almeno una persona fa l'accesso al sito: l'amministratore, per togliere gli ordini; per cui il problema in questo caso è risolto