2. Tutorial su Firebird
Prima di affrontare le basi del linguaggio SQL, illustriamo al lettore come installare Firebird SGBD e il client grafico IB-Expert.
2.1. Dove trovare Firebird?
Il sito principale di Firebird è [http://firebird.sourceforge.net/]. La pagina dei download offre i seguenti link (aprile 2005):

Si scaricheranno i seguenti elementi:
SGBD per Windows | |
una libreria di classi per le applicazioni .NET che consente di accedere a SGBD senza passare attraverso un driver ODBC. | |
il driver ODBC di Firebird |
Eseguire l’installazione di questi elementi. Il driver SGBD viene installato in una cartella il cui contenuto è simile al seguente:
![]() |
I file binari si trovano nella cartella [bin]:
![]() |
consente di avviare/arrestare il SGBD | |
client in modalità terminale che consente di gestire i database |
Si noti che, per impostazione predefinita, l'amministratore di SGBD si chiama [SYSDBA] e la sua password è [masterkey]. In [Démarrer] sono stati installati i seguenti menu:

L'opzione [Firebird Guardian] consente di avviare/arrestare il SGBD. Dopo l'avvio, l'icona del SGBD rimane nella barra delle applicazioni di Windows:
![]() |
Per creare e gestire database Firebird con il client da riga di comando [isql.exe], è necessario consultare la documentazione fornita con il prodotto nella cartella [doc].
2.2. a la documentazione di Firebird
La documentazione su Firebird e sul linguaggio SQL è disponibile sul sito di Firebird (gennaio 2006):

Sono disponibili diversi manuali in inglese:
Per iniziare con FB | |
per comprendere i codici di errore restituiti da FB |
Sono disponibili anche manuali di formazione sul linguaggio SQL:

per scoprire come creare tabelle, quali tipi di dati sono utilizzabili, ... | |
la guida di riferimento per imparare SQL con Firebird |
Un modo rapido per lavorare con Firebird e imparare il linguaggio SQL è utilizzare un client grafico. Un esempio di tale client è IB-Expert, descritto nel paragrafo seguente.
2.3. Lavorare con Firebird SGBD grazie a IB- Expert
Il sito principale di IB-Expert è [http://www.ibexpert.com/]. La pagina dei download offre i seguenti link:

Sceglieremo la versione gratuita [Personal Edition]. Una volta scaricata e installata, si avrà a disposizione una cartella simile alla seguente:

Il file eseguibile è [ibexpert.exe]. Normalmente è disponibile un collegamento nel menu [Démarrer]:

Una volta avviato, IBExpert visualizza la seguente finestra:

Utilizziamo l'opzione [Database/Create Database] per creare un database:
potrebbe essere [local] o [remote]. In questo caso il nostro server si trova sulla stessa macchina di [IBExpert]. Scegliamo quindi [local] | |
utilizzare il pulsante di tipo [dossier] dal menu a tendina per indicare il file del database. Firebird inserisce l’intero database in un unico file. Questo è uno dei suoi punti di forza. Il database viene trasferito da una postazione all’altra semplicemente copiando il file. Il suffisso [.gdb] viene aggiunto automaticamente. | |
SYSDBA è l’amministratore predefinito delle attuali distribuzioni di Firebird | |
masterkey è la password dell'amministratore SYSDBA delle attuali distribuzioni di Firebird | |
il dialetto SQL da utilizzare | |
se la casella è spuntata, IBExpert mostrerà un link al database creato dopo averlo creato |
Se cliccando sul pulsante di creazione [OK] viene visualizzato il seguente avviso:

significa che non avete avviato Firebird. Avviatelo. Si aprirà una nuova finestra:

Famiglia di caratteri da utilizzare. Sebbene la schermata sopra riportata non fornisca alcuna informazione, si consiglia di selezionare dall'elenco a discesa la famiglia [ISO-8859-1], che consente di utilizzare i caratteri latini accentati. |
[IBExpert] è in grado di gestire diversi SGBD derivati da Interbase. Selezionare la versione di Firebird installata: |
Una volta confermata questa nuova finestra da [Register], si ottiene il seguente risultato:

Per accedere al database creato, è sufficiente fare doppio clic sul relativo collegamento. IBExpert visualizza quindi una struttura ad albero che consente di accedere alle proprietà del database:

2.4. Creazione di una tabella di dati
Creiamo una tabella. Facciamo clic con il tasto destro su [Tables] (vedi finestra sopra) e selezioniamo l’opzione [New Table]. Si apre la finestra di definizione delle proprietà della tabella:
![]() |
Iniziamo assegnando alla tabella il nome [ARTICLES] utilizzando il campo di immissione [1]:
![]() |
Utilizziamo il campo di immissione [2] per definire una chiave primaria [ID]:
![]() |
Per impostare un campo come chiave primaria, fare doppio clic sul campo [PK] (Primary Key). Aggiungiamo dei campi utilizzando il pulsante situato sopra [3]:

Finché non si «compila» la definizione, la tabella non viene creata. Utilizziamo il pulsante [Compile] qui sopra per completare la definizione della tabella. IBExpert prepara le query SQL per la generazione della tabella e richiede conferma:

È interessante notare che IBExpert visualizza le query SQL che ha eseguito. Ciò consente di apprendere sia il linguaggio SQL sia il dialetto SQL, eventualmente proprietario, utilizzato. Il pulsante [Commit] consente di confermare la transazione in corso, mentre [Rollback] di annullarla. In questo caso la si accetta con [Commit]. Una volta fatto ciò, IBExpert aggiunge la tabella creata alla struttura ad albero del nostro database:

Facendo doppio clic sulla tabella, si accede alle sue proprietà:

Il pannello [Constraints] ci permette di aggiungere nuovi vincoli di integrità alla tabella. Apriamolo:

Troviamo il vincolo di chiave primaria che abbiamo creato. È possibile aggiungere altri vincoli:
- chiavi esterne [Foreign Keys]
- vincoli di integrità dei campi [Checks]
- vincoli di unicità dei campi [Uniques]
Si noti che:
- i campi [ID, PRIX, STOCKACTUEL, STOKMINIMUM] devono essere >0
- il campo [NOM] deve essere non vuoto e univoco
Apriamo il pannello [Checks] e facciamo clic con il tasto destro del mouse nell'area di definizione dei vincoli per aggiungere un nuovo vincolo:

Definiamo i vincoli desiderati:

Si noti che il vincolo [NOM<>''] utilizza due apostrofi e non virgolette. Compiliamo questi vincoli utilizzando il pulsante [Compile] qui sopra:

Anche in questo caso, IBExpert fornisce informazioni utili indicando le query SQL che ha eseguito. Passiamo ora al pannello [Constraints/Uniques] per specificare che il nome deve essere univoco. Ciò significa che non è possibile avere due volte lo stesso nome nella tabella.

Definiamo il vincolo:

Quindi compiliamolo. Fatto ciò, apriamo il pannello [DDL] (Data Definition Language) della tabella [ARTICLES]:

Questo pannello fornisce il codice SQL per la generazione della tabella con tutti i suoi vincoli. È possibile salvare questo codice in uno script per riutilizzarlo in seguito:
SET SQL DIALECT 3;
SET NAMES NONE;
CREATE TABLE ARTICLES (
ID INTEGER NOT NULL,
NOM VARCHAR(20) NOT NULL,
PRIX DOUBLE PRECISION NOT NULL,
STOCKACTUEL INTEGER NOT NULL,
STOCKMINIMUM INTEGER NOT NULL
);
ALTER TABLE ARTICLES ADD CONSTRAINT CHK_ID check (ID>0);
ALTER TABLE ARTICLES ADD CONSTRAINT CHK_PRIX check (PRIX>0);
ALTER TABLE ARTICLES ADD CONSTRAINT CHK_STOCKACTUEL check (STOCKACTUEL>0);
ALTER TABLE ARTICLES ADD CONSTRAINT CHK_STOCKMINIMUM check (STOCKMINIMUM>0);
ALTER TABLE ARTICLES ADD CONSTRAINT CHK_NOM check (NOM<>'');
ALTER TABLE ARTICLES ADD CONSTRAINT UNQ_NOM UNIQUE (NOM);
ALTER TABLE ARTICLES ADD CONSTRAINT PK_ARTICLES PRIMARY KEY (ID);
2.5. Inserimento di dati in una tabella
È ora il momento di inserire i dati nella tabella [ARTICLES]. A tal fine, utilizziamo il relativo pannello [Data]:

I dati vengono inseriti facendo doppio clic sui campi di immissione di ciascuna riga della tabella. È possibile aggiungere una nuova riga con il pulsante [+], mentre per eliminare una riga si utilizza il pulsante [-]. Queste operazioni vengono eseguite all’interno di una transazione che viene confermata tramite il pulsante [Commit Transaction] (vedi sopra). Senza questa conferma, i dati andranno persi.
2.6. L'editor SQL di [IB-Expert]
Il linguaggio SQL (Structured Query Language) consente a un utente di:
- creare tabelle specificando il tipo di dati che andranno memorizzati e i vincoli che tali dati devono soddisfare
- inserirvi dei dati
- modificarne alcuni
- eliminarne altri
- sfruttarne il contenuto per ottenere informazioni
- ...
IBExpert consente a un utente di eseguire le operazioni da 1 a 4 in modo grafico. Lo abbiamo appena visto. Quando il database contiene numerose tabelle, ciascuna con centinaia di righe, sono necessarie informazioni difficili da ottenere visivamente. Supponiamo, ad esempio, che un negozio online abbia migliaia di acquirenti al mese. Tutti gli acquisti vengono registrati in un database. Dopo sei mesi, si scopre che un prodotto «X» è difettoso. Si desidera contattare tutte le persone che lo hanno acquistato affinché restituiscano il prodotto per una sostituzione gratuita. Come trovare gli indirizzi di questi acquirenti?
- Si potrebbero consultare visivamente tutte le tabelle e cercare questi acquirenti. Ciò richiederebbe alcune ore.
- Si può eseguire un comando SQL che fornirà l’elenco di queste persone in pochi secondi
Il linguaggio SQL è utile non appena
- quando la quantità di dati nelle tabelle è elevata
- quando ci sono molte tabelle collegate tra loro
- quando le informazioni da ottenere sono distribuite su più tabelle
- ...
Presentiamo ora l’editor SQL di IBExpert. È accessibile tramite l’opzione [Tools/SQL Editor] o [F12]:

Si accede così a un editor di query avanzato SQL con cui è possibile sperimentare le query. Digitiamo una query:

Eseguiamo la query SQL utilizzando il pulsante [Execute] qui sopra. Otteniamo il seguente risultato:

Sopra, la scheda [Results] mostra la tabella dei risultati dell’ordine SQL [Select]. Per emettere un nuovo ordine SQL, è sufficiente tornare alla scheda [Edit]. Si ritrova quindi l’ordine SQL che è stato eseguito.
![]()
Diversi pulsanti della barra degli strumenti sono utili:
- il pulsante [New Query] consente di passare a una nuova richiesta SQL:

Si ottiene quindi una pagina di modifica vuota:

A questo punto è possibile digitare un nuovo comando SQL:

ed eseguirlo:

Torniamo alla scheda [Edit]. I vari comandi SQL emessi vengono memorizzati da [IB-xpert]. Il pulsante [Previous Query] consente di tornare a un ordine SQL emesso in precedenza:

Si torna quindi alla richiesta precedente:

Il pulsante [Next Query] consente invece di passare all’ordine successivo SQL:

Si trova quindi l'ordine SQL, che segue nell'elenco degli ordini SQL memorizzati:

Il pulsante [Delete Query] consente di eliminare un ordine SQL dall’elenco degli ordini memorizzati:

Il pulsante [Clear Current Query] consente di cancellare il contenuto dell'editor relativo all'ordine SQL visualizzato:

Il pulsante [Commit] consente di confermare definitivamente le modifiche apportate al database:

Il pulsante [RollBack] consente di annullare le modifiche apportate al database dall'ultimo [Commit]. Se non è stato eseguito alcun [Commit] dal momento della connessione al database, vengono annullate le modifiche apportate a partire da tale connessione.

Facciamo un esempio. Inseriamo una nuova riga nella tabella:
![]()
Il comando SQL viene eseguito, ma non viene visualizzato nulla. Non è possibile sapere se l’inserimento sia avvenuto. Per verificarlo, eseguiamo il comando SQL dopo [New Query]:

Si ottiene il seguente risultato con [Execute]:

La riga è stata quindi inserita correttamente. Esaminiamo ora il contenuto della tabella in un altro modo. Facciamo doppio clic sulla tabella [ARTICLES] nell’esploratore di database:

Si ottiene la seguente tabella:

Il pulsante con la freccia qui sopra permette di aggiornare la tabella. Dopo l’aggiornamento, la tabella qui sopra non cambia. Sembra che la nuova riga non sia stata inserita. Torniamo all’editor SQL (F12), quindi confermiamo l’ordine SQL emesso con il pulsante [Commit]:

Fatto ciò, torniamo alla tabella [ARTICLES]. Possiamo constatare che nulla è cambiato anche utilizzando il pulsante [Refresh]:

Ora apriamo la scheda [Fields], quindi torniamo alla scheda [Data]. Questa volta la riga inserita appare correttamente:

Quando inizia l’esecuzione dei vari comandi SQL, l’editor apre quella che viene definita una transazione sul database. Le modifiche apportate da questi comandi SQL dell’editor SQL saranno visibili solo finché si rimane nello stesso editor SQL (è possibile aprirne diversi). È come se l’editor SQL non lavorasse sul database reale, ma su una propria copia. In realtà, non è esattamente così che avviene, ma questa immagine può aiutarci a comprendere il concetto di transazione. Tutte le modifiche apportate alla copia nel corso di una transazione saranno visibili nel database reale solo dopo essere state confermate da un [Commit Transaction]. La transazione in corso viene quindi conclusa e ne inizia una nuova.
Le modifiche apportate nel corso di una transazione possono essere annullate tramite un’operazione denominata [Rollback]. Facciamo il seguente esperimento. Avviamo una nuova transazione (è sufficiente eseguire [Commit] sulla transazione corrente) con il seguente comando SQL:

Eseguiamo questo comando, che elimina tutte le righe della tabella [ARTICLES], quindi eseguiamo [New Query], il nuovo comando SQL, come segue:

Otteniamo il seguente risultato:

Tutte le righe sono state eliminate. Ricordiamo che l’operazione è stata eseguita su una copia della tabella [ARTICLES]. Per verificarlo, facciamo doppio clic sulla tabella [ARTICLES] qui sotto:

e visualizziamo la scheda [Data]:

Anche utilizzando il pulsante [Refresh] o passando alla scheda [Fields] per poi tornare alla scheda [Data], il contenuto sopra riportato rimane invariato. Questo è stato già spiegato. Ci troviamo in un’altra transazione che opera su una propria copia. Ora torniamo all’editor SQL (F12) e utilizziamo il pulsante [RollBack] per annullare le eliminazioni di righe effettuate:

Viene richiesta una conferma:

Confermiamo. L’editor SQL conferma che le modifiche sono state annullate:

Ripetiamo la richiesta SQL sopra riportata per verificare. Ritroviamo le righe che erano state eliminate:

L'operazione [Rollback] ha riportato la copia su cui sta lavorando l'editor SQL allo stato in cui si trovava all'inizio della transazione.





