MySql & funzioni avanzate

Postate qui per tutte le discussioni legate a Linux in generale.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Gnu/Linux in genere, se l'argomento è specifico alla Slackware usate uno dei forum Slackware o Slackware64.
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
tgmx
Linux 4.x
Linux 4.x
Messaggi: 1336
Iscritto il: ven apr 28, 2006 14:40
Slackware: 14.1
Desktop: KDE 4
Località: Ancona

MySql & funzioni avanzate

Messaggioda tgmx » lun ott 05, 2009 10:58

Ciao Ragazzi,
in un database mysql con dati storici di alcuni anni messi in una tabella vorrei impedire ad alcuni utenti in particolare di modificare parte di questi dati, ad esempio dati più vecchi di un anno.

Tanto per spiegarmi meglio vorrei capire se esiste un "WHERE" lato server... :?

Ne sapete niente?

Avatar utente
Sustuso
Linux 1.x
Linux 1.x
Messaggi: 133
Iscritto il: mer giu 15, 2005 0:00

Re: MySql & funzioni avanzate

Messaggioda Sustuso » lun ott 05, 2009 12:03

non so se ho capito bene ma puoi fare un controllo quando cercando di fare un update sui dati, se sono dati più vecchi di una certa data e se l'utente è diciamo nella "blacklist" non esegui l'update (ma lo fai da codice)

Avatar utente
tgmx
Linux 4.x
Linux 4.x
Messaggi: 1336
Iscritto il: ven apr 28, 2006 14:40
Slackware: 14.1
Desktop: KDE 4
Località: Ancona

Re: MySql & funzioni avanzate

Messaggioda tgmx » lun ott 05, 2009 12:21

Sustuso ha scritto:non so se ho capito bene ma puoi fare un controllo quando cercando di fare un update sui dati, se sono dati più vecchi di una certa data e se l'utente è diciamo nella "blacklist" non esegui l'update (ma lo fai da codice)



Si le operazioni sul db vengono eseguite da codice ma vorrei aggiungere ai controlli "lato client" anche una sicurezza in più lato server.

Quello che hai scritto grosso modo è quello che dovrei fare. Hai qualche esempio o link che spieghi come fare?

Avatar utente
Sustuso
Linux 1.x
Linux 1.x
Messaggi: 133
Iscritto il: mer giu 15, 2005 0:00

Re: MySql & funzioni avanzate

Messaggioda Sustuso » lun ott 05, 2009 12:33

Penso che basti mettere un "if" nel codice per non far eseguire la query di update fai una cosa tipo if data>1annofa and idtipoutente != idtipoutentedabloccare esegui l'update altrimenti fai altro ma tutto questo nel codice, ma in cosa programmi?

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: MySql & funzioni avanzate

Messaggioda conraid » lun ott 05, 2009 12:35

tgmx ha scritto:Quello che hai scritto grosso modo è quello che dovrei fare. Hai qualche esempio o link che spieghi come fare?


Ma il codice lo scrivi tu, o qualcuno in particolare, oppure ognuno scrive il codice che vuole?
Nel primo caso non vedo il problema, WHERE lo metti nelle query in base all'utente, nel secondo caso la cosa non mi sembra possibile, ma aspetto smentite

Qui trovi maggiori informazioni
http://dev.mysql.com/doc/refman/5.0/en/grant.html

Avatar utente
tgmx
Linux 4.x
Linux 4.x
Messaggi: 1336
Iscritto il: ven apr 28, 2006 14:40
Slackware: 14.1
Desktop: KDE 4
Località: Ancona

Re: MySql & funzioni avanzate

Messaggioda tgmx » lun ott 05, 2009 12:51

Programmo in QT4/C++ e al momento il codice lo scrivo io...

Che si possa mettere un "if" nel codice lo so :) ma, come ho scritto sopra, volevo, se possibile, aggiungere un controllo di quel tipo "lato server".

Tra l'altro, utente e pwd del db possono essere noti e chiunque (ad esempio con access ) potrebbe collegarsi al db e apportare delle modifiche a dati storici che sarebbe meglio non toccasse.

In ogni caso, se non è possibile... pazienza! :(

Avatar utente
Sustuso
Linux 1.x
Linux 1.x
Messaggi: 133
Iscritto il: mer giu 15, 2005 0:00

Re: MySql & funzioni avanzate

Messaggioda Sustuso » lun ott 05, 2009 13:23

Potresti creare degli utenti differenti per mysql e vincolare i permessi (puoi fare in modo che non possano fare update o delete o altro).
Però poi devi cambiare la user e la pass di connessione da ogni pc credo... comunque non ho mai fatto una cosa del genere, spero ci sia qualcuno più esperto di me che possa aiutarti ;)

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: MySql & funzioni avanzate

Messaggioda conraid » lun ott 05, 2009 13:35

tgmx ha scritto:Programmo in QT4/C++ e al momento il codice lo scrivo io...

Che si possa mettere un "if" nel codice lo so :) ma, come ho scritto sopra, volevo, se possibile, aggiungere un controllo di quel tipo "lato server".

Tra l'altro, utente e pwd del db possono essere noti e chiunque (ad esempio con access ) potrebbe collegarsi al db e apportare delle modifiche a dati storici che sarebbe meglio non toccasse.

In ogni caso, se non è possibile... pazienza! :(


Cosa c'entra access?

Il codice è visibile da tutti tanto da scoprire la password?

Il database serve solo al programma?
Se sì non vedo il problema, impedisci ad altri utenti di accedere al database

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: MySql & funzioni avanzate

Messaggioda voulaz » lun ott 05, 2009 13:44

Mi vengono in mente due soluzioni.

La prima (ed è quella che più si avvicina alla tua richiesta) è quella di utilizzare un trigger associato alla tabella che devi proteggere. Il trigger (utilizzabile solo per versioni di MySQL >= 5.0) dovrebbe essere impostato per l'esecuzione 'BEFORE UPDATE' ed una volta verificato che i permessi di esecuzione (quelli che hai detto tu) NON sono soddisfatti imposta tutti i valori dell'oggetto NEW uguali a quelli di OLD (OLD e NEW sono i due oggetti predefiniti del trigger che si riferiscono rispettivamente al contenuto del record prima dell'UPDATE e dopo l'UPDATE). In questo modo l'UPDATE avrebbe luogo, ma lasciando i valori del record inalterati. Se preferisci puoi invece far generare un errore as DB, in modo tale che chi ha tentato l'operazione si accorga che non è andata a buon fine.

La seconda (se è possibile) è quella di spostare i dati storici su un'altra tabella accessibile solo a certi utenti.

Spero di esserti stato utile.

Avatar utente
tgmx
Linux 4.x
Linux 4.x
Messaggi: 1336
Iscritto il: ven apr 28, 2006 14:40
Slackware: 14.1
Desktop: KDE 4
Località: Ancona

Re: MySql & funzioni avanzate

Messaggioda tgmx » lun ott 05, 2009 15:45

voulaz ha scritto:Mi vengono in mente due soluzioni.

La prima (ed è quella che più si avvicina alla tua richiesta) è quella di utilizzare un trigger associato alla tabella che devi proteggere. Il trigger (utilizzabile solo per versioni di MySQL >= 5.0) dovrebbe essere impostato per l'esecuzione 'BEFORE UPDATE' ed una volta verificato che i permessi di esecuzione (quelli che hai detto tu) NON sono soddisfatti imposta tutti i valori dell'oggetto NEW uguali a quelli di OLD (OLD e NEW sono i due oggetti predefiniti del trigger che si riferiscono rispettivamente al contenuto del record prima dell'UPDATE e dopo l'UPDATE). In questo modo l'UPDATE avrebbe luogo, ma lasciando i valori del record inalterati. Se preferisci puoi invece far generare un errore as DB, in modo tale che chi ha tentato l'operazione si accorga che non è andata a buon fine.

La seconda (se è possibile) è quella di spostare i dati storici su un'altra tabella accessibile solo a certi utenti.

Spero di esserti stato utile.


E' esattamente quello che cercavo, grazie! :)
A me in particolare andrebbero bene entrambe le soluzioni. Per la prima mi hai dato qualche "parola chiave" (trigger, before update...) quindi ora so cosa cercare ma per la seconda (quella di generare un errore) come mi muovo?

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: MySql & funzioni avanzate

Messaggioda voulaz » lun ott 05, 2009 16:12

tgmx ha scritto:E' esattamente quello che cercavo, grazie! :)
A me in particolare andrebbero bene entrambe le soluzioni. Per la prima mi hai dato qualche "parola chiave" (trigger, before update...) quindi ora so cosa cercare ma per la seconda (quella di generare un errore) come mi muovo?


Purtroppo non sono in grado di aiutarti con del codice MySQL, ma per analogia a quanto farei in Oracle, vedo due possibilità:
non so se in MySQL sia implementata la funzione RAISE ExceptionXYZ che ti permette di generare un'eccezione a tua scelta, se c'è questa possibilità basta che nel TRIGGER sollevi l'eccezione quando l'operazione non è ammessa.
Se non esistesse l'istruzione RAISE, puoi procedere nel seguente modo: al posto di copiare tutti gli campi da OLD a NEW limitati ad impostare i campi "Chiave primaria" di NEW a NULL. In questo modo, quando verrà eseguito l'update, sarà generato un errore in quanto non è possibile inserire un record con chiave primaria a NULL. Purtroppo in questo secindo modo non sarai in grado di distinguere i veri casi di tentato inserimento con campi chave a NULL da quelli generati da TRIGGER, ma non credo che questo tipo di errore sia frequente. ;-)

Avatar utente
tgmx
Linux 4.x
Linux 4.x
Messaggi: 1336
Iscritto il: ven apr 28, 2006 14:40
Slackware: 14.1
Desktop: KDE 4
Località: Ancona

Re: MySql & funzioni avanzate

Messaggioda tgmx » lun ott 05, 2009 16:20

voulaz ha scritto:Purtroppo non sono in grado di aiutarti con del codice MySQL, ma per analogia a quanto farei in Oracle, vedo due possibilità:
non so se in MySQL sia implementata la funzione RAISE ExceptionXYZ che ti permette di generare un'eccezione a tua scelta, se c'è questa possibilità basta che nel TRIGGER sollevi l'eccezione quando l'operazione non è ammessa.
Se non esistesse l'istruzione RAISE, puoi procedere nel seguente modo: al posto di copiare tutti gli campi da OLD a NEW limitati ad impostare i campi "Chiave primaria" di NEW a NULL. In questo modo, quando verrà eseguito l'update, sarà generato un errore in quanto non è possibile inserire un record con chiave primaria a NULL. Purtroppo in questo secindo modo non sarai in grado di distinguere i veri casi di tentato inserimento con campi chave a NULL da quelli generati da TRIGGER, ma non credo che questo tipo di errore sia frequente. ;-)


Perfetto, grazie mille. Se non altro ora so che esistono i trigger. :D

Mi metto a studiare... :)

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: MySql & funzioni avanzate

Messaggioda voulaz » lun ott 05, 2009 16:33

tgmx ha scritto:
Perfetto, grazie mille. Se non altro ora so che esistono i trigger. :D

Mi metto a studiare... :)


Se ti può essere utile, ho trovato questo link: http://database.html.it/articoli/leggi/1973/trigger-in-mysql-5/
Può essere un buon punto di partenza per lo studio dei trigger! :)

Avatar utente
tgmx
Linux 4.x
Linux 4.x
Messaggi: 1336
Iscritto il: ven apr 28, 2006 14:40
Slackware: 14.1
Desktop: KDE 4
Località: Ancona

Re: MySql & funzioni avanzate

Messaggioda tgmx » lun ott 05, 2009 16:41

voulaz ha scritto:
Se ti può essere utile, ho trovato questo link: http://database.html.it/articoli/leggi/1973/trigger-in-mysql-5/
Può essere un buon punto di partenza per lo studio dei trigger! :)


Ottimo link, stavo già studiando su:
http://dev.mysql.com/doc/refman/5.0/en/ ... igger.html

Questi trigger non sembrano nenche troppo complicati...

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: MySql & funzioni avanzate

Messaggioda voulaz » lun ott 05, 2009 16:50

tgmx ha scritto:Questi trigger non sembrano nenche troppo complicati...


Ed in effetti non lo sono... vanno solo usati con giudizio, senza esagerare e tenendo traccia di tutti quelli creati.

Immagina una situazione del genere:
trigger sulla tabella A che scrive nella tabella B
trigger sulla tabella B che scrive nella tabella C
trigger sulla tabella C che scrive nella tabella A

Prova ad immaginare cosa succede quando fai un update su una delle tre tabelle !!! :D