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

Dovrai scaricare i seguenti elementi:
il DBMS per Windows | |
una libreria di classi per applicazioni .NET che consente l'accesso al DBMS senza utilizzare un driver ODBC. | |
il driver ODBC di Firebird |
Installare questi componenti. Il DBMS viene installato in una cartella con contenuti simili ai seguenti:
![]() |
I file binari si trovano nella cartella [bin]:
![]() |
consente di avviare/arrestare il DBMS | |
client a riga di comando per la gestione dei database |
Si noti che, per impostazione predefinita, l'amministratore del DBMS si chiama [SYSDBA] e la password è [masterkey]. Sono stati aggiunti dei menu a [Start]:

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

Sono disponibili vari manuali in inglese:
per iniziare con FB | |
per comprendere i codici di errore restituiti da FB |
Sono disponibili anche manuali di formazione su SQL:

per imparare a creare tabelle, quali tipi di dati sono disponibili, ... | |
la guida di riferimento per imparare SQL con Firebird |
Un modo rapido per lavorare con Firebird e imparare SQL è utilizzare un client grafico. Uno di questi client è IB-Expert, descritto nella sezione seguente.
2.3. Lavorare con il DBMS Firebird utilizzando IB- Expert
Il sito web principale di IB-Expert è [http://www.ibexpert.com/]. La pagina dei download offre i seguenti link:

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

Il file eseguibile è [ibexpert.exe]. Normalmente nel menu [Start] è presente un collegamento:

Una volta avviato, IBExpert visualizza la seguente finestra:

Utilizzare l'opzione [ Database/Create Database] per creare un database:
può essere [local] o [remote]. In questo caso, il nostro server si trova sulla stessa macchina di [IBExpert]. Selezioniamo quindi [local] | |
Utilizza il pulsante [cartella] nel menu a tendina per selezionare il file del database. Firebird memorizza l’intero database in un unico file. Questo è uno dei suoi vantaggi. Puoi trasferire il database da un computer all’altro semplicemente copiando il file. Il suffisso [.gdb] viene aggiunto automaticamente. | |
SYSDBA è l'amministratore predefinito per le attuali distribuzioni di Firebird | |
masterkey è la password dell'amministratore SYSDBA nelle attuali distribuzioni di Firebird | |
Il dialetto SQL da utilizzare | |
Se questa casella è selezionata, IBExpert visualizzerà un collegamento al database dopo che è stato creato |
Se, quando si fa clic sul pulsante [OK] per creare il database, viene visualizzato il seguente avviso:

significa che non hai avviato Firebird. Avvialo. Apparirà una nuova finestra:

Set di caratteri da utilizzare. Sebbene la schermata sopra riportata non mostri alcuna informazione, si consiglia di selezionare il set [ISO-8859-1] dall'elenco a discesa, che consente l'uso di caratteri latini accentati. |
[IBExpert] è in grado di gestire vari DBMS derivati da Interbase. Selezionare la versione di Firebird installata: |
Una volta confermata questa nuova finestra cliccando su [Registra], vedrai il seguente risultato:

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

2.4. Creazione di una tabella dati
Creiamo una tabella. Fai clic con il tasto destro del mouse su [Tabelle] (vedi finestra sopra) e seleziona l'opzione [Nuova tabella]. Si aprirà la finestra per definire le proprietà della tabella:
![]() |
Iniziamo assegnando alla tabella il nome [ARTICLES] utilizzando il campo di immissione [1]:
![]() |
Utilizza il campo di immissione [2] per definire una chiave primaria [ID]:
![]() |
Per impostare un campo come chiave primaria, fare doppio clic sul campo [PK] (Chiave primaria). Aggiungiamo dei campi utilizzando il pulsante in alto [3]:

Finché non abbiamo "compilato" la nostra definizione, la tabella non viene creata. Utilizza il pulsante [Compila] in alto per finalizzare la definizione della tabella. IBExpert prepara le query SQL per generare la tabella e chiede conferma:

È interessante notare che IBExpert visualizza le query SQL che ha eseguito. Ciò consente di apprendere sia il linguaggio SQL che eventuali dialetti SQL proprietari che potrebbero essere utilizzati. Il pulsante [Commit] convalida la transazione corrente, mentre [Rollback] la annulla. In questo caso, la accettiamo cliccando su [Commit]. Una volta fatto ciò, IBExpert aggiunge la tabella creata alla nostra struttura ad albero del database:

Facendo doppio clic sulla tabella, possiamo accedere alle sue proprietà:

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

Vediamo il vincolo di chiave primaria che abbiamo creato. Possiamo aggiungere altri vincoli:
- chiavi esterne [Foreign Keys]
- vincoli di integrità dei campi [Controlli]
- vincoli di unicità dei campi [Uniques]
Specifichiamo che:
- i campi [ID, PRICE, CURRENTSTOCK, MINIMUMSTOCK] devono essere >0
- il campo [NAME] deve essere non vuoto e univoco
Apri il pannello [Controlli] e fai clic con il pulsante destro del mouse nell'area di definizione dei vincoli per aggiungere un nuovo vincolo:

Definiamo i vincoli desiderati:

Si noti che il vincolo [NAME<>''] utilizza due virgolette singole, non doppie. Compilare questi vincoli utilizzando il pulsante [Compila] in alto:

Ancora una volta, IBExpert dimostra la sua facilità d'uso visualizzando le query SQL che ha eseguito. Passiamo ora al pannello [Constraints/Unique] per specificare che il nome deve essere univoco. Ciò significa che lo stesso nome non può apparire due volte nella tabella.

Definiamo il vincolo:

Quindi compiliamolo. Una volta fatto ciò, apriamo il pannello [DDL] (Data Definition Language) per la tabella [ARTICLES]:

Questo pannello mostra il codice SQL per generare la tabella con tutti i suoi vincoli. Puoi salvare questo codice in uno script per eseguirlo in un secondo momento:
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 dei dati in una tabella
È ora il momento di inserire i dati nella tabella [ARTICLES]. Per farlo, utilizzare il pannello [Dati]:

I dati vengono inseriti facendo doppio clic sui campi di immissione di ciascuna riga della tabella. Una nuova riga viene aggiunta utilizzando il pulsante [+], mentre una riga viene eliminata utilizzando il pulsante [-]. Queste operazioni vengono eseguite all'interno di una transazione che viene confermata utilizzando il pulsante [Commit Transaction] (vedi sopra). Senza questa conferma, i dati andranno persi.
2.6. L'editor SQL [IB-Expert]
Il linguaggio SQL (Structured Query Language) consente all'utente di:
- creare tabelle specificando il tipo di dati che conterranno e i vincoli che i dati devono soddisfare
- inserire dati al loro interno
- modificare determinati dati
- eliminare altri dati
- utilizzare i dati per recuperare informazioni
- ...
IBExpert consente agli utenti di eseguire le operazioni da 1 a 4 in modo grafico. Lo abbiamo appena visto. Quando il database contiene molte tabelle, ciascuna con centinaia di righe, abbiamo bisogno di informazioni difficili da ottenere visivamente. Supponiamo, ad esempio, che un negozio online abbia migliaia di clienti al mese. Tutti gli acquisti vengono registrati in un database. Dopo sei mesi, si scopre che il prodotto "X" è difettoso. Il negozio vuole contattare tutti coloro che lo hanno acquistato in modo che possano restituire il prodotto per una sostituzione gratuita. Come si possono trovare gli indirizzi di questi acquirenti?
- Si potrebbero esaminare manualmente tutte le tabelle e cercare questi acquirenti. Ciò richiederebbe alcune ore.
- Possiamo eseguire una query SQL che restituirà un elenco di queste persone in pochi secondi
SQL è utile ogni volta che
- la quantità di dati nelle tabelle è elevata
- ci sono molte tabelle collegate tra loro
- le informazioni da recuperare sono distribuite su più tabelle
- ...
Ora presenteremo l'Editor SQL di IBExpert. È possibile accedervi tramite l'opzione [Strumenti/Editor SQL] o premendo [F12]:

Questo vi dà accesso a un editor avanzato di query SQL dove potete eseguire le query. Digitiamo una query:

Esegui la query SQL utilizzando il pulsante [Esegui] in alto. Otterrai il seguente risultato:

Sopra, la scheda [Risultati] mostra la tabella dei risultati per l'istruzione SQL [Select]. Per emettere un nuovo comando SQL, basta tornare alla scheda [Modifica]. Vedrai quindi l'istruzione SQL che è stata eseguita.
![]()
Diversi pulsanti sulla barra degli strumenti sono utili:
- Il pulsante [Nuova query] consente di passare a una nuova query SQL:

Questo fa apparire una pagina di modifica vuota:

È quindi possibile digitare una nuova istruzione SQL:

ed eseguirla:

Torniamo alla scheda [Modifica]. Le varie istruzioni SQL eseguite vengono memorizzate da [IB-xpert]. Il pulsante [Query precedente] consente di tornare a un'istruzione SQL eseguita in precedenza:

Si torna quindi alla query precedente:

Il pulsante [Query successiva] consente di passare all'istruzione SQL successiva:

Verrà quindi visualizzata l'istruzione SQL successiva nell'elenco delle istruzioni SQL memorizzate:

Il pulsante [Elimina query] consente di eliminare un'istruzione SQL dall'elenco delle istruzioni memorizzate:

Il pulsante [Cancella query corrente] cancella il contenuto dell'editor relativo alla query SQL visualizzata:

Il pulsante [Conferma] consente di salvare in modo permanente 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 quella connessione.

Vediamo un esempio. Inseriamo una nuova riga nella tabella:
![]()
L'istruzione SQL viene eseguita ma non viene visualizzato nulla. Non sappiamo se l'inserimento sia avvenuto. Per scoprirlo, eseguiamo la seguente istruzione SQL [Nuova query]:

Otteniamo il seguente risultato:

La riga è stata effettivamente inserita. Esaminiamo ora il contenuto della tabella in un altro modo. Facciamo doppio clic sulla tabella [ARTICLES] nell'esploratore del database:

Otteniamo la seguente tabella:

Il pulsante con la freccia in alto consente di aggiornare la tabella. Dopo l'aggiornamento, la tabella sopra non cambia. Sembra che la nuova riga non sia stata inserita. Torniamo all'editor SQL (F12) e poi confermiamo l'istruzione SQL utilizzando il pulsante [Commit]:

Una volta fatto ciò, torniamo alla tabella [ARTICLES]. Possiamo vedere che nulla è cambiato, anche utilizzando il pulsante [Refresh]:

In alto, apri la scheda [Fields], quindi torna alla scheda [Data]. Questa volta, la riga inserita appare correttamente:

Quando inizia l'esecuzione delle varie istruzioni SQL, l'editor apre quella che viene chiamata una transazione sul database. Le modifiche apportate da queste istruzioni SQL nell'editor SQL saranno visibili solo finché rimani nello stesso editor SQL (puoi aprire più istanze). È come se l'editor SQL non lavorasse sul database vero e proprio, ma su una sua copia. In realtà, non è esattamente così che funziona, ma questa analogia può aiutarci a comprendere il concetto di transazione. Tutte le modifiche apportate alla copia durante una transazione saranno visibili nel database effettivo solo dopo che saranno state confermate tramite un [Commit Transaction]. La transazione corrente viene quindi terminata e ne inizia una nuova.
Le modifiche apportate durante una transazione possono essere annullate tramite un'operazione chiamata [Rollback]. Proviamo il seguente esperimento. Avviamo una nuova transazione (semplicemente [Commit] la transazione corrente) con la seguente istruzione SQL:

Eseguiamo questo comando, che elimina tutte le righe dalla tabella [ARTICLES], quindi eseguiamo [New Query] con il seguente nuovo comando SQL:

Otteniamo il seguente risultato:

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

e visualizza la scheda [Dati]:

Anche se utilizziamo il pulsante [Aggiorna] o passiamo alla scheda [Campi] e poi torniamo alla scheda [Dati], il contenuto sopra rimane invariato. Questo è stato 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:

Ci viene richiesta una conferma:

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

Eseguiamo nuovamente la query SQL sopra riportata per verificare. Le righe che erano state eliminate sono ora tornate:

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





