mysqld --user=root --default-storage-engine=InnoDB(A seconda della versione di MySQL utilizzata, potrebbe essere necessario sostituire il comando "mysqld" con "mysqld-nt"). In questo modo viene avviato MySQL Server, utilizzando il suo sottosistema transazionale che si chiama InnoDB. Anche se in questa esercitazione non imposteremo esplicitamente delle transazioni e non ci occuperemo dei livelli di isolamento, è bene che si usi il sottosistema transazionale, perchè questo controlla che i dati che andremo ad inserire nella base di dati creata soddisfino i vincoli di foreign key che definiremo. Al contrario, gli storage engine MyISAM e Memory non garantiscono il soddisfacimento dei vincoli di foreign key. Si noti che è possibile configurare MySQL in modo che lo storage engine di default sia InnoDB. In questo caso è sufficiente usare il comando
mysqld --user root per effettuare la
connessione (per ulteriori dettagli sull'argomento si rimanda alla
documentazione di MySQL).mysqld
--user root è sufficiente nel caso in cui per
l'utente root non si sia impostata una password. Altrimenti, si deve
eseguire il comando mysqld --user=root --password,
a seguito del quale verrà richiesto l'inserimento della
password.CREATE DATABASE EX_DB;
In questo modo avrete creato una nuova base di dati
chiamata EX_DB. Contestualmente,
verrà creata una cartella chiamata EX_DB
nella directory <MySQLParent>\MySQL\MySQL
Server 5.0\data. Questa cartella contiene fisicamente
tutto il database. Verificate che la creazione sia avenuta con successo
eseguendo il comandoNota1: Si noti che il ;
è utilizzato come delimitatore dei comandi. E' possibile
anche cambiare tale delimitatore, ed in alcuni casi può
risultare comodo. Vedremo in seguito come e quando cambiarlo.
(Se volete chiudere la connessione con la base dati ed
uscire dall'inteprete dei comandi eseguite il comando quit;)
Nota2: Per cancellare un database si
può eseguire il comando DROP DATABASE
<nomeDB>;
EX_USER con
password EX_PW tramite il comando CREATE USER EX_USER IDENTIFIED BY 'EX_PW';
mysql.user,
proiettando sui suoi attributi Host, User, e Password.+-----------+---------+-------------------------------------------+Si noti che la password è criptata.
| Host | User | Password |
| | | |
+-----------+---------+-------------------------------------------+
| localhost | root | |
| % | EX_USER | *3ACE26AF0027B2065C57DC8D2007B41FD38A4EE5 |
+-----------+---------+-------------------------------------------+
Nota: La colonna Host
contiene il riferimento alla macchina da cui l'utente può
connettersi. Di default viene inserito il simbolo %,
che indica che l'utente può connettersi da qualunque
locazione. localhost permette invece
all'utente di connettersi solo in locale, mentre 151.100.16.50,
ad esempio, permetterebbe all'utente di connettersi da remoto tramite
l'indirizzo IP 151.100.16.50. Per modificare
esplicitamente il campo Host conviene operare
direttamente sulla tabella mysql.user. Ad
esempio, per creare l'utente mario con
password elvisrules che può
connettersi solo in locale, si può eseguire il seguente
comando:
insert into mysql.user(host, user, password,
ssl_cipher, ssl_type, x509_issuer, x509_subject)
values ('localhost','mario','elvisrules','','','','');
I campi ssl_cipher, ssl_type, x509_issuer
e x509_subject
non hanno un valore di default e vanno pertanto specificati nella query
di inserimento (per le finalità del corso, possiamo lasciare
semplicemente in bianco tali campi). Per vedere tutte le colonne della
tabella mysql.user, eseguite il comando describe
mysql.user; (ridefinite le dimensioni della finestra di
prompt per vedere in maniera chiara il risultato restituito da MySQL).
Si noti che i campi Host e User
formano la chiave primaria della tabella. Un utente può
essere cancellato cancellando la corrispondente tupla nella
tabella mysql.user. (una volta
cancellato l'utente bisogna eseguire il comando FLUSH
PRIVILEGES; perchè la modifica abbia realmente
effetto)
Una volta creato l'utente EX_USER occorre
assegnargli i privilegi (altrimenti non è in grado di fare
nulla). Procedete come segue.
EX_DB
eseguendo il comandouse EX_DB;EX_TAB, con la
sola colonna EX_ATT di tipo intero; EX_TAB,
contenente il valore 1; EX_TAB tramite
il comando GRANT SELECT ON EX_TAB TO EX_USER;
Quit
e riconnetetevi alla stessa con l'utente EX_USER, ponendovi
poi nel contesto del database EX_DB
EX_TAB tramite
la seguente query SELECT * FROM EX_TAB;
+--------+
| EX_ATT |
+--------+
| 1 |
+--------+
1 row in set (0.00 sec)
EX_TAB
Cosa risponde il DBMS? root. E' possibile
ora assegnare altri privilegi all'utente EX_USER.
Ad esempio, per assegnare a EX_USER tutti i
privilegi di utilizzo su tutte le tabelle del database EX_DB,
occorre eseguire l'istruzione seguente: GRANT
SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER,CREATE VIEW ON EX_DB.* TO
'EX_USER'@'%' IDENTIFIED BY 'EX_PW';
FLUSH PRIVILEGES; EX_DB
tutti i privilegi
(compresi quelli da super user, cioè i privilegi di un
utente
che può assegnare a sua volta privilegi ad altri utenti)
occorre
eseguire l'istruzione seguente: GRANT ALL PRIVILEGES ON *.* TO 'EX_USER'@'%'
IDENTIFIED BY 'EX_PW' WITH GRANT OPTION;
assegnati i diritti, occorre poi che il server
ricarichi la tabella dei privilegi tramite la seguente istruzione: FLUSH PRIVILEGES; EX_SCHEMA, e le
tabelle in esso
contenute
EX_DB
tramite l'utente EX_USER. LIBRO,
contenente i seguenti attributi:ID_LIBRO (stringa di 10
caratteri, chiave primaria); ID_UTENTE_PROPRIETARIO
(stringa di 8 caratteri); TITOLO (stringa; non nullo); AUTORI (stringa con AA.VV.
come valore di default);ISBN (stringa di 16 caratteri);NUM_PAGINE (intero);ID_LIBRO (stringa di 10
caratteri; non nulla); DATA_INIZIO (non nulla); DATA_FINE; ID_UTENTE_RICHIEDENTE (stringa
di 8 caratteri);UTENTE, contenente
i seguenti attributiID_UTENTE (stringa di 8
caratteri; chiave primaria); NOMINATIVO (stringa; non
nulla); DATA_NASCITA (non nulla); RECAPITO_TEL (stringa; non
nulla); INDIRIZZO_EMAIL (stringa); EX_DB.
Nota: Per scrivere le istruzioni SQL, potete procedere direttamente da riga di comando una volta connessi al database tramite MSQL, oppure utilizzare un qualsiasi editor di testo (ad esempio Notepad). Se scegliete la seconda opzione, una volta scritto il codice salvatelo su un file, ad esempio c:\EsercitazionePBD\db\create-db.sql, e richiamate lo script così creato all'interno dell'ambiente MSQL tramite il comando
source c:\EsercitazionePBD\db\create-db.sql
Ogni volta che viene usato il comando source, vengono eseguite tutte le istruzioni contenute nel file. Quindi se volete usare sempre lo stesso file, per memorizzare le istruzioni SQL da sottomettere a MySQL, dovete di volta in volta cancellare le istruzioni che sono già state eseguite.
Per verificare di aver effettivamente creato le tabelle, eseguite la seguente interrogazione
show tables;che interroga (sugli attributi OWNER e TABLE_NAME) la tabella di catalogo all_tables che memorizza informazioni su tutte le tabelle della base di dati. Il risultato dell'interrogazione è
+-----------------+
| Tables_in_ex_db |
+-----------------+
| libro |
| prestito |
| utente |
+-----------------+
fornire le istruzioni SQL per creare le seguenti viste:.
Per scrivere ed eseguire le istruzioni SQL relative alle interrogazioni procedete come al punto precedente.
Per verificare la correttezza delle proprie soluzioni, popolate la base di dati con il file load-db.sql, e confrontate i risultati ottenuti interrogando le viste con quelli contenuti nel file esercizio4-ris.txt. Per popolare la base di dati, copiate il file load-db.sql nella cartella c:\EsercitazionePBD\db, ed eseguite il comando
source c:\EsercitazionePBD\db\load-db.sql