Revista Clube Delphi Edição 11
Esse artigo faz parte da revista Clube Delphi edição 11. Clique aqui para ler todos os artigos desta edição

Interbase 6.0

Confira as novidades desta novíssima versão

A atitude da Borland foi, inegavelmente, uma das mais interessantes dos últimos tempos. A transformação do Interbase em um produto Freeware e OpenSource ainda está causando um grande rebuliço no mercado, principalmente o norte-americano. Por aqui, ainda não vimos a repercussão que o assunto merece. Esta novidade promete acabar com um dos grandes problemas de desenvolvimento Delphi no Brasil: muitos não podem pagar os royalties necessários para utilizar um banco como Interbase ou MS SQL SERVER e, em contrapartida, vários sistemas exigem uma base de dados de maior porte. Resultado: o paradox ainda é o mais utilizado entre a comunidade Delphi brasileira. Por conseqüência, encontramos sistemas de médio porte com uma quantidade razoável de clientes na rede, utilizando bases não cliente-servidores.

Mas quem pensa que este upgrade representa apenas uma nova forma de distribuição, está enganado. O Interbase 6 traz novidades internas muito interessantes como um comando Alter Table mais flexível, novos tipos de campos, Large Exact Numbers, entre outros.

IBConsole - Uma nova Interface

A mudança mais facilmente notada após a instalação do produto é a nova Interface de gerenciamento, chamada IBConsole. Este aplicativo substitui o Interbase Server Manager e o WISQL. Veja as figuras abaixo:

Interbase 5 - Server Manager
Interbase 5 - Server Manager
Interbase 5 - WISQL
Interbase 5 - WISQL
IBConsole
IBConsole

Apesar de a interface seguir uma lógica muito interessante, exibindo os objetos hierarquizados, ainda não temos a ferramenta ideal. Infelizmente, a manipulação ainda deve ser feita através de comandos SQL.

Até a simples tarefa de criação de uma tabela é realizada desta forma.

Ao abrir o IBConsole pela primeira vez, devemos registrar o servidor, local ou remoto. A janela aparece totalmente vazia:

IBConsole
IBConsole

Clique com o botão inverso do mouse sobre o item Interbase Servers, e selecione a opção Register. A janela de conexão será exibida:

Janela de conexão
Janela de conexão

Esta caixa de diálogo é padrão e existe nas versões anteriores do Interbase. Se o banco de dados estiver em outra máquina, selecione a opção Remote Server, o protocolo de rede e o nome ou IP do servidor, juntamente com o username e a senha. O nome e a senha criados na instalação do Interbase são SYSDBA e masterkey (digite exatamente como descrito, respeitando caracteres maiúsculos/minúsculos). Se o banco estiver local, basta o nome e a senha.

Após registrar o servidor, uma pequena lista de itens será exibida sob o nome da conexão, conforme mostra a figura a seguir:

Lista de intens
Lista de itens

Para se conectar a um banco de dados, clique com o botão inverso do mouse sobre o item Databases e selecione a opção register. A janela de conexão será exibida:

Janela de conexão.
Janela de conexão.

Após clicar em OK, uma lista com os objetos do banco será exibida. Ao clicar em algum objeto, como uma tabela ou uma stored procedure, o painel à direita exibirá todos os itens relacionados. A figura a seguir exibe o item TABLES selecionado:

Lista com objetos do banco de dados.
Lista com objetos do banco

Quando o próprio banco de dados estiver selecionado, o IBConsole apresentará uma lista de tarefas que podem ser realizadas:

Lista de tarefas que pode ser realizadas.
Lista de tarefas que pode ser realizadas.

Ao clicar duas vezes sobre o nome de um objeto, uma janela de propriedades padronizada será exibida. A figura a seguir ilustra as propriedades da tabela CUSTOMER:

JAnela de propriedades.
JAnela de propriedades.

A primeira Aba, chamada Properties, exibe as configurações gerais do objeto. No caso de uma tabela, são:

Configurações gerais do objeto.
Aba Properties
  1. Campos da tabela
  2. Triggers
  3. Check Constraints
  4. Indíces
  5. Unique Constraints
  6. Referential Constraints

A aba MetaData apresenta o Script SQL do objeto. A aba Permissions lista os usuários com seus respetivos poderes. Em Data temos uma Grid editável e em dependencies as relações de integridade. A janela de propriedades de outros objetos é bem parecida com esta.

Para criar um objeto ou alterar suas configurações devemos utilizar o SQL. Clique no menu Tools -> Interactive SQL para abrir a janela de manipulação de SQL:

janela de manipulação de SQL
Janela de manipulação de SQL.

A utilização é similar ao aplicativo WISQL encontrado em versões anteriores. O painel superior permite a digitação do comando SQL e a combinação CTRL+E ou CTRL+<ENTER> executa o script. O painel inferior exibe o resultado. Uma novidade deste ambiente são as abas Plan e Statistics. A primeira fornece o plano de execução de uma instrução, ou seja, informa qual decisão o servidor tomou, indicando os índices utilizados e sua ordem. Para otimizar as consultas a um banco, esta ferramenta pode ser de grande utilidade. A segunda aba informa detalhes sobre a última operação realizada. Confira as figuras abaixo:

Aba Plan
Aba Plan.
Aba Statistics
Aba Statistics.

ReadOnly Databases

Uma novidade não tão abrangente é a possibilidade de definir um banco de dados como readOnly. Para situações onde o banco servirá apenas para consulta, é uma ótima opção. A performance aumenta e a segurança do aplicativo permanecerá garantida. Para definir uma base como Readonly através do IBConsole, clique com o botão inverso sobre o banco de dados e selecione a opção Properties:

Propriedade ReadOnly
Defina a propriedade ReadOnly como TRUE, conforme mostrado na figura acima.

LARGE EXACT NUMBERS

Este é um dos recursos mais importantes. Para entendê-lo, vamos detalhar a estrutura dos campos numéricos no Interbase 5.

Os campos DECIMAL e NUMERIC pedem dois parâmetros: precision e scale. Precision indica a quantidade total de bytes do campo. Já o scale, a quantidade de dígitos após o ponto. Por exemplo:


        PRECO NUMERIC (15,2)
        
Indica um campo com 15 casas no total, sendo que dois serão dedicados para a parte decimal.

Nota:

A diferença entre Numeric e Decimal é que o primeiro sempre armazena as casas decimais.

O grande problema é quando o campo possui uma precisão maior do que 9. Neste caso, o Interbase armazena o número como um ponto-flutuante que não possui exatidão para operações complexas, geralmente utilizadas em cálculos monetários. Resumindo, um campo NUMERIC ou DECIMAL pode apresentar pequenas diferenças no resultado de um cálculo fracionário complexo, se o valor de precision for maior que 9.

No Interbase 6, utilizando o dialeto 3, ambos os tipos são armazenados como scaled numbers, que podem guardar a parte fracionária com maior exatidão. O campo se adapta de acordo com o tamanho especificado em precision. Se a precisão for menor ou igual a 4, o número ocupará 16 bits. Se for de 5 à 9, teremos um número de 32 bits e para precisions com valores maiores que 9, ocupará 64 bits. Estes números são conhecidos no Interbase 6 como LARGE EXACT NUMBERS.

A implementação de Large Exact Numbers também afeta o uso de chaves primárias. O novo Generator retorna números de 64 bits, ao contrário das versões anteriores, onde temos números de 32 bits. Para trabalhar com generators retornando números acima da faixa de 32 bits, o campo deverá ser do tipo DECIMAL ou NUMERIC, com precision maior do que 9, visto que não há campos inteiros suportando este tamanho.

Para aproveitar corretamente as tabelas criadas na versão 5, ou anterior, contendo campos NUMERIC ou DECIMAL com precisão maior que 9, é necessário realizar o upgrade do banco de dados. Veja como fazer isto mais adiante neste artigo.

DIALETOS

As versões anteriores do Interbase não são 100% compatíveis com o padrão SQL 92 - utilizado como referência pela indústria de banco de dados. Como resolução, temos agora o conceito de dialetos, que indicam a linguagem que será utilizada - compatível com Interbase 5 ou com o SQL-92. Os dialetos precisam ser especificados no lado servidor e no lado cliente. Vejamos a descrição de cada dialeto:

  • Dialeto 1: Compatibilidade com as versões anteriores do Interbase. Isto significa que:
    • Campos NUMERIC e DECIMAL, com precisão maior que 9, são armazenados como pontos-flutuantes, o que pode causar resultados com pequena diferença em cálculos complexos.
    • O campo DATE armazena a data e a hora.
    • Strings podem ser representadas ou armazenadas com aspas simples ou duplas.
  • Dialeto 2: Este dialeto é exclusivo para utilização no lado cliente. Quando algum recurso referente ao Dialeto 3 (SQL-92) é encontrado, o cliente gera um erro. Este dialeto tem como objetivo criar um "debug" para facilitar o desenvolvedor no processo de upgrade do aplicativo/banco de dados. Este dialeto não é recomendado para produção e deve ser "setado" somente no lado cliente.
  • Dialeto 3: É a linguagem SQL do Interbase 6, compatível com o padrão SQL-92. Novos bancos de dados criados no Interbase 6 já assumem o dialeto 3. Para modificar o Dialeto de um banco de dados, utilize a janela properties, a partir do IBConsole:
    Janela properties

As versões anteriores do Interbase Server e Client não suportam o Dialeto 3. As principais diferenças encontradas neste dialeto são:

  1. Strings só podem ser representadas ou armazenadas através de aspas simples. As aspas duplas ficam reservadas para evidenciar nomes de objetos (como tabelas) que agora podem:
    • Ter espaços
    • Ser palavras reservadas
    • Usar caracteres não - ASCII
    • Ser case-sensitive
  2. O campo Date armazena somente a data. Surgem novos campos como: TIME, para armazenar a hora, e TIMESTAMP, para data e hora. O campo DATE das versões anteriores agora é TIMESTAMP. Novas palavras chaves também surgiram: CURRENT_DATE, CURRENT_TIME e CURRENT_TIMESTAMP.
  3. Campos NUMERIC e DECIMAL, com precisão maior do que 9, são armazenados como LARGE EXACT NUMBERS.

NOTA:

Cuidado ao migrar um banco de dados para o dialeto 3. Nome entre aspas duplas é considerado um nome de objeto, e não uma string. Analise seu sistema para que todas as strings sejam referenciadas entre aspas simples.

O Dialeto 3 também suporta novos formatos de data:

  • yyyy-mm-dd
  • yyyy:mm:dd
  • yyyy/mm/dd
  • yyyy.mm.dd
  • yyyy mm dd

O comando extract é suportado pelo dialeto 3. Já conhecido de quem utiliza o SQL Local, com paradox ou dbase, este comando permite extrair parte de uma data:


        SELECT EXTRACT(MONTH FROM VENCIMENTO) FROM BOLETAS
        

Ou:


        SELECT * FROM USUARIOS WHERE EXTRACT(MONTH,INSCRICAO) = 7 and EXTRACT(YEAR,INSCRICAO)=2000
        

Segue abaixo uma lista das keywords que podem ser utilizadas no comando EXTRACT:

  • DAY
  • MONTH
  • YEAR
  • HOUR
  • MINUTE
  • SECOND
  • WEEKDAY - Dia da semana, de 0 à 6
  • YEARDAY - Dia do ano de 1 à 366.

NOVO COMANDO ALTER

O comando Alter Table agora possui maior flexibilidade. Com ele é possível alterar o nome de um determinado campo, seu tipo e sua posição dentro da tabela. O comando ALTER DOMAIN também evoluiu, permitindo modificar o nome e o tipo de um domínio. Vejamos alguns exemplos:


        ALTER TABLE CUSTOMER
        ALTER COUNTRY TO PAIS
        

O nome do campo Country é alterado para PAIS.


        ALTER TABLE CUSTOMER
        ALTER COUNTRY TYPE VARCHAR(50)
        

O tamanho do campo country é aumentado para 50 caracteres.


        ALTER TABLE CUSTOMER
        ALTER COUNTRY POSITION 2
        

A posição do campo na tabela é alterada para 2.

COMANDO GBAK

Este aplicativo ganhou novos recursos, incorporando a funcionalidade do comando gsplit, encontrado na versão 5 do Interbase. O comando gsplit permite realizar o backup de vários arquivos, ou o restore a partir dos mesmos.

Além disso, foram adicionados dois novos parâmetros: -mode read_only, que permite "setar" o banco como read-only. E -service, que realiza o backup do lado servidor, diminuindo drasticamente o congestionamento na rede (as versões anteriores deste aplicativo realizavam o backup para o cliente).

NOVAS KEYWORDS

A lista de palavras reservadas foi acrescida. Confira:

  • COLUMN
  • CURRENT_DATE
  • CURRENT_TIME
  • CURRENT_TIMESTAMP
  • DAY
  • EXTRACT
  • HOUR
  • MINUTE
  • SECOND
  • MONTH
  • SQL
  • TIME
  • TIMESTAMP
  • TYPE
  • WEEKDAY
  • YEAR
  • YEARDAY

Nota:

Lembre-se que o dialeto 3 permite o uso de palavras reservadas como nome de objetos, desde que entre aspas duplas.

IBX (INTERBASE EXPRESS)

A palheta IBX do Delphi5, que permite acessar o Interbase diretamente, precisa ser atualizada para suportar os novos recursos do Interbase. Para baixar o update, clique aqui . Repare que o novo IBX precisa do Update Pack 1 do Delphi5. Para baixar o UPDPACK#1, clique aqui.

palheta IBX
Nova palheta de componentes.

Esta nova palheta permite utilizar os recursos encontrados na nova API do Interbase. Entre eles, podemos citar:

  • Executar um backup remoto, ou seja, server-sided;
  • Automatizar a instalação/remoção do Interbase;
  • Requisitar informações específicas a respeito da conexão ou do servidor em si;
  • Configurar o servidor remotamente;
  • Obter informações estatísticas sobre o banco ou conexão;
  • Iniciar ou Parar o servidor Interbase automaticamente;
  • Recuperar o conteúdo do arquivo de log do servidor;
  • Nota 1:

    A propriedade SQL Dialect do objeto IBDatabase, permite configurar o dialeto SQL utilizado pelo cliente.
  • Nota 2:

    Até o fechamento desta edição, as versões disponíveis do BDE não suportam o Dialeto 3. Apenas os componentes IBX podem trabalhar com este dialeto.
  • Nota 3:

    Não se esqueça de atualizar o IBClient nos pontos de rede. A versão 6 do Interbase inclui servidor e cliente.

Atualizando o Banco de Dados

Além do Server e dos clients, o banco de dados também precisa ser atualizado. Para isso, antes de instalar o novo Interbase, faça um backup de todos os bancos através do Server Manager. Se desejar salvar as configurações de usuários, faça o backup do banco isc4.gdb.

Após instalar o Interbase 6, restaure todos os bancos de dados através do IB Console. Os arquivos GDB serão atualizados e terão dialeto 1. Para mover o banco de dados para o dialeto 3, você pode seguir uma das opções abaixo:

  1. Criar um novo banco de dados, dialeto 3, e mover os dados;
  2. Analizar as incompatibilidades do banco com o dialeto 3, e removê-las. Após isto, basta trocar o dialeto na janela properties do database (IBConsole).

Incompatibilidades entre o Dialeto 1 e o Dialeto 3:

  • Campo DATE:

    Armazena data e hora no Dialeto 1. No dialeto 3, temos três campos:

    • Date - armazena a data
    • TIME - armazena a hora
    • TIMESTAMP - armazena a data e a hora

    Quando um banco de dados é migrado para o Interbase 6, os campos DATE são convertidos para TIMESTAMP.

  • Aspas Duplas:

    São delimitadores de strings no Dialeto 1. No Dialeto 3, identificam nomes de objetos. Neste caso, strings devem ser marcadas com aspas simples.

    Ao migrar um banco para o dialeto 3, procure ocorrências de aspas duplas dentro de triggers ou stored procedures. Se as aspas duplas existirem dentro dos valores de uma tabela, elimine-as. Ex:

    
                    Dialeto 1:
    
                    'Price"Sunshine' Ok!
                    "Price""Sunshine" Ok!
    
                    Dialeto 3:
    
                    'Price"Sunshine' Errado!
                    'Price''Sunshine' Ok!
                    

Campos NUMERIC e DECIMAL

No dialeto 1, estes campos, com uma precisão maior do que 9, são armazenados como pontos-flutuantes, o que pode causar pequenas diferenças de resultado em operações fracionárias complexas. No Dialeto 3, NUMERIC e DECIMAL com precisão maior que 9, são armazenados como Large Exact Numbers, números que podem variar até 64 bits, fornecendo um resultado fracionários com maior exatidão.

Se a tabela possuir campos NUMERIC ou DECIMAL com precisão maior do que 9, e você desejar convertê-los para Large Exact Numbers, proceda:

  1. Converta o banco de dados para o Dialeto 3, conforme orientado anteriormente;
  2. Crie uma nova coluna, do tipo NUMERIC ou DECIMAL, com precisão maior do que 9;
  3. Copie os dados da coluna NUMERIC ou DECIMAL para o novo campo criado;
  4. Apague a coluna original e renomeie o novo campo, dando-lhe o nome do original. Utilize o novo comando ALTER TABLE para mudar o nome da coluna;

Nota

As futuras versões do Interbase irão suportar apenas o Dialeto 3.

Como podemos observar, o Interbase é um excelente banco de dados. Com estas implementações, ele se torna cada vez mais uma opção confortável para os desenvolvedores. E não só os que utilizam Delphi como frontend, pois o Interbase fornece vários drivers de acesso, como ODBC e JDBC. O Interbase comprovadamente suporte centenas de usuários conectados, gigas de informação armazenadas e ótima performance. E vale reforçar que agora é Freeware e OpenSource!

Para conhecer mais sobre o novo Interbase, acompanhe as atualizações do nosso site. O IBConsole utilizado nesta matéria foi a versão 1.0.0.308 e pode ser baixado aqui. A versão 1.309, que acompanha o Interbase 6 Final, apresenta um erro de conexão. O Interbase pode ser baixado gratuitamente aqui.