2. Tutorial do Firebird
Antes de abordarmos os conceitos básicos da linguagem SQL, vamos mostrar ao leitor como instalar o SGBD Firebird, bem como o cliente gráfico IB-Expert.
2.1. Onde encontrar o Firebird?
O site principal do Firebird é [http://firebird.sourceforge.net/]. A página de downloads disponibiliza as seguintes ligações (abril de 2005):

Irá descarregar os seguintes itens:
o SGBD para Windows | |
uma biblioteca de classes para aplicações .NET que permite o acesso ao SGBD sem utilizar um controlador ODBC. | |
o controlador ODBC do Firebird |
Instale estes componentes. O SGBD é instalado numa pasta com um conteúdo semelhante ao seguinte:
![]() |
Os ficheiros binários encontram-se na pasta [bin]:
![]() |
permite iniciar/parar o SGBD | |
cliente de linha de comandos para a gestão de bases de dados |
Note que, por predefinição, o administrador do SGBD é denominado [SYSDBA] e a palavra-passe é [masterkey]. Foram adicionados menus ao [Iniciar]:

A opção [Firebird Guardian] permite iniciar/parar o SGBD. Após o arranque, o ícone do SGBD permanece na barra de tarefas do Windows:
![]() |
Para criar e gerir bases de dados Firebird utilizando o cliente de linha de comandos [isql.exe], deve ler a documentação incluída com o produto na pasta [doc].
2.2. Documentação do Firebird
A documentação sobre o Firebird e a linguagem SQL pode ser encontrada no site do Firebird (janeiro de 2006):

Estão disponíveis vários manuais em inglês:
para começar a utilizar o FB | |
para compreender os códigos de erro devolvidos pelo FB |
Estão também disponíveis manuais de formação sobre SQL:

para saber como criar tabelas, quais os tipos de dados disponíveis, ... | |
o guia de referência para aprender SQL com o Firebird |
Uma forma rápida de trabalhar com o Firebird e aprender SQL é utilizar um cliente gráfico. Um desses clientes é o IB-Expert, descrito na secção seguinte.
2.3. Trabalhar com o SGBD Firebird utilizando o IB- Expert
O site principal do IB-Expert é [http://www.ibexpert.com/]. A página de downloads disponibiliza os seguintes links:

Selecione a versão gratuita [Personal Edition]. Após o download e a instalação, terá uma pasta semelhante à seguinte:

O ficheiro executável é [ibexpert.exe]. Normalmente, existe um atalho disponível no menu [Iniciar]:

Uma vez iniciado, o IBExpert apresenta a seguinte janela:

Utilize a opção [ ar base de dados/Criar base de dados] para criar uma base de dados:
pode ser [local] ou [remoto]. Aqui, o nosso servidor está na mesma máquina que o [IBExpert]. Por isso, selecionamos [local] | |
Utilize o botão [pasta] no menu suspenso para selecionar o ficheiro da base de dados. O Firebird armazena toda a base de dados num único ficheiro. Esta é uma das suas vantagens. Pode transferir a base de dados de um computador para outro simplesmente copiando o ficheiro. A extensão [.gdb] é adicionada automaticamente. | |
SYSDBA é o administrador predefinido nas distribuições atuais do Firebird | |
masterkey é a palavra-passe do administrador SYSDBA nas distribuições atuais do Firebird | |
O dialeto SQL a utilizar | |
Se esta caixa estiver marcada, o IBExpert exibirá um link para a base de dados após a sua criação |
Se, ao clicar no botão [OK] para criar a base de dados, aparecer o seguinte aviso:

isso significa que ainda não iniciou o Firebird. Inicie-o. Aparecerá uma nova janela:

Conjunto de caracteres a utilizar. Embora a captura de ecrã acima não mostre qualquer informação, recomenda-se selecionar o conjunto [ISO-8859-1] na lista suspensa, o que permite a utilização de caracteres latinos acentuados. |
O [IBExpert] é compatível com vários SGBDs derivados do Interbase. Selecione a versão do Firebird que tem instalada: |
Depois de confirmar esta nova janela clicando em [Registar], verá o seguinte resultado:

Para aceder à base de dados que criou, basta clicar duas vezes no respetivo link. O IBExpert apresentará então uma árvore de navegação que permite aceder às propriedades da base de dados:

2.4. Criação de uma tabela de dados
Vamos criar uma tabela. Clique com o botão direito do rato em [Tabelas] (ver janela acima) e selecione a opção [Nova Tabela]. Isto abre a janela para definir as propriedades da tabela:
![]() |
Vamos começar por nomear a tabela [ARTIGOS] utilizando o campo de entrada [1]:
![]() |
Utilize o campo de entrada [2] para definir uma chave primária [ID]:
![]() |
Um campo torna-se uma chave primária ao clicar duas vezes no campo [PK] (Chave Primária). Vamos adicionar campos utilizando o botão acima [3]:

Enquanto não tivermos «compilado» a nossa definição, a tabela não é criada. Utilize o botão [Compile] acima para finalizar a definição da tabela. O IBExpert prepara as consultas SQL para gerar a tabela e solicita confirmação:

Curiosamente, o IBExpert exibe as consultas SQL que executou. Isto permite-lhe aprender tanto a linguagem SQL como qualquer dialeto SQL proprietário que possa ser utilizado. O botão [Confirmar] valida a transação atual, enquanto [Anular] a cancela. Aqui, aceitamo-la clicando em [Confirmar]. Assim que isto estiver feito, o IBExpert adiciona a tabela criada à nossa árvore de bases de dados:

Ao clicar duas vezes na tabela, podemos aceder às suas propriedades:

O painel [Constraints] permite-nos adicionar novas restrições de integridade à tabela. Vamos abri-lo:

Vemos a restrição de chave primária que criámos. Podemos adicionar outras restrições:
- chaves estrangeiras [Chaves Estrangeiras]
- restrições de integridade de campo [Verificações]
- restrições de exclusividade de campo [Uniques]
Vamos especificar que:
- os campos [ID, PRICE, CURRENTSTOCK, MINIMUMSTOCK] devem ser >0
- o campo [NAME] deve ser diferente de vazio e único
Abra o painel [Verificações] e clique com o botão direito do rato na área de definição de restrições para adicionar uma nova restrição:

Vamos definir as restrições desejadas:

Note-se acima que a restrição [NAME<>''] utiliza duas aspas simples, e não aspas duplas. Compile estas restrições utilizando o botão [Compilar] acima:

Mais uma vez, o IBExpert demonstra a sua facilidade de utilização ao apresentar as consultas SQL que executou. Passemos agora ao painel [Constraints/Unique] para especificar que o nome deve ser único. Isto significa que o mesmo nome não pode aparecer duas vezes na tabela.

Vamos definir a restrição:

Depois, vamos compilá-la. Assim que estiver feito, abra o painel [DDL] (Data Definition Language) para a tabela [ARTICLES]:

Este painel exibe o código SQL para gerar a tabela com todas as suas restrições. Pode guardar este código num script para o executar mais tarde:
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. Inserir dados numa tabela
Chegou a hora de inserir dados na tabela [ARTICLES]. Para isso, utilize o painel [Data]:

Os dados são introduzidos clicando duas vezes nos campos de entrada de cada linha da tabela. Uma nova linha é adicionada utilizando o botão [+] e uma linha é eliminada utilizando o botão [-]. Estas operações são realizadas no âmbito de uma transação que é confirmada através do botão [Confirmar Transação] (ver acima). Sem esta confirmação, os dados serão perdidos.
2.6. O Editor SQL do [IB-Expert]
O SQL (Structured Query Language) permite ao utilizador:
- criar tabelas, especificando o tipo de dados que irão armazenar e as restrições que os dados devem satisfazer
- inserir dados nessas tabelas
- modificar determinados dados
- eliminar outros dados
- utilizar os dados para recuperar informações
- ...
O IBExpert permite aos utilizadores realizar as operações 1 a 4 graficamente. Acabámos de ver isso. Quando a base de dados contém muitas tabelas, cada uma com centenas de linhas, precisamos de informações que são difíceis de obter visualmente. Suponha, por exemplo, que uma loja online tem milhares de clientes por mês. Todas as compras são registadas numa base de dados. Após seis meses, descobre-se que o produto «X» está com defeito. A loja quer contactar todos os que o compraram para que possam devolver o produto para uma troca gratuita. Como é que se podem encontrar os endereços destes compradores?
- Poderíamos percorrer manualmente todas as tabelas e procurar esses compradores. Isso levaria algumas horas.
- Podemos executar uma consulta SQL que irá devolver uma lista dessas pessoas em questão de segundos
O SQL é útil sempre que
- a quantidade de dados nas tabelas for grande
- existirem muitas tabelas interligadas
- as informações a recuperar estiverem espalhadas por várias tabelas
- ...
Vamos agora apresentar o Editor SQL do IBExpert. Pode aceder-se a ele através da opção [Ferramentas/Editor SQL] ou premindo [F12]:

Isto dá-lhe acesso a um editor avançado de consultas SQL, onde pode executar consultas. Vamos escrever uma consulta:

Execute a consulta SQL utilizando o botão [Executar] acima. Obterá o seguinte resultado:

Acima, o separador [Resultados] apresenta a tabela de resultados para a instrução SQL [Selecionar]. Para emitir um novo comando SQL, basta regressar ao separador [Editar]. Verá então a instrução SQL que foi executada.
![]()
Vários botões na barra de ferramentas são úteis:
- O botão [Nova consulta] permite-lhe avançar para uma nova consulta SQL:

Isto abre uma página de edição em branco:

Pode então digitar uma nova instrução SQL:

e executá-la:

Voltemos ao separador [Editar]. As várias instruções SQL emitidas são armazenadas pelo [IB-xpert]. O botão [Consulta anterior] permite-lhe voltar a uma instrução SQL emitida anteriormente:

Será então redirecionado para a consulta anterior:

O botão [Next Query] permite-lhe avançar para a instrução SQL seguinte:

Verá então a instrução SQL seguinte na lista de instruções SQL armazenadas:

O botão [Eliminar consulta] permite-lhe eliminar uma instrução SQL da lista de instruções guardadas:

O botão [Limpar consulta atual] limpa o conteúdo do editor da consulta SQL apresentada:

O botão [Confirmar] permite guardar permanentemente as alterações feitas na base de dados:

O botão [Reverter] permite anular as alterações feitas na base de dados desde a última [Confirmação]. Se não tiver sido feita nenhuma [Confirmação] desde a ligação à base de dados, as alterações feitas desde essa ligação serão anuladas.

Vejamos um exemplo. Vamos inserir uma nova linha na tabela:
![]()
A instrução SQL é executada, mas nada é exibido. Não sabemos se a inserção ocorreu. Para descobrir, vamos executar a seguinte instrução SQL [Nova consulta]:

Obtemos o seguinte resultado:

A linha foi, de facto, inserida. Vamos agora examinar o conteúdo da tabela de outra forma. Clique duas vezes na tabela [ARTICLES] no explorador de bases de dados:

Obtemos a seguinte tabela:

O botão com a seta acima permite atualizar a tabela. Após a atualização, a tabela acima não se altera. Parece que a nova linha não foi inserida. Vamos voltar ao editor SQL (F12) e, em seguida, confirmar a instrução SQL utilizando o botão [Commit]:

Depois de fazer isso, vamos voltar à tabela [ARTICLES]. Podemos ver que nada mudou, mesmo ao usar o botão [Refresh]:

Acima, abra o separador [Fields] e, em seguida, volte ao separador [Data]. Desta vez, a linha inserida aparece corretamente:

Quando a execução das várias instruções SQL começa, o editor abre o que se denomina uma transação na base de dados. As alterações feitas por estas instruções SQL no editor SQL só serão visíveis enquanto permanecer no mesmo editor SQL (pode abrir várias instâncias). É como se o editor SQL estivesse a trabalhar não na base de dados real, mas na sua própria cópia. Na realidade, não é exatamente assim que funciona, mas esta analogia pode ajudar-nos a compreender o conceito de transação. Todas as alterações feitas na cópia durante uma transação só serão visíveis na base de dados real depois de terem sido confirmadas através de um [Commit Transaction]. A transação atual é então encerrada e uma nova transação começa.
As alterações feitas durante uma transação podem ser desfeitas por uma operação chamada [Rollback]. Vamos tentar a seguinte experiência. Vamos iniciar uma nova transação (basta [Confirmar] a transação atual) com a seguinte instrução SQL:

Vamos executar este comando, que elimina todas as linhas da tabela [ARTICLES], e depois executar [New Query] com o seguinte novo comando SQL:

Obtemos o seguinte resultado:

Todas as linhas foram eliminadas. Lembre-se de que isto foi feito numa cópia da tabela [ARTICLES]. Para verificar isto, clique duas vezes na tabela [ARTICLES] abaixo:

e consulte o separador [Dados]:

Mesmo que utilizemos o botão [Atualizar] ou mudemos para o separador [Campos] e depois voltemos ao separador [Dados], o conteúdo acima permanece inalterado. Isto já foi explicado. Estamos numa outra transação que está a trabalhar na sua própria cópia. Agora, voltemos ao editor SQL (F12) e utilizemos o botão [Reverter] para anular as eliminações de linhas que foram feitas:

É-nos solicitada uma confirmação:

Vamos confirmar. O editor SQL confirma que as alterações foram revertidas:

Vamos executar novamente a consulta SQL acima para verificar. As linhas que tinham sido eliminadas estão agora de volta:

A operação [Rollback] restaurou a cópia em que o editor SQL está a trabalhar para o estado em que se encontrava no início da transação.





