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