OpenOffice.org 2.0 e i Database Introduzione all'uso dei Database con OpenOffice.org 2.0 Versione 0.99 – Dicembre 2005 OpenOffice.org 2.0 & i Database - © 2005 Filippo Cerulo – Soft.Com Sas www.softcombn.com - email: [email protected] OpenOffice, MySql e PostgreSQL sono Marchi Registrati dai rispettivi proprietari. Quest'opera è rilasciata sotto la licenza Creative Commons “Attribuzione - Non commerciale - Non opere derivate 2.0 Italia.” Per visionare una copia di questa licenza visita il sito web http://creativecommons.org/licenses/by-nc-nd/2.0/it/ o richiedila per posta a Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, Usa. Tu sei libero: • di riprodurre, distribuire, comunicare al pubblico, esporre in pubblico, rappresentare, eseguire o recitare l'opera Alle seguenti condizioni: Attribuzione. Devi riconoscere il contributo dell'autore originario. Non commerciale. Non puoi usare quest’opera per scopi commerciali. Non opere derivate. Non puoi alterare, trasformare o sviluppare quest’opera. • In occasione di ogni atto di riutilizzazione o distribuzione, devi chiarire agli altri i termini della licenza di quest’opera. • Se ottieni il permesso dal titolare del diritto d'autore, è possibile rinunciare ad ognuna di queste condizioni. Le tue utilizzazioni libere e gli altri diritti non sono in nessun modo limitati da quanto sopra 2 © 2005 Filippo Cerulo - Soft.Com Sas – Documento con Licenza Creative Commons - Rev 0.99 OpenOffice.org 2.0 & i Database - Database Server MySql 5. Database Server MySql MySql (www.mysql.com) è probabilmente il più usato Database Server Open Source disponibile. La sua caratteristica principale è sempre stata la velocità di risposta, ed in nome dell'efficienza gli sviluppatori hanno probabilmente trascurato alcuni aspetti che dovrebbero essere presenti in un prodotto che aspira a fare concorrenza a nomi blasonati come Microsoft Sql Server o Oracle. La versione stabile attualmente disponibile è la 5.0.XX che introduce alcune novità largamente richieste dall'utenza, come le stored procedure ed i trigger. Mancheranno però ancora delle caratteristiche che molti ritengono essenziali, ma che gli sviluppatori di MySql valutano non compatibili con un prodotto snello ed efficiente. Nei paragrafi che seguono ci occuperemo di alcuni aspetti interessanti del Db, utili anche in contesti non strettamente collegati ad OpenOffice. 5.1 Installazione Windows 5.1.1 Il Server Avere in pochi minuti MySql attivo e funzionante in Windows è molto semplice. I file da scaricare dal sito www.mysql.com sono: mysql-essential-5.0.XX-win32 il server, per circa 17 Mb – la versione essential è più che sufficiente ai nostri scopi myODBC-3.51.XX-win Driver ODBC, per circa 4 Mb (versione attuale 3.51.11) mysql-connector-java-3.1.XX Driver JDBC in formato Zip per circa 8 Mb, se si desidera connettersi al Db con Java mysql-administrator-1.1.X-win MySql Administrator, per circa 5 Mb, un tool che permette la creazione e la manutenzione dei Database e del Server MySql (versione attuale 1.1.4) mysql-query-browser-1.1.XX-win MySql Query browser, per circa 5 Mb, permette la modifica dei Dati di Database Sql ed il test delle Query In realtà il Query Browser non è strettamente necessario, perché la modifica dei dati avviene di solito con programmi client (nel nostro caso OOo), ma torna utile in molti casi. Assolutamente indispensabile è invece Administrator, a meno che non vogliate impazzire con le utility a riga di comando. Tutte le operazioni di installazione vanno fatte da un utente con privilegi di amministratore. Il primo file (il Server) è un installer windows che è necessario lanciare nel modo tradizionale. Si avvia un Wizard e, tra le prime opzioni di installazione, la configurazione “typical” può andar bene nella maggior parte dei casi. La schermata successiva chiede di creare un account di registrazione su MySql.com ma si può evitare scegliendo “skip 41 © 2005 Filippo Cerulo - Soft.Com Sas – Documento con Licenza Creative Commons - Rev 0.99 OpenOffice.org 2.0 & i Database - Database Server MySql sign-up”. Alla fine il programma chiede se si desidera configurare il server appena installato, e questa è senz'altro una buona idea. Figura 5.1.1: Configurazione dell'istanza di MySql Server La prima scelta riguarda il tipo di configurazione (standard o dettagliata): si può selezionare dettagliata, anche per farsi un'idea delle varie opzioni disponibili. Poi si passa al tipo di utilizzo che intendiamo fare di MySql (vedi figura). Di solito va bene anche “Developer Machine”. Il passo successivo riguarda i “motori” interni da selezionare per l'archiviazione dei dati. In questo caso è opportuno selezionare “Multifunctional Database” in modo da disporre sia di MyIsam che di InnoDb (del cui utilizzo parleremo in seguito). Poi dobbiamo scegliere il tipo di server in funzione delle connessioni simultanee: se non ci sono esigenze particolari, va bene “DSS” che è la prima opzione (vedi figura). Figura 5.1.2: Numero di client previsti per MySql 42 © 2005 Filippo Cerulo - Soft.Com Sas – Documento con Licenza Creative Commons - Rev 0.99 OpenOffice.org 2.0 & i Database - Database Server MySql Quindi si passa alla configurazione di Rete. Se intendiamo usare il Server sulla rete (come di solito accade) dobbiamo abilitare il TCP/IP e selezionare la porta di ascolto (3306 è quella standard). Dopo aver confermato il Set di Caratteri (quello proposto va bene), si sceglie di avviare il Server come servizio e (se volete usare le utility a linea di comando) di includere la cartella Bin nel path di Windows. Quindi è necessario impostare la password per l'Amministratore (che in MySql, come in Linux, si chiama root), scegliere se root può collegarsi anche dalle macchine in rete (dipende da voi, di solito si preferisce che root possa eseguire il logon solo sulla macchina che ospita il server), e se abilitare l'accesso anonimo (vivamente sconsigliato). Figura 5.1.3: Impostazione della sicurezza in MySql A questo punto la configurazione termina, e siete pronti ad usare il Server. Tecnica MySql può essere installato in Windows 2000 e XP come “servizio” ad esecuzione automatica. Se abbiamo scelto invece la partenza “manuale”, per avviare il Server basta richiamare il pannello di controllo e nella sezione “strumenti di amministrazione”, e scegliere la voce “servizi”. Avremo una lista dei servizi installati sul PC, quindi click col tasto destro sul servizio MySql e dal Menu contestuale selezionare la voce “Avvia”. Viceversa, se desideriamo che MySql non si avvii più in automatico, doppio click sul servizio MySql e selezionare nella casella a discesa “Tipo di Avvio” la voce “Manuale”. Il resto dei programmi citati può anche non essere installato sulla macchina che ospita il server in quanto si tratta essenzialmente di strumenti client. Questo significa che possono (ed a volte devono) essere caricati sui PC che si occuperanno della manutenzione del Server e delle Basi di Dati, e che eseguiranno l'accesso ai Dati stessi. 43 © 2005 Filippo Cerulo - Soft.Com Sas – Documento con Licenza Creative Commons - Rev 0.99 OpenOffice.org 2.0 & i Database - Database Server MySql TIP La configurazione del Server può essere modificata in qualsiasi momento con la voce Start -> Programmi -> MySQL -> MySQL Server 5.0 -> MySQL Server Instance Config Wizard 5.1.2 Il Driver MyODBC Il file, l'abbiamo detto è myODBC-3.51.XX.msi (dove XX sta per il numero di versione corrente). Basta eseguire l'installazione ed avremo il nostro driver pronto all'uso. Per verificare che tutto sia andato bene, aprendo il Pannello di Controllo -> Strumenti di Amministrazione -> Origine dati (ODBC) -> Driver dovrebbe apparire : Figura 5.1.4 : Driver ODBC 5.1.3 Configurazione del DSN Bisogna scegliere, innanzi tutto, se si desidera creare un DSN Utente (quindi valido solo per l'utente corrente) oppure di sistema (per tutti gli utenti). Quindi si preme il pulsante Aggiungi, si seleziona il driver MySql e quindi il pulsante Fine. A questo punto è possibile configurare la connessione, come in figura. 44 © 2005 Filippo Cerulo - Soft.Com Sas – Documento con Licenza Creative Commons - Rev 0.99 OpenOffice.org 2.0 & i Database - Database Server MySql Figura 5.1.5: Configurazione del DSN per MySql Si deve assegnare un nome al DSN, indicare l'indirizzo IP oppure il nome del Server, immettere le credenziali (nome utente e password) e, volendo, indicare un Database per la gestione. Se la connessione avviene sulla macchina che ospita il server, si può indicare localhost al posto dell'indirizzo IP. Il pulsante Test permette di provare la connessione. Nelle Tab Options ed Advanced è possibile impostare alcuni altri parametri, ma di solito non è necessario modificare quelli di default. Se volete approfondire, fate riferimento alla documentazione di MySQL. 5.1.4 Driver JDBC E' necessario scaricare, dal sito di MySql, il file mysql-connector-java-3.1.11.zip. Una volta scompattato, copiare il file mysql-connector-java-3.1.11-bin.jar in una cartella a piacere (io uso c:\programmi\JDBC\). 5.1.5 I programmi Client Per la gestione del Server e delle Basi di Dati abbiamo già detto che sono disponibili due programmi: Administrator e Query Browser. L'installazione non comporta alcuna difficoltà e le rispettive voci compariranno nel Menu dei Programmi. Administrator installa anche una piccola utility che si chiama System Tray Monitor che serve anche ad avviare ed arrestare il Servizio, e che può tornare utile. 45 © 2005 Filippo Cerulo - Soft.Com Sas – Documento con Licenza Creative Commons - Rev 0.99 OpenOffice.org 2.0 & i Database - Database Server MySql 5.2 Installazione Linux 5.2.1 Il Server Quasi tutte le moderne distribuzioni prevedono la possibilità di installare MySQL nelle sue varie versioni. Utilizzando i tool presenti nelle distribuzioni è dunque semplice avere immediatamente il server funzionante. Se proprio desiderate l'ultima versione, è disponibile anche in formato RPM sul sito di MySql.com (attenzione alle dipendenze!). In questo caso, la procedura di installazione e configurazione è ben spiegata nella documentazione ufficiale, quindi non mi dilungherò oltre. TIP Di solito le versioni Linux, appena installate, hanno una gestione della sicurezza particolarmente debole. Infatti la password dell'amministratore di MySql è vuota, anche se è possibile collegarsi al Database solo dalla macchina che lo ospita (localhost). La prima cosa da fare è dunque configurare la sicurezza. 5.2.2 Il Driver MyODBC In molte distribuzioni il Driver è già incluso nell'elenco dei pacchetti, ma vi consiglio di scaricare l'ultima versione in formato RPM da MySql.com, nel nostro caso MyODBC-3.51.112.i586. Per funzionare il Driver ha bisogno del pacchetto UnixODBC, disponibile su Sourceforge. Possiamo scaricare, ad esempio, unixODBC-2.2.10-1.i386 (RPM delle librerie) e unixODBC-gui-qt-2.2.10-1.i386 (interfaccia grafica di configurazione). La giusta sequenza di installazione prevede unixODBC, unixODBC-qt e quindi MyOdbc. Dopo l'installazione, il programma da lanciare è /usr/bin/ODBCConfig. Sarebbe anche possibile installare il driver modificando con un editor il file odbc.ini, ma questo direi che esula dallo scopo di questa documentazione. In ogni caso, il programma si presenta molto simile alla sua controparte Windows. Anche in questo caso è possibile aggiungere un DSN selezionando il tipo di Driver. La configurazione successiva della connessione è esattamente uguale a quella vista per i Sistema Operativo di Microsoft. 46 © 2005 Filippo Cerulo - Soft.Com Sas – Documento con Licenza Creative Commons - Rev 0.99 OpenOffice.org 2.0 & i Database - Database Server MySql Figura 5.2.1: DSN in Linux (SUSE 9.3) 5.2.3 Il Driver JDBC E' necessario scaricare, dal sito di MySql, il file mysql-connector-java-3.1.11.zip. Una volta scompattato, copiare il file mysql-connector-java-3.1.11-bin.jar in una cartella a piacere (io uso /opt/JBDC/). 5.2.4 I programmi Client Dal sito MySql.com è possibile scaricare in formato RPM sia Administrator che Query Browser. L'installazione, per le distribuzioni che prevedono un RPM manager è semplice, salvo problemi con le dipendenze. In alternativa, è anche possibile ricompilare dai sorgenti. 5.3 I Tipi di Dati Ogni Server di Database possiede un lungo elenco di tipologie di Dati gestibili. In realtà i tipi più comuni (numeri, testo e date) sono molto simili in tutti i “motori” SQL. Credo però sia opportuno indicare con precisione, per ogni Server, la denominazione esatta della tipologia e le caratteristiche della informazione che può essere archiviata. 47 © 2005 Filippo Cerulo - Soft.Com Sas – Documento con Licenza Creative Commons - Rev 0.99 OpenOffice.org 2.0 & i Database - Database Server MySql 5.3.1 Campi di Tipo Stringa MySql implementa i classici char e varchar; una “n” davanti al tipo di campo (“nchar”, “nvarchar”) significa che il campo stesso usa il set di caratteri internazionali predefinito (opzione comunque attiva di default). Tipo di Dato Lunghezza Definizione char / nchar Da 0 a 255 char(X) dove X è il numero di caratteri varchar / nvarchar Da 0 a 255 varchar(X) Da 0 a 65.535 dalla versione 5.0.3 5.3.2 Campi di Tipo Numerico Qui troviamo qualche utile variante allo standard. I campi di tipo numerico intero, a seconda dell'intervallo di valori che possono contenere, si dividono in TinyInt, SmallInt, MediumInt, Int, BigInt. Analogamente, i campi di tipo numerico decimale si possono definire Float, Double, Decimal. In particolare il tipo Decimal è indicato per la manipolazione di valori “valutari”, quello che in altri motori di Db viene definito campo Money o Currency. L'attributo unsigned elimina il segno e quindi permette la gestione di soli numeri positivi. zerofill invece riempie a sinistra il numero con zeri fino alla dimensione massima definita. Tipo di Dato bit Intervallo di valori Da 0 a 255 Note Introdotto dalla versione 5.0.3 – sinonimo di tinyint[1] tinyint Da -128 a 127 signed Occupa 1 byte di spazio Da 0 a 255 unsigned smallint Da -32.768 a 32.767 signed Occupa 2 byte di spazio Da 0 65.535 unsigned mediumint Da -8.388.608 a 8.388.607 signed Occupa 3 byte di spazio Da 0 a 16.777.215 unsigned int Da -2.147.483.648 a 2.147.483.648 Occupa 4 byte di spazio Da 0 a 4.294.967.295 unsigned bigint Da -9.223.372.036.854.775.808 a Occupa 8 byte di spazio 9.223.372.036.854.775.807 signed da 0 a 18.446.744.073.709.551.615 uns float(M,D) Virgola mobile singola precisione M è il numero massimo di cifre da visualizzare, D il numero di cifre decimali double(M,D) Virgola mobile doppia precisione decimal(M,D) Numero a virgola fissa Vedi riquadro tecnica 48 © 2005 Filippo Cerulo - Soft.Com Sas – Documento con Licenza Creative Commons - Rev 0.99 OpenOffice.org 2.0 & i Database - Database Server MySql Tecnica La definizione (e la gestione) del tipo Decimal sono cambiate in MySql 5.X. Nella vecchia versione il valore era memorizzato fisicamente come una stringa, mentre ora si utilizza un formato binario. Questo potrebbe causare problemi con le applicazioni che accedono ai dati, come, ad esempio, OpenOffice. 5.3.3 Campi di Tipo Booleano Definito come boolean, è l'equivalente di TinyInt[1] (quindi un valore numerico intero). Come tipo di dati è presente dalla versione 4.1.0 di MySql. Un valore uguale a zero viene considerato “falso”, diverso da zero “vero”. 5.3.4 Campi di Tipo Data/Ora MySql usa Date, DateTime, Time, Year, dal significato piuttosto intuitivo. Notate che il range di “Date” va dal 01-01-1000 al 31-12-9999. Siccome quasi sempre le date vengono memorizzate nel formato AAAAMMGG e visualizzate invece nel formato americano MM-GGAAAA, bisogna fare molta attenzione ai formati di input che si assegnano. 5.3.5 Campi di Tipo Binario / Text In questo caso MySql usa una variante del tipo text chiamata blob (binay long object) con alcune tipologie sempre collegate alla dimensione massima archiviabile (tinyblob, mediumblob, longblob). Per l'archiviazione di dati di tipo testo abbiamo i corrispondenti tinytext, text, mediumtext, longtext. Le dimensioni massime archiviabili sono elencate al capitolo 11.5 della guida di MySQL. 5.3.6 Campi particolari: Intero ad incremento automatico In MySql possiamo usare un campo Int con la caratteristica auto_increment settata. TIP Si noti che in MySql esiste anche un tipo SERIAL equivalente a BIGINT UNSIGNED NOT NULL AUTO_INCREMENT. Siccome in altri motori di Db il tipo SERIAL viene utilizzato per le chiavi primarie, se non avete particolari esigenze, per lo stesso scopo può essere usato il tipo INT UNSIGNED NOT NULL AUTO_INCREMENT, che risparmia 4 byte ed è più veloce nelle elaborazioni. 49 © 2005 Filippo Cerulo - Soft.Com Sas – Documento con Licenza Creative Commons - Rev 0.99 OpenOffice.org 2.0 & i Database - Database Server MySql 5.3.7 Campi particolari : Timestamp Il Timestamp di MySql è di tipo “classico”, cioè viene aggiornato automaticamente dal motore di Db. In una Tabella è possibile definire più campi Timestamp: quelli successivi al primo sono a disposizione dell'utente. 5.4 MySql Administrator Ogni Database che si rispetti avrebbe bisogno di uno strumento di amministrazione semplice e potente, adatto anche a chi non vuole usare la pur potente riga di comando. Dall'estate del 2004 è disponibile una nuova interfaccia di amministrazione per i server MySql, chiamata appunto MySql Administrator, scaricabile, per tutti i sistemi operativi supportati, da www.mysql.com. Con questo Tool è possibile gestire tutti gli aspetti della configurazione del nostro Db Server; è inoltre possibile modificare, aggiungere, cancellare Tabelle, Campi ed Indici, il tutto con una semplicità encomiabile. Dopo aver avviato il programma è necessario scegliere quale Server SQL vogliamo gestire, fornendo anche le eventuali credenziali di autenticazione, nella maschera in figura: Figura 5.4.1: Connessione a un Db con Administrator Vi ricordo che se MySql gira sulla stessa macchina che state usando, è sufficiente inserire come Hostname “localhost”, in caso contrario è necessario indicare l'indirizzo Ip del server. A questo punto vi troverete con la finestra principale finestra attiva. Non è ovviamente questa la sede per illustrare in dettaglio tutte le funzionalità di MySql Administrator, mi limiterò quindi a segnalarvi gli aspetti più utili. Selezionando la voce 50 © 2005 Filippo Cerulo - Soft.Com Sas – Documento con Licenza Creative Commons - Rev 0.99 OpenOffice.org 2.0 & i Database - Database Server MySql desiderata nell'elenco a sinistra, il programma mostra sulla destra i pannelli di gestione della voce stessa. Figura 5.4.2: Finestra principale di MySql Administrator La voce Service Control permette di stabilire le modalità di funzionamento del Server; può infatti essere utile decidere che il servizio sia eseguito in automatico dal Sistema Operativo all'avvio, ed in effetti questo è il caso più comune. Tra le altre opzioni, vi ricordo che Support for InnoDb (cioè la possibilità di usare le Tabelle di Tipo InnoDb) è attivo di default dalla Versione 4.0, quindi va eventualmente abilitato solo per le versioni precedenti; che Support for BDB serve solo se volete usare quel tipo di Tabelle (vi ricordo che viene ancora dichiarato in Beta Test); che Named Pipes permette l'accesso al Db sul Localhost (cioè in locale) attraverso questa modalità operativa al posto del Tcp/Ip (l'uso delle Named Pipes è comunque, a mio parere, una opzione inutile, anzi direi dannosa). Startup Variables permette il fine tuning (configurazione dettagliata) dell'ambiente MySql, fornendo un'interfaccia grafica di accesso a tutti i parametri di configurazione specificati nel file my.ini. Per quanto una trattazione più approfondita sarebbe interessante, non è questa la sede adatta. Vi consiglio però di fare modifiche solo se ben consapevoli di quello che volete ottenere. User Administration serve a gestire gli account Utente ed i privilegi di accesso al Server ed ai Database. Di questo ci occuperemo in dettaglio in uno dei prossimi paragrafi. 51 © 2005 Filippo Cerulo - Soft.Com Sas – Documento con Licenza Creative Commons - Rev 0.99 OpenOffice.org 2.0 & i Database - Database Server MySql Server Connections si occupa di monitorare in dettaglio gli accessi di basso livello al server: è utile soprattutto nelle fasi di controllo del carico e delle connessioni attive. Health propone un quadro molto dettagliato dello “stato di salute” del nostro Server attraverso grafici aggiornati in tempo reale su vari aspetti del funzionamento di MySql. Molto utile ed anche “scenografico”. Server Logs permette l'accesso a tutti i file di Log del Server. Replication Status fornisce informazioni sulle eventuali “repliche” dei dati presenti nel Server; per gli scopi di questo documento è un aspetto che davvero non ci interessa. Backup e Restore forniscono un strumento semplice per effettuare copie di sicurezza dei nostri Db, quindi ne parlerò in dettaglio in uno dei prossimi paragrafi. Catalogs permette la gestione completa e semplice della struttura dei nostri Database; in pratica da questa opzione si può modificare un Db in ogni suo aspetto, ed è per questo che ne parleremo in modo esteso nel prossimo paragrafo. 5.4.1 Parametri di avvio del Server Dopo l'installazione, è possibile stabilire una volta per tutte alcuni parametri di avvio del Server che vengono salvati in Windows nel File My.ini nella Dir di MySql. TIP I parametri di avvio sono modificabili solo se MySql Administrator viene eseguito sulla macchina Server, e solo se l'utente ha diritti di Amministratore sul Computer (quindi root per Linux). Tra le opzioni della Tab General Parameters di Startup Variables figura anche un Disable Networking che in pratica limita il funzionamento del Server alla macchina locale esclusivamente attraverso le Named Pipes (in Windows). A meno che non ci siano stringenti esigenze di sicurezza, non disabilitate ovviamente mai l'accesso tramite Tcp/Ip. 5.4.2 Gestione del Database Se scegliamo Catalogs, ci appare in basso l'elenco degli Schemi cioè dei Database presenti nel Server. Selezionando con un click uno degli schemi (ad esempio Mediateca) ci ritroveremo nella parte destra, nella Tab Schema Tables, l'elenco delle Tabelle contenute nel Database, insieme ad una serie di utili informazioni sulle stesse (vedi figura). Da questa finestra è possibile inserire, modificare e cancellare i campi e le tabelle del Db. La seconda Tab, Schema Indices, contiene un elenco di tutti gli indici assegnati a tutte le tabelle. Le Tab Views e Stored Procedures sono specifiche della versione 5.X di MySql e saranno esaminate in seguito. Se si seleziona una Tabella nello Schema Tables, un click sul pulsante in basso Details ci fornisce informazioni più approfondite sulla Tabella stessa. Il pulsante Maintenance 52 © 2005 Filippo Cerulo - Soft.Com Sas – Documento con Licenza Creative Commons - Rev 0.99 OpenOffice.org 2.0 & i Database - Database Server MySql consente invece di ottimizzare le Tabelle e di recuperare i dati in caso di problemi. Tra le tre opzioni disponibili per la manutenzione, la più interessante (ma anche quella che richiede più tempo di elaborazione) è senza dubbio Optimize che in un colpo solo ripara (se necessario) la Tabella, ricostruisce gli indici ed aggiorna le statistiche di accesso. L'operazione si può eseguire anche su più tabelle, selezionando le tabelle stesse con le SHIFT (per quelle contigue) o con il CONTROL per quelle non contigue. TIP Nella Figura compare già il nostro Database di esempio “mediateca”, ma nel seguito vedremo come costruirlo passo dopo passo. MySql indica col nome di “Schema” quello che in altri motori di Db viene indicato come “Database”; così la tradizionale “struttura del Database” cioè l'insieme delle definizioni delle Tabelle, dei Campi e degli Indici diventa “Struttura dello Schema” Figura 5.4.3: La gestione dei Catalog 53 © 2005 Filippo Cerulo - Soft.Com Sas – Documento con Licenza Creative Commons - Rev 0.99 OpenOffice.org 2.0 & i Database - Database Server MySql 5.5 Gestione delle Tabelle MySql, a differenza di altri software simili, pur avendo un formato “nativo”, può “appoggiarsi” ad altri prodotti Open Source per quanto riguarda il formato di archiviazione delle informazioni. Il formato “originario” del motore si chiama MyIsam, ed è in concreto una implementazione piuttosto efficiente del classico B-Tree. Nelle versioni più recenti MySql può usare anche Tabelle di tipo InnoDb e BDB (Berkley Db). In pratica però solo il supporto ad InnoDb è dichiarato “stabile”, mentre BDB è in Beta. Parleremo perciò solo di MyIsam e InnoDb. MyIsam, come abbiamo detto, è il formato “nativo” di MySql. Si tratta di Tabelle archiviate in singoli file con estensione .MYD per i dati e .MYI per gli indici. Si tratta di una soluzione affidabile e veloce, semplice da gestire anche per quanto riguarda i Backup. Purtroppo questo tipo di tabelle non supporta alcune caratteristiche che sono comuni nei moderni Database, e che possono rivelarsi utili in applicazioni di media complessità. In particolare MyIsam non prevede la gestione dell'integrità referenziale (come vedremo tra poco). Il tipo InnoDb è, come abbiamo detto, una "aggiunta" al MySql, nel senso che è un motore di Db di terze parti che è stato inglobato in MySql. Il motore è di concezione più moderna rispetto a MyIsam, ed usa, invece dei singoli file, un unico "tablespace", più alcuni file di log. Le caratteristiche migliorative di InnoDb rispetto a MyIsam sono, in breve : • supporto per le transazioni, cioè la possibilità di tornare indietro ad uno stato precedente se l'aggiornamento del Db non va a buon fine; • Row Level Locking, cioè blocco del Record sulla singola riga, utile in ambienti multiutente; • supporto per le Foreign Keys, (cioè le chiavi esterne) che è un primo passo verso l'integrità referenziale; • velocità di risposta, soprattutto in ambiente Windows. L'uso di un tipo piuttosto che l'altro dipende, quindi, dal tipo di applicazione e di dati che bisogna gestire. Per Db semplici, magari in Linux, va benissimo anche MyIsam. Per applicazioni complesse, ed in ambiente Windows, va meglio InnoDb. Comunque il passaggio da un tipo all'altro è sempre possibile, e nello stesso Db possono convivere Tabelle di tipi diversi. Tecnica Il supporto alle Tabelle di tipo InnoDb è incluso nella installazione standard di MySql dalla versione 4.0 in poi. Se non viene utilizzato, è comunque escludibile modificando il file di configurazione con l'opzione skip-innodb. Nelle versioni precedenti del motore di Db è necessario, invece, che sia abilitato seguendo le istruzioni dettagliate del manuale dell'applicazione. 54 © 2005 Filippo Cerulo - Soft.Com Sas – Documento con Licenza Creative Commons - Rev 0.99 OpenOffice.org 2.0 & i Database - Database Server MySql 5.5.1 Modifica della struttura delle Tabelle Il primo passo nella gestione di un Db è la creazione dello Schema. Bisogna posizionarsi nel pannello dei Catalogs in basso a sinistra e quindi, dal menu contestuale del tasto destro del mouse selezionare Create New Schema e scegliere il nome da dare al “nascituro”. Allo stesso modo, per creare una nuova Tabella, basta selezionare lo Schema e scegliere il pulsante Create Table in basso. Allo stesso modo si può modificare la struttura di una Tabella esistente con Edit Table. La finestra che si apre è divisa in tre Tab, nella parte alta. Columns and Indices si occupa dei campi e degli indici associati; Table Options permette di stabilire alcuni parametri riguardanti la Tabella; Advanced Option non è interessante per noi in questo momento. La Tab Columns and Indices visualizza nella parte centrale l'elenco e le caratteristiche dei campi: un doppio click sulla parte che ci interessa permette la modifica del parametro. TIP Notate che nella colonna Datatype non c'è una casella a discesa per la selezione del tipo ma il parametro va specificato per esteso (scrivendo fisicamente ad es. INTEGER). In verità il programma usa una specie di completamento automatico, e chiude anche le parentesi: all'inizio ci si sente disorientati, ma dopo un po' sembra una buona idea. Nella parte bassa troviamo una Tab (Indices) per la gestione degli indici associati alla Tabella. A sinistra sono elencati tutti gli indici presenti, ed è possibile aggiungere o cancellare nuovi indici con i pulsanti “+” e “-” che vedete in basso. Nella parte centrale è possibile modificare il nome ed il tipo dell'indice. Nella parte destra vengono elencati i campi che fanno parte dell'indice. Per aggiungere un campo è necessario selezionarlo nell'elenco in alto e premere il pulsante “+” sull'estrema destra. In alternativa è possibile usare il drag'n'drop, ma a me non sempre riesce. La Tab Foreign Keys sarà esaminata in dettaglio tra un attimo. La Tab Column Details contiene, in una forma diversa, le stesse informazioni dell'elenco dei campi in alto. Con la Tab in alto Table Options è possibile stabilire il Tipo di Tabella che desideriamo gestire. Abbiamo parlato nel Paragrafo precedente di MyIsam e InnoDb: bene qui scegliamo quale motore gestirà i dati. Le Opzioni sono molte (ben sette!), ma a noi interessano solo le prime due. Una caratteristica interessante di MySql Administrator è che alla fine delle modifiche, premendo il pulsante Apply Changes viene mostrato l'elenco dei comandi SQL che dovranno essere eseguiti sul Db. Questo è estremamente “didattico”, perché traduce in SQL quello che abbiamo richiesto, permettendoci di capire meglio quello che accade. 55 © 2005 Filippo Cerulo - Soft.Com Sas – Documento con Licenza Creative Commons - Rev 0.99 OpenOffice.org 2.0 & i Database - Database Server MySql 5.5.2 Aggiungere le Tabelle a Mediateca Seguendo le indicazioni sulla struttura dei Dati fornite nel Capitolo “Il nostro Database di esempio” non dovrebbe essere difficile creare la struttura di Mediateca. In figura i campi di TbMedia. Figura 5.5.1: Modifica della struttura di una Tabella TIP La proprietà valore predefinito (default value) è importante. Se definiamo un campo numerico qualsiasi, non è saggio, per i motivi spiegati in precedenza, permettere l'archiviazione di valori nulli. Nel caso di aggiunta di una riga, però, dovremmo manualmente scrivere il valore 0 nel campo numerico. Basta quindi assegnare al campo il valore predefinito di 0 per toglierci il fastidio. Quindi ai campi numerici è sempre opportuno assegnare il valore iniziale uguale a zero. I Campi stringa possono anche ammettere il null, a meno che non si tratti di un indice, dove il null è sconsigliato. Anche in questo caso, se il null non è ammesso, può essere comodo assegnare un valore iniziale, magari uno spazio. Le ultime versioni di MySql Administrator sono un po' schizzinose sulla definizione dei valori predefiniti: se siete indecisi e non si tratta di un campo numerico assegnate pure null. 56 © 2005 Filippo Cerulo - Soft.Com Sas – Documento con Licenza Creative Commons - Rev 0.99 OpenOffice.org 2.0 & i Database - Database Server MySql Per i Campi di tipo Decimal, la lunghezza va impostata secondo la forma “M,D”, dove M è il numero complessivo di cifre desiderato e D il numero di Decimali. Il campo “Mprezzo” è stato definito come “14,2”. Tecnica Per chi non ha mai approfondito l'argomento, il concetto di null può non essere chiaro. In effetti null significa “vuoto” cioè letteralmente “senza alcun valore di alcun tipo”, quindi “privo di valore”. Questo significa che un valore null è cosa diversa dallo zero, ed anche diverso dalla stringa vuota, cioè “”. Per definizione un valore null non è confrontabile, e non può essere usato in operazioni aritmetiche. Perciò, ad esempio 0+null è scorretto (può dare un errore di sistema o ancora un null), e neppure ha senso dire che “pippo” viene prima o dopo null. Quindi occhio, amici miei, che questo è un punto fondamentale per ottenere, alla fine, dal nostro archivio valori sensati. Notate che Administrator è abbastanza “intelligente” da capire che se chiamo il primo campo di una Tabella MId (quindi il nome contiene la stringa “Id”, cioè “identifier”) ed assegno un valore Integer, allora quel campo potrebbe essere una chiave primaria; perciò l'indice viene creato in automatico. Gli altri indici invece vanno creati manualmente, come spiegato nei paragrafi precedenti. Nella Tab Table Option scegliamo il tipo di motore che desideriamo usare (per comodità nell'esempio useremo InnoDb, visto che ci interessa anche l'integrità referenziale). 5.5.3 Integrità Referenziale Molti motori di Db hanno a disposizione un meccanismo di controllo che impedisce la cancellazione o la modifica delle chiavi esterne, o comunque permette di stabilire regole precise per la gestione di queste eventualità. Questi motori si occupano perciò di preservare l'integrità referenziale del DataBase. Per molto tempo gli sviluppatori di MySql hanno sostenuto che MyIsam, per mantenere le caratteristiche di leggerezza e velocità, non doveva occuparsi dell'integrità referenziale, che quindi era lasciata completamente sotto la responsabilità dell'utente. Fortunatamente la cose con InnoDb sono un po' cambiate. Le Tabelle InnoDb supportano la gestione delle chiavi esterne, non tanto nelle query di relazione (cioè quando si usano in una query più tabelle), quanto appunto nel controllo dell'integrità referenziale. Per applicare ad una tabella una chiave esterna, è necessario che : • le tabelle coinvolte siano tutte di tipo InnoDb; • i campi da mettere in relazione siano dello stesso tipo e della stessa lunghezza; • il campo nella tabella che contiene la chiave esterna (nel nostro caso TbArgomenti) deve avere un indice univoco e deve preferibilmente essere la chiave primaria; 57 © 2005 Filippo Cerulo - Soft.Com Sas – Documento con Licenza Creative Commons - Rev 0.99 OpenOffice.org 2.0 & i Database - Database Server MySql • il campo nella tabella che fa riferimento alla chiave esterna (TbMedia) deve essere indicizzato; Se tutte le condizioni precedenti sono verificate, possiamo impostare la Foreign Key. 5.5.4 Impostazione dell'Integrità Referenziale MySql Administrator è, a quanto mi risulta, il primo Tool grafico ufficiale (cioè direttamente supportato da MySql Ab) che permette la gestione delle chiavi esterne. Se i prerequisiti che abbiamo già elencato sono tutti verificati, nella finestra di modifica della struttura della Tabella (nel nostro caso TbMedia), in basso, troviamo una Tab chiamata Foreign Keys: Figura 5.5.2 Finestra di gestione delle Chiavi Esterne Vi ricordo che stiamo definendo una chiave esterna (ArgId) per la Tabella TbMedia, che faccia riferimento al Campo ArgId della Tabella TbArgomenti. Per aggiungere la chiave è necessario fare click sul pulsante “+” in basso a sinistra. Dopo aver assegnato un nome a piacere alla chiave, bisogna selezionare dalla casella a discesa Ref. Table qual'è la tabella che contiene il campo collegato (nel nostro caso TbArgomenti). Se esistono campi comuni tra le due tabelle (ArgId), il programma li aggiunge direttamente alla relazione (Column, Reference Column) come in figura: Figura 5.5.3: Chiave esterna degli Argomenti 58 © 2005 Filippo Cerulo - Soft.Com Sas – Documento con Licenza Creative Commons - Rev 0.99 OpenOffice.org 2.0 & i Database - Database Server MySql Con il pulsante Apply Changes salviamo la chiave appena creata, e, se volete, date anche uno sguardo al comando SQL che Administrator si appresta ad eseguire: ALTER TABLE `mediateca`.`tbmedia` ADD FOREIGN KEY `FK_tbmedia_1` (`ArgId`) REFERENCES `tbargomenti` (`ArgId`); La sintassi è piuttosto comprensibile, quindi evito altri commenti. Quali risultati abbiamo ottenuto ? Per prima cosa se tentassimo di cancellare il Record con Id uguale a 5 (Gialli); otterremo questo messaggio di errore di questo tipo : Figura 5.5.4 Messaggio di errore di integrità violata Cioè il Motore di Db mi impedisce di cancellare una Chiave esterna referenziata in un'altra Tabella (ne nostro caso TbMedia). Significa, in parole povere, che finché in TbMedia esisterà un Record con ArgId uguale a 5, il Record con ArgId uguale a 5 di TbArgomenti NON POTRA' ESSERE CANCELLATO. In altre parole, non posso eliminare un genitore se esistono figli (e questo per chi crede che l'informatica manchi di etica...). Questo è già un buon risultato, ma andiamo avanti. Se invece cercassimo di aggiungere a TbMedia un Record con un ArgId non presente nella Tabella TbArgomenti (ad esempio un valore 99, inesistente), il messaggio di errore sarebbe: Figura 5.5.5 Errore di violazione dell'integrità referenziale 59 © 2005 Filippo Cerulo - Soft.Com Sas – Documento con Licenza Creative Commons - Rev 0.99 OpenOffice.org 2.0 & i Database - Database Server MySql Cioè il Motore di Db mi impedisce di aggiungere un Record con un valore nel campo ArgId NON PRESENTE in TbArgomenti. Cioè non è possibile inserire figli senza genitore. Era quello che volevamo, no? Torniamo però un passo indietro. Nella finestra di impostazione della chiave esterna, si possono notare due altre opzioni, precisamente ON UPDATE e ON DELETE, entrambe settate su NO ACTION. Bene, se quello che abbiamo appena visto è il comportamento standard del motore di Db (NO ACTION), possiamo comunque eventualmente scegliere delle opzioni alternative ne caso si modifichi (ON UPDATE) o si cancelli (ON DELETE) la chiave esterna (cioè il genitore di una serie di record presenti nella Tabella “figlia”). In particolare : CASCADE estende la variazione della chiave esterna alla Tabella “figlia”; nel caso di ON UPDATE CASCADE, se, ad esempio, in TbArgomenti modifichiamo ArgId da 5 a 55, tutti i record di TbMedia con ArgId uguale a 5 saranno aggiornati di conseguenza. Nel caso di ON DELETE CASCADE, però, la cancellazione di una chiave esterna NON VIENE PIU' IMPEDITA, e vengono eliminati a cascata anche tutti i record della Tabella “figlia”. Cioè se cancello “5” in TbArgomenti, non avrò più nessun Giallo in TbMedia. SET NULL invece si limita ad impostare a Null tutte le chiavi figlie del genitore modificato. RESTRICT infine, è equivalente a NO ACTION, cioè controlla l'applicazione dell'integrità. Come vedete l'integrità referenziale è uno strumento molto potente, perché permette di stabilire regole a livello di motore di Db che non possono essere scavalcate da manovre errate dell'utente. Queste regole però vanno impostate con cognizione di causa, e, soprattutto, in fase di progettazione iniziale del Database (o, adottando la nomenclatura di MySql, della struttura del Catalogo). Applicare una nuova regola di integrità ad una Tabella già colma di dati infatti non sempre è possibile, perché alcuni dei record immessi potrebbero già non rispettare la regola stessa. 5.6 Backup degli Archivi MySql Una sana politica di Backup, come ben sapete, ci mette al riparo da disastri che provocano giornate di lavoro perse e mal di testa cronici. Per quanto la natura umana sia pervasa dalla convinzione che “a me non succederà mai”, la logica e la Legge di Murphy ci dicono che invece sicuramente prima o poi accadrà. Quindi, di fronte all'ineluttabile, meglio essere preparati (stiamo parlando di informatica, forse è meglio non generalizzare...). La domanda da porsi, quindi, è : come si fa un Backup degli Archivi di MySql ? Fortunatamente la risposta è abbastanza semplice: basta trasferire periodicamente i file dei Dati su un altro supporto. Già, ma quali file ? Per le Tabelle MyIsam, per ogni “catalogo” (cioè Database) esiste una cartella nella dir dei Dati definita per il Server. In Windows basta cercare in c:\programmi\mysql\MYSQL Server X.X\data\. Un Backup dell'intero percorso mette al sicuro tutti i cataloghi. In Linux, a seconda 60 © 2005 Filippo Cerulo - Soft.Com Sas – Documento con Licenza Creative Commons - Rev 0.99 OpenOffice.org 2.0 & i Database - Database Server MySql dei parametri di installazione, esiste una struttura equivalente di solito in /usr/local/mysql. Ovviamente questo metodo funziona quando il Server non è in esecuzione. Se utilizziamo anche Tabelle InnoDb, a quanto detto prima vanno aggiunti i file di Dati e di Log di InnoDb, e sono tutti quelli che iniziano per “ib” (ib*). Se non è possibile disattivare il Server, il manuale di MySql elenca con dovizia di particolari tutta una serie di metodi alternativi, alcuni basati su tool da linea di comando, per ottenere lo stesso risultato senza grossi sforzi. Non credo però che sia il caso di approfondire, anche perché abbiamo, volendo, il supporto di una ottima interfaccia grafica.... 5.6.1 Backup dei Dati Alla voce Backup di MySql Administrator, basta selezionare New Project col pulsante in basso e fornire i parametri del nostro Backup. In particolare, è possibile selezionare più di un Catalogo, oppure, all'interno di un Catalogo, solo alcune Tabelle. Il pulsante Save Project permette il salvataggio dei parametri di Backup, in modo da non doverli reinserire in seguito. Figura 5.6.1: Backup con MySql Administrator La Tab Advanced Options serve a definire alcune opzioni utili. Se le tabelle sono di tipo MyIsam, selezionate, nel Backup Execution Method la voce Lock All Tables, che “blocca” le Tabelle per permettere un Backup sicuro dei dati. Se invece avete usato InnoDb, selezionate l'opzione InnoDb OnLine Backup, più adatta allo scopo. In Output File Options c'è poco da selezionare, e direi che è saggio lasciare le opzioni di default, anche se le scelte sono abbastanza intuitive. Il Backup Type permesso, almeno per questa versione, è unicamente Sql file; questo significa che tutto il Db (o le tabelle che avete selezionato) sarà salvato come un file di testo con estensione .sql contenente i comandi SQL 61 © 2005 Filippo Cerulo - Soft.Com Sas – Documento con Licenza Creative Commons - Rev 0.99 OpenOffice.org 2.0 & i Database - Database Server MySql necessari a ricreare il Db da zero. Non si tratta perciò di una copia “binaria” dei dati, ma della “trasposizione” SQL dell'intera struttura e del contenuto del Catalogo. Non ci credete ? Allora date un'occhiata all'inizio del File creato dal Backup della Tabella tbArgomenti di Mediateca : [.....] --- Create schema mediateca -CREATE DATABASE /*!32312 IF NOT EXISTS*/ mediateca; USE mediateca; --- Table structure for table `mediateca`.`tbargomenti` -DROP TABLE IF EXISTS `tbargomenti`; CREATE TABLE `tbargomenti` ( `ArgId` int(10) unsigned NOT NULL auto_increment, `ArgDes` varchar(30) NOT NULL default '', `ArgTs` timestamp NOT NULL default CURRENT_TIMESTAMP CURRENT_TIMESTAMP, PRIMARY KEY (`ArgId`), KEY `Arg` (`ArgDes`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; on update --- Dumping data for table `mediateca`.`tbargomenti` -/*!40000 ALTER TABLE `tbargomenti` DISABLE KEYS */; INSERT INTO `tbargomenti` (`ArgId`,`ArgDes`,`ArgTs`) VALUES (1,'Rock','2004-04-08 12:00:19'), (2,'Classica','2004-04-08 12:00:22'), (3,'Pop','2004-04-11 11:03:22'), (4,'Filosofia','2004-04-08 12:00:32'), (5,'Giallo','2005-04-26 21:33:31'), (6,'Saggio','2004-09-16 19:02:14'), (7,'Sistemi Operativi','2004-04-08 12:01:02'), (8,'Samba','2004-04-08 12:01:05'), (9,'Reti Locali','2005-05-05 20:16:53'), (10,'Giochi','2004-04-10 17:34:09'), (15,'Fantasy','2004-04-12 18:35:26'), (16,'Linux','2004-04-13 18:41:30'), (17,'Romanzo','2004-04-16 09:35:02'), (18,'Avventura','2004-04-16 09:38:18'), (19,'Windows','2005-04-29 11:42:59'), (20,'Ftp','2005-04-07 12:23:05'); /*!40000 ALTER TABLE `tbargomenti` ENABLE KEYS */; [....] Questo metodo ha dei vantaggi. Siccome abbiamo un file di testo con comandi SQL (quasi) standard, potrebbe essere usato, ad esempio, per il trasferimento dei dati ad altri motori di Db. Inoltre questo tipo di Backup è l'ideale per il passaggio di dati tra server MySql diversi, o tra Cataloghi diversi nello stesso Server. Infatti... 62 © 2005 Filippo Cerulo - Soft.Com Sas – Documento con Licenza Creative Commons - Rev 0.99 OpenOffice.org 2.0 & i Database - Database Server MySql 5.6.2 Restore dei Dati La Tab Restore di MySql Administrator è un esempio di semplicità. Per prima cosa, col pulsante Open Backup File si seleziona il Backup da recuperare, quindi si può scegliere, in Target Schema se si desidera recuperare i dati nella posizione originale oppure in un altro catalogo. Se il Db non esiste, si può richiedere di crearlo da zero. Infine nella Tab Restore Content il pulsante Analyze Backup ci permette di selezionare solo alcune tabelle per il restore. Un lavoro davvero ottimo. 5.7 La sicurezza : Utenti e Diritti MySql è un Db particolare e forse la cosa sta lentamente insinuandosi nelle vostre sveglie menti, dopo aver letto fin qui. “Particolare” significa che su alcuni aspetti questo software ha un approccio direi “nordico”, vista l'origine. Il “nordico” va inteso nel senso che, per certi versi, gli sviluppatori hanno una visione delle cose assai personale e non vogliono cambiarla. Quelli di voi che hanno usato altri Db ed hanno a cuore la sicurezza dei propri dati, continuando nella lettura di questo paragrafo potrebbero storcere il naso (io direi meglio “sentire un sudore freddo su per la spina dorsale”), ma che volete, questi di MySql passano metà dell'anno al buio.... Allora, tanto per cominciare, ecco tre succose informazioni che servono a farsi un'idea : 1. ogni utente del Db è identificato dal nome, dall'host da cui si connette e dalla password; questo vuol dire che il nostro amico Alfred, che si collega sia dalla macchina che ospita il Server, sia dal Client in Rete deve avere DUE ACCOUNT; 2. il concetto di Gruppi di Utenti è sconosciuto a MySql, per cui non si possono assegnare diritti ad un Gruppo e quindi semplicemente aggiungere un Utente al Gruppo; sarebbe troppo comodo, e quindi dovrete assegnare i diritti singolarmente AD OGNI UTENTE; 3. appena dopo aver installato il Server, l'utente root (cioè l'amministratore) ha password vuota; come se non bastasse, potrebbe esistere anche un account che permette l'accesso anonimo, dalla macchina che ospita il Server (localhost), con i poteri di Amministratore (in Windows) e di Ospite (in Unix / Linux), sempre con la password vuota (questo è un po' cambiato nelle ultime versioni: l'installer Windows permette di configurare alcuni importanti aspetti della sicurezza prima di avviare effettivamente il Server) Bene, se finora pensavate che forse non era una cattiva idea migrare in MySql quel Db con una cinquantina di utenti che avete in Azienda, ora forse qualche dubbio in verità vi assale... Ma non disperate: mai fermarsi alla prima impressione, e poi di tutto bisogna accettare sia i pregi che i difetti. In verità questa parte relativa alla sicurezza mi sembra un po' trascurata in MySql, e quindi se vogliamo mettere su un Server sicuro c'è un po' da lavorare. Cominciamo quindi con i concetti di base. 63 © 2005 Filippo Cerulo - Soft.Com Sas – Documento con Licenza Creative Commons - Rev 0.99 OpenOffice.org 2.0 & i Database - Database Server MySql Il modello di sicurezza usato da MySql è, in realtà, assai semplice. I livelli di autenticazione (e quindi di assegnazione dei diritti) sono due; il primo permette l'accesso al Server e concede i privilegi globali, il secondo si occupa di gestire i diritti sui singoli Database (o Schema) presenti nel Server stesso. Inoltre si può scendere fino al dettaglio della singola colonna (o campo) di una Tabella (ad esempio stabilendo che per un utente quel campo deve essere in sola lettura). Allora, vediamo quali sono i diritti assegnabili : Diritto Contesto di assegnazione ALTER tabelle DELETE tabelle INDEX tabelle INSERT tabelle SELECT tabelle UPDATE tabelle CREATE cataloghi, tabelle, o indici DROP cataloghi o tabelle GRANT cataloghi o tabelle REFERENCES NON USATO CREATE TEMPORARY TABLES amministrazione del server EXECUTE NON USATO FILE accesso ai file LOCK TABLES amministrazione del server PROCESS amministrazione del server RELOAD amministrazione del server REPLICATION CLIENT amministrazione del server REPLICATION SLAVE amministrazione del server SHOW DATABASES amministrazione del server SHUTDOWN amministrazione del server SUPER amministrazione del server Come vedete, in generale il nome è identico alla corrispondente istruzione SQL, quindi il significato è lampante. Il privilegio di GRANT permette di trasferire i propri diritti ad un altro Utente. Un privilegio globale vale per tutti gli Schemi (Database) gestiti dal Server, e per il Server stesso. Abbiamo già detto che ogni utente viene identificato da tre parametri: il nome, l'host da cui si connette e la password. Per “host da cui si connette” intendiamo il nome o l'indirizzo IP del Computer che richiede la connessione. La macchina su cui gira il Server è identificata sempre dalla stringa “localhost”. Quindi l'utente pippo@testws è diverso da pippo@multimedia. Diverso significa che può avere password diversa e privilegi differenti. Per fortuna possiamo 64 © 2005 Filippo Cerulo - Soft.Com Sas – Documento con Licenza Creative Commons - Rev 0.99 OpenOffice.org 2.0 & i Database - Database Server MySql almeno usare delle wildcards (ma solo nel campo host), quindi ad esempio pippo@% significa “l'utente Pippo, da qualsiasi workstation si connetta”. Se si indica solo il nome di host, invece, per MySql significa “accesso anonimo dall'host”, meglio ancora “tutti gli utenti dell'host”. Però questo implica che, ad esempio, @localhost significa “accesso anonimo dal localhost”, @testws “accesso anonimo da testws”, @% “accesso anonimo da qualunque PC collegato in rete” (con tanti ringraziamenti da parte di un eventuale intruso). Ora, se vi sentite confusi, sappiate di essere in buona compagnia; ma non disperate, non è ancora finita. Supponiamo di voler affidare all'utente pippo la gestione del Database Mediateca; vogliamo inoltra che pippo possa collegarsi da tutti gli host della nostra rete. Quindi aggiungiamo l'utente pippo@% e concediamo tutti i diritti su Mediateca. Pippo si collega senza problemi e svolge il suo lavoro. Per caso abbiamo inoltre, sulla nostra rete, un PC che si chiama testws, e desideriamo che tutti gli utenti di questo host accedano al Database news2; quindi creiamo l'utente anonimo @testws ed assegniamo i diritti sul catalogo news2. La situazione attuale sarebbe, quindi : Utente Significato database diritti pippo@% pippo, collegato da qualsiasi host mediateca gestione @testws qualsiasi utente anonimo dell'host testws news2 gestione A questo punto pippo si siede al Pc testws e chiede l'accesso a mediateca: MySql rifiuta la connessione. Questo vuol dire che i diritti di accesso anonimo dell'host invalidano quelli del singolo utente. Perciò, O consentiamo l'accesso anonimo da testws anche a mediateca, ma questo apre il db anche agli altri utenti, OPPURE aggiungiamo un utente pippo@testws con i diritti appropriati. A questo punto pippo, come utente di testws, vuole accede a news2, quindi fornisce le sue credenziali (nome e password) e MySql gli rifiuta la connessione. Cioè per accedere a news2 da testws l'utente deve essere anonimo. In caso contrario MySql controlla i diritti di pippo, e se non è specificato che può accedere a news2, nega la connessione. Tutto questo ha una logica (anche se per me piuttosto oscura) ed è abbastanza ben spiegato ai capitoli 5.4 e 5.5 del manuale di MySql. Quindi coraggio e buona lettura. Vi risparmio anche i dettagli di come tutte queste informazioni siano archiviate nel catalogo (Database) di nome MySql (non sono un sadico, e voi interrompereste la lettura dopo due righe). Siccome però è probabile che (come me) avete capito poco, qui di seguito vi passo qualche semplice consiglio che viene fuori dalla mia esperienza di utente. Allora: 1. dopo l'installazione di MySql, per prima cosa assegnate una password all'utente root; ricordate che gli utenti root sono DUE, uno per la connessione da localhost, l'altro per la 65 © 2005 Filippo Cerulo - Soft.Com Sas – Documento con Licenza Creative Commons - Rev 0.99 OpenOffice.org 2.0 & i Database - Database Server MySql connessione dalla rete; se desiderate che root possa collegarsi SOLO dal localhost, eliminate l'utente root@%; 2. eliminate o regolamentate l'accesso anonimo al server; una buona soluzione è cancellare del tutto gli utenti @% e @localhost; 3. se non serve controllare l'host di collegamento, aggiungete solo utenti del tipo utente@%; questo garantisce comunque la verifica dell'autenticazione senza specificare da quale workstation la connessione debba avvenire; 4. se invece volete controllare l'host di collegamento, tenete presente che il nome host viene passato direttamente dal sistema (cioè voi non potete specificarlo); 5. il modello di sicurezza di MySql non si basa su quello del Sistema Operativo su cui è in esecuzione, quindi aggiungere troppi utenti complica la gestione; piuttosto, se sul server sono presenti più database, può essere utile seguire un modello “orientato al catalogo”. Ad esempio, per l'accesso a mediateca, posso aggiungere un utente mediateca@%, con i soli privilegi su questo db; 6. ricordate che di solito l'accesso a MySql avviene attraverso la configurazione di un DSN (Data Source Name) di tipo ODBC sia in Linux che in Windows; i DSN possono essere specifici di un utente o di una macchina; potrei voler assegnare un DSN già configurato all'utente od alla macchina, senza rivelare all'utente la password di accesso a MySql; quindi posso aggiungere un DSN con nome utente “mediateca”, uno con nome utente “news2” etc.; in questo modo all'utente non verrà MAI chiesta una password di connessione; questa soluzione però non funziona in Linux, perché nel DSN non si può specificare un nome utente ed una password; 7. limitate l'assegnazione di privilegi globali solo agli account che ne hanno effettivamente bisogno; limitate l'accesso di ogni utente ad un singolo Database, salvo casi eccezionali; 8. le password di MySql sono lunghe fino a sedici caratteri, ma non è possibile impostare alcuna policy (numero minimo di caratteri, scadenza etc.) su di esse; quindi è fondamentale la scelta di password non banali. Bene, ora che abbiamo studiato la teoria, passiamo alla pratica. TIP Se, nei parametri del Server, avete disabilitato la gestione dei nomi allora tutti i permessi devono far riferimento all'indirizzo fisico della macchina. Non è perciò consentito (o almeno non funziona) un utente del tipo fc@homeserver. Questo, se ad esempio usiamo un server DHCP per l'assegnazione automatica degli indirizzi, è molto scomodo perché in teoria la stessa macchina potrebbe nel tempo assumere indirizzi IP diversi. 66 © 2005 Filippo Cerulo - Soft.Com Sas – Documento con Licenza Creative Commons - Rev 0.99 OpenOffice.org 2.0 & i Database - Database Server MySql 5.7.1 Gestione della sicurezza da linea di comando Tutta la parte di gestione di un Server MySql (e quindi anche la sicurezza) può essere eseguita tramite tool a linea di comando presenti nella cartella ..\mysql\bin, a cominciare dal già citato mysql. Credo non sia questa l'occasione per approfondire l'argomento. Sappiate almeno però che a livello SQL l'assegnazione e la revoca di diritti avviene tramite gli statements GRANT e REVOKE. A titolo di esempio ecco la sintassi di GRANT presa dal manuale di MySql: GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ... ON {tbl_name | * | *.* | db_name.*} TO user [IDENTIFIED BY [PASSWORD] 'password'] [, user [IDENTIFIED BY [PASSWORD] 'password']] ... [REQUIRE NONE | [{SSL| X509}] [CIPHER cipher [AND]] [ISSUER issuer [AND]] [SUBJECT subject]] [WITH [GRANT OPTION | MAX_QUERIES_PER_HOUR count | MAX_UPDATES_PER_HOUR count | MAX_CONNECTIONS_PER_HOUR count]] Inoltre, poiché tutta la struttura è memorizzata nelle tabelle user, db e host del catalogo mysql, è possibile usare anche semplici istruzioni INSERT, DELETE od UPDATE, purché si sappia quello che si sta facendo. Ma a noi va bene anche la GUI di MySQL Administrator... 5.7.2 MySql Administrator : la sicurezza Selezionando la voce User Administration, nella finestra in basso a destra vengono elencati gli utenti autorizzati per il server, come in figura: Figura 5.7.1: Gestione utenti Ogni utente è identificato da un nome, e, se necessario, anche dagli hosts specificati per il suo accesso. Se non viene indicato alcun host, si intende “ogni host”. Nella sintassi di mysql, quindi il “carlo” della figura sarebbe “carlo@%”. Se sono elencati altri host, ognuno rappresenta un utente diverso. Quindi nel nostro caso avremo pippo@%, pippo@homeserver. Con un menu contestuale attivato dal tasto destro in questa finestra è possibile aggiungere un nuovo utente. Sempre con un menu contestuale, selezionato un utente si possono eventualmente aggiungere nuovi host di connessione. Questa rappresentazione può sembrare 67 © 2005 Filippo Cerulo - Soft.Com Sas – Documento con Licenza Creative Commons - Rev 0.99 OpenOffice.org 2.0 & i Database - Database Server MySql lineare, ma secondo me non lo è affatto. Infatti un nuovo utente viene aggiunto sempre nella forma utente@%, cioè è possibile il collegamento da qualsiasi host. Anche se si aggiunge un host specifico (come per pippo@homeserver), non viene eliminato pippo@%. Questa situazione si vede bene se si apre la tabella user del Database di sistema mysql, come in figura: Figura 5.7.2: Utenti di un Server MySql qui si comprende assai meglio che in effetti pippo@% e pippo@homeserver sono proprio DUE UTENTI DIVERSI. Per fare in modo che pippo si colleghi SOLO da homeserver è necessario cancellare manualmente l'utente pippo@%; il problema è che, però, in questo caso l'utente viene visualizzato in Administrator solo come pippo (direi che questo modulo ha ancora bisogno di una limatura da parte dei programmatori...). In ogni caso, all'utente è possibile assegnare i privilegi con un comodo sistema mostrato in figura. Abbiamo le tab in alto riguardanti i privilegi globali, i Database (schema), le Tabelle e le colonne. TIP In realtà, nella installazione standard di MySql Administrator, nelle Tab compare solo la voce “schema privileges”; per abilitare le altre due, nella voce di menu Tools->Options è necessario abilitare le caselle di spunta alla voce “User Administration”. La gestione è abbastanza semplice; una volta selezionati l'utente e la sezione che ci interessa, tutto si risolve spostando i privilegi elencati a video dalla colonna available (disponibile) a quella assigned (assegnato), come in figura. 68 © 2005 Filippo Cerulo - Soft.Com Sas – Documento con Licenza Creative Commons - Rev 0.99 OpenOffice.org 2.0 & i Database - Database Server MySql Figura 5.7.3 Assegnazione diritti ad un Utente 5.8 Importazione dei Dati da altri Db Quando si decide di migrare da un Server di Database ad un altro è sempre abbastanza complicato spostare i dati da una parte all'altra. Nel caso di MySQL è possibile usare più di un sistema (compreso il “transito” attraverso il modulo Base di OOo), ma quello più semplice è l'uso di Migration Toolkit. 5.8.1 Migration Toolkit Il Migration Toolkit è scaricabile da sito di MySql, ed è un Wizard che permette l'importazione di dati da Ms Access, Ms Sql Server, Oracle, un driver JBDC generico oppure un'altra istanza di MySQL. Il funzionamento è piuttosto intuitivo, quindi vi risparmio i dettagli. Con Ms Access funziona egregiamente: i tipi di dati vengono conservati e, quando non disponibili in MySQL, “tradotti” con intelligenza (ad es. decimal(19,4) per il tipo valuta oppure tinyint(1) per Si/No). Si può trasferire un intero Database oppure singole Tabelle; in definitiva si tratta di un ottimo strumento. 5.9 Novità della Versione 5 La Versione 5 di MySQL ha introdotto caratteristiche lungamente attese dalla comunità degli Utenti. In breve, riportando solo quelle essenziali, abbiamo: • un nuovo tipo di dato BIT (equivale a tinyint(1)) 69 © 2005 Filippo Cerulo - Soft.Com Sas – Documento con Licenza Creative Commons - Rev 0.99 OpenOffice.org 2.0 & i Database - Database Server MySql • la presenza dell'Information Schema, una sorta di catalogo generale di tutti gli oggetti del Database • incremento della precisione matematica dei calcoli • due nuovi motori di archiviazione: ARCHIVE e FEDERATED • gestione di Stored Procedure e Stored Function • maggiore conformità allo standard SQL • supporto (ancora limitato) ai trigger • aumento della capacità di archiviazione del tipo VARCHAR fino a 65.532 caratteri • supporto per le Viste (Views) • aumento generalizzato della velocità di elaborazione I progressi sono notevoli, e permetteranno sicuramente a MySQL di acquisire nuovi utenti a scapito della concorrenza. 5.9.1 Creazione di Viste La creazione di viste in MySQL 5 è abbastanza semplice: si tratta di utilizzare il comando SQL CREATE VIEW. Ad esempio, per la nostra mediateca, il comando potrebbe essere: CREATE VIEW 'mediateca`.`media` AS SELECT `tbmedia`.`MId` AS `Mid`, `tbmedia`.`MDes` AS `Mdes`, `tbsupporti`.`SuppDes` AS `SuppDes`, `tbargomenti`.`ArgDes` AS `ArgDes` FROM ((`tbsupporti` join `tbmedia`) join `tbargomenti`) WHERE ((`tbsupporti`.`SuppId` = `tbmedia`.`SuppId`) and (`tbargomenti`.`ArgId` = `tbmedia`.`ArgId`)) ORDER BY `tbmedia`.`MDes`; La sintassi è molto simile alla SELECT normale, bisogna solo specificare il nome della vista nella forma database.nome. Una volta creata, la vista può ovviamente essere modificata o cancellata con appositi comandi SQL. In teoria le viste dovrebbero poter essere gestite anche con l'interfaccia grafica di MySQL Administrator, ma la versione attuale (la 1.1.5) non è affidabile sotto questo aspetto. 5.10 Esecuzione di comandi SQL Potremmo ora domandarci come fare ad “ordinare” al Server l'esecuzione di un comando SQL. I metodi sono sostanzialmente due: 1. usare l'utility a linea di comando mysql inclusa nel server; 2. trasferire al server il comando attraverso un Tool esterno (magari ad interfaccia grafica); 70 © 2005 Filippo Cerulo - Soft.Com Sas – Documento con Licenza Creative Commons - Rev 0.99 OpenOffice.org 2.0 & i Database - Database Server MySql Se scegliamo la prima soluzione, dobbiamo lanciare il programma mysql contenuto nella dir ..\bin dell'installazione del Server (in Windows di solito c:\mysql\bin). Si tratta di una shell a linea di comando, quindi ci troveremo più o meno nella situazione in figura: Figura 5.10.1 Il Client MySql Per noi che abbiamo usato il DBase II la cosa è abbastanza familiare; per voi abituati alle interfacce grafiche potrebbe essere disorientante. Comunque non spaventatevi. La prima cosa da fare è selezionare il Db da usare quindi : use mediateca A questo punto possiamo scrivere qualunque comando SQL valido, con l'accortezza di terminare l'istruzione con un punto e virgola. Ad esempio : Figura 5.10.2 Il Comando Select 71 © 2005 Filippo Cerulo - Soft.Com Sas – Documento con Licenza Creative Commons - Rev 0.99 OpenOffice.org 2.0 & i Database - Database Server MySql Se premiamo INVIO senza chiudere con il punto e virgola, è possibile continuare la scrittura sulla riga successiva, il che è comodo perché molti statements SQL sono lunghi e complessi. Perciò : Figura 5.10.3 Ancora un Comando Select Con questo semplice tool possiamo passare al Server qualsiasi comando SQL. Per uscire, un semplice EXIT chiude le operazioni. Con un po' di pratica MYSQL Monitor (nome ufficiale del tool) si rivela abbastanza immediato e semplice da usare. In più, può accettare in input anche un file di testo comprendente più istruzioni SQL, quindi si rivela utile in molti casi. Esistono però varie alternative, come adesso vedremo. 5.11 Altri Tools Grafici per la gestione di MySql MySql Administrator, come abbiamo visto, è il nuovo strumento di amministrazione ufficiale per MySql. Sul sito www.mysql.com è comunque disponibile un altro Tool, e precisamente il Query Browser. Si tratta di un programma molto interessante orientato alla costruzione grafica di query SQL, non tanto nella maniera utilizzata in modalità Disegno di OOo, quanto nel supporto alla sintassi di TUTTI i comandi SQL (e quindi non solo delle SELECT). Inoltre dispone di uno strumento di scripting per la scrittura e l'esecuzione di Procedure SQL, anteprima di quello che sarà il supporto alle Stored procedure di MySQL 5.0. Altro programma da considerare è Db Manager Professional di Db Tools, scaricabile gratuitamente dal sito www.dbtools.com.br. Questo software permette di fare tutte le cose essenziali necessarie all'amministrazione di un Db in modo semplice con una Gui efficace e senza fronzoli. Inoltre può essere usato anche con server Postgres, quindi due piccioni.... Se proprio volete affrontare il mondo dei Db server da professionisti, quello che fa per voi allora è l'ottimo Fabforce Db Designer 4, un progetto OpenSource scaricabile da www.fabforce.net. Si tratta di un “disegnatore” di Database di alto livello, che concentra l'attenzione sulla struttura logica delle basi di dati, svincolandosi dal singolo motore di Db. Si interfaccia con MySql e con Oracle, ma anche con ODBC, quindi con quasi tutto. Tools dedicato a chi di Db è già esperto, e quindi sconsigliato ai deboli di cuore. 72 © 2005 Filippo Cerulo - Soft.Com Sas – Documento con Licenza Creative Commons - Rev 0.99