azioni temporizzate in un DBMS

Area di discussione libera.

Moderatore: Staff

Regole del forum
1) Rispettare le idee altrui.
2) Evitare le offese dirette.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Avatar utente
Paoletta
Staff
Staff
Messaggi: 3971
Iscritto il: lun apr 25, 2005 0:00
Slackware: 14.2 - 64 bit
Desktop: fluxbox
Località: Varese

azioni temporizzate in un DBMS

Messaggioda Paoletta » gio mar 25, 2010 13:42

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

Avatar utente
conraid
Staff
Staff
Messaggi: 13221
Iscritto il: gio lug 14, 2005 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Località: Livorno
Contatta:

Re: azioni temporizzate in un DBMS

Messaggioda conraid » gio mar 25, 2010 13:57

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 :-)

Avatar utente
voulaz
Linux 0.x
Linux 0.x
Messaggi: 39
Iscritto il: lun ott 09, 2006 14:53
Slackware: 12.0
Desktop: KDE
Località: Milano

Re: azioni temporizzate in un DBMS

Messaggioda voulaz » gio mar 25, 2010 14:01

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.

Avatar utente
Paoletta
Staff
Staff
Messaggi: 3971
Iscritto il: lun apr 25, 2005 0:00
Slackware: 14.2 - 64 bit
Desktop: fluxbox
Località: Varese

Re: azioni temporizzate in un DBMS

Messaggioda Paoletta » gio mar 25, 2010 14:11

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...

Avatar utente
conraid
Staff
Staff
Messaggi: 13221
Iscritto il: gio lug 14, 2005 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Località: Livorno
Contatta:

Re: azioni temporizzate in un DBMS

Messaggioda conraid » gio mar 25, 2010 14:18

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

Avatar utente
aschenaz
Staff
Staff
Messaggi: 4586
Iscritto il: mer lug 28, 2004 0:00
Nome Cognome: Nino
Slackware: current
Kernel: 4.14.x
Desktop: KDE
Località: Reggio Calabria
Contatta:

Re: azioni temporizzate in un DBMS

Messaggioda aschenaz » gio mar 25, 2010 14:54

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... :)

Avatar utente
Paoletta
Staff
Staff
Messaggi: 3971
Iscritto il: lun apr 25, 2005 0:00
Slackware: 14.2 - 64 bit
Desktop: fluxbox
Località: Varese

Re: azioni temporizzate in un DBMS

Messaggioda Paoletta » gio mar 25, 2010 16:38

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...)

Avatar utente
DanBadJar
Linux 4.x
Linux 4.x
Messaggi: 1027
Iscritto il: ven lug 28, 2006 19:27
Nome Cognome: Daniele Malavasi
Slackware: 13.1
Kernel: 2.6.34.1
Desktop: XFCE - Gnome
Località: Bologna
Contatta:

Re: azioni temporizzate in un DBMS

Messaggioda DanBadJar » gio mar 25, 2010 16:42

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.

Avatar utente
Paoletta
Staff
Staff
Messaggi: 3971
Iscritto il: lun apr 25, 2005 0:00
Slackware: 14.2 - 64 bit
Desktop: fluxbox
Località: Varese

Re: azioni temporizzate in un DBMS

Messaggioda Paoletta » gio mar 25, 2010 16:58

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;

Avatar utente
conraid
Staff
Staff
Messaggi: 13221
Iscritto il: gio lug 14, 2005 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Località: Livorno
Contatta:

Re: azioni temporizzate in un DBMS

Messaggioda conraid » gio mar 25, 2010 17:09

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

Avatar utente
aschenaz
Staff
Staff
Messaggi: 4586
Iscritto il: mer lug 28, 2004 0:00
Nome Cognome: Nino
Slackware: current
Kernel: 4.14.x
Desktop: KDE
Località: Reggio Calabria
Contatta:

Re: azioni temporizzate in un DBMS

Messaggioda aschenaz » gio mar 25, 2010 19:28

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...

Avatar utente
conraid
Staff
Staff
Messaggi: 13221
Iscritto il: gio lug 14, 2005 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Località: Livorno
Contatta:

Re: azioni temporizzate in un DBMS

Messaggioda conraid » gio mar 25, 2010 21:04

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"

Avatar utente
aschenaz
Staff
Staff
Messaggi: 4586
Iscritto il: mer lug 28, 2004 0:00
Nome Cognome: Nino
Slackware: current
Kernel: 4.14.x
Desktop: KDE
Località: Reggio Calabria
Contatta:

Re: azioni temporizzate in un DBMS

Messaggioda aschenaz » gio mar 25, 2010 21:30

Ma certo, l'index era solo un esempio...

Avatar utente
DanBadJar
Linux 4.x
Linux 4.x
Messaggi: 1027
Iscritto il: ven lug 28, 2006 19:27
Nome Cognome: Daniele Malavasi
Slackware: 13.1
Kernel: 2.6.34.1
Desktop: XFCE - Gnome
Località: Bologna
Contatta:

Re: azioni temporizzate in un DBMS

Messaggioda DanBadJar » ven mar 26, 2010 9:52

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.

Avatar utente
Paoletta
Staff
Staff
Messaggi: 3971
Iscritto il: lun apr 25, 2005 0:00
Slackware: 14.2 - 64 bit
Desktop: fluxbox
Località: Varese

Re: azioni temporizzate in un DBMS

Messaggioda Paoletta » ven mar 26, 2010 10:42

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