Dicas de InterBase e Firebird


Configurar o Firewall do Windows XP com SP2 para Interbase/Firebird

O pacote de atualização Service Pack 2 (SP2) do Windows XP inclui um Firewall para proteção da rede contra acesso não autorizado, seja pela internet ou através da rede local. Este programa bloqueia automaticamente quase todas as portas de acesso do protocolo TCP/IP, incluindo a porta 3050 que por padrão é usada pelos bancos de dados Interbase e Firebird.

Então para que outros computadores possam acessar um banco de dados Interbase ou Firebird em um servidor com Windows XP com SP2 que esteja com Firewall ativado é necessário adicionar uma exceção, ou seja, informar ao Firewall que a porta 3050 não deve ser bloqueada. Para fazer isto siga os os passos abaixo:
  • Clique em Iniciar/Configurações/Painel de controle;
  • Abra o item denominado Firewall do Windows;
  • Vá para Exceções;
  • Clique em Adicionar porta;
  • No campo Nome digite Firebird ou Interbase;
  • No campo Número da Porta digite 3050;
  • Escolha o protocolo TCP e clique em Ok.
Após este procedimento a porta 3050 estará desbloqueada e o banco de dados Interbase ou Firebird estará acessível através da rede.

Autor: Daniel P. Guimarães
Home-page: www.tecnobyte.com.br

Início


Listar as tabelas e views do banco de dados

Tabelas e views:

SELECT RDB$RELATION_NAME FROM RDB$RELATIONS;

Somente tabelas:

SELECT RDB$RELATION_NAME FROM RDB$RELATIONS
WHERE RDB$VIEW_BLR IS NULL;

Somente views:

SELECT RDB$RELATION_NAME FROM RDB$RELATIONS
WHERE NOT RDB$VIEW_BLR IS NULL;

Observação:

Para não incluir as tabelas e views de sistema, acrescente o filtro (RDB$SYSTEM_FLAG = 0 OR RDB$SYSTEM_FLAG IS NULL) na cláusula WHERE. Exemplo:

SELECT RDB$RELATION_NAME FROM RDB$RELATIONS
WHERE RDB$VIEW_BLR IS NULL AND (RDB$SYSTEM_FLAG = 0 OR RDB$SYSTEM_FLAG IS NULL);

Autor: Daniel P. Guimarães
Home-page: www.tecnobyte.com.br

Início


Backup e restore com gbak

O InterBase/FireBird possui uma ferramenta de linha de comando específica para fazer e restaurar cópias de segurança (backup). No Windows o nome do programa é gbak.exe e no Linux seu nome é gbak (sem extensão). Em ambos os sistemas a localização deste arquivo é o sub-diretório bin do InterBase/FireBird.

As sintaxes básicas deste comando são:

Para fazer um backup:

gbak -b -user usuario -password senha arquivo_banco arquivo_backup

Para restaurar um backup:

gbak -r -user usuario -password senha arquivo_backup arquivo_banco

Onde:

  • usuario: é o nome de login do usuário (geralmente SYSDBA).
  • senha: é a senha do usuário.
  • arquivo_banco: é o arquivo de banco de dados (geralmente com extensão .gdb).
  • arquivo_backup: é o arquivo de backup (geralmente com extensão .gbk).

Exemplo de backup:

gbak -b -user SYSDBA -password masterkey c:\sistema\dados.gdb c:\backup\dados.gbk

Exemplo de restore:

gbak -r -user SYSDBA -password masterkey c:\backup\dados.gbk c:\sistema\dados.gdb

Autor: Daniel P. Guimarães
Home-page: www.tecnobyte.com.br

Início


Obter o valor de um generator

Para obter o valor de um generator devemos usar a função GEN_ID do InterBase/FireBird. A sintaxe é:

GEN_ID(NomeDoGenerator, Incremento);

Exemplos:

GEN_ID(Gen_Cliente_Codigo, 1);
GEN_ID(Gen_Cliente_Codigo, 0);

No primeiro exemplo o generator será incrementado e o novo valor será retornado. Já no segundo exemplo o generator não será incrementado e seu valor atual será retornado.

Dentro de um trigger podemos atribuir o valor de um generator a um campo da tabela, como mostra o exemplo a seguir:

CREATE TRIGGER TRIG_Cliente_Inclusao FOR Cliente BEFORE INSERT AS
BEGIN
  NEW.Codigo = GEN_ID(Gen_Cliente_Codigo, 1);  
END^

Para obter o valor de um generator através de uma aplicação, podemos executar o comando SELECT mostrado a seguir sobre uma tabela que possua apenas um registro:

SELECT GEN_ID(NomeDoGenerator, 1) FROM NomeTabela
Onde NomeTabela é o nome de uma tabela do banco de dados que precisa ter um, e somente um, registro. Geralmente usamos a tabela de sistema RDB$DATABASE para este propósito. Eis um exemplo:
SELECT GEN_ID(Gen_Cliente_Codigo, 1) FROM RDB$DATABASE;

Autor: Daniel P. Guimarães
Home-page: www.tecnobyte.com.br

Início


Reiniciar a contagem de um generator

Para re-iniciar a contagem de um generator basta executar o comando abaixo:

SET GENERATOR TO X;

Onde X é um número inteiro.

O exemplo abaixo define o valor do generator GEN_Cliente_Codigo igual a zero:

SET GENERATOR GEN_Cliente_Codigo TO 0

Observação:

O valor obtido com GEN_ID(GEN_Cliente_Codigo, 1) após o exemplo dado anteriormente será 1 (um), pois a função GEN_ID retorna o valor do generator já incrementado.

Autor: Daniel P. Guimarães
Home-page: www.tecnobyte.com.br

Início


Excluir generator

No InterBase 6.0.x:
DELETE FROM RDB$GENERATORS 
WHERE RDB$GENERATOR_NAME = 'NOME_DO_GENERATOR';
No FireBird:
DROP GENERATOR NOME_DO_GENERATOR;

Autor: Daniel P. Guimarães
Home-page: www.tecnobyte.com.br

Início


Criar e usar domínios (domain's)

No InterBase e FireBird domínios são como tipos de dados. Tais domínios têm grande semelhança com o conceito de domínio aplicado à matemática, ou seja, um domínio define um conjunto de valores válidos para uma dada situação.

Podemos criar qualquer banco de dados sem fazer uso explícito de domínios. No entanto usar domínios explicitamente pode deixar o banco de dados mais organizado, com regras claras e bem definidas, e ainda conseguir uma economia substancial de mão de obra na construção e manutenção do banco.

Para demonstrar a utilidade dos domínios, vamos criar dois exemplos.

Exemplo 1 - Sem uso explícito de domínios:

CREATE TABLE Cliente(
  Codigo  INTEGER NOT NULL,
  Nome    VARCHAR(40) NOT NULL,
  Fone    VARCHAR(20),
  Fax     VARCHAR(20),
  Celular VARCHAR(20),
  Renda   NUMERIC(9,2) DEFAULT 0 NOT NULL,
  CONSTRAINT PK_Cliente PRIMARY KEY(Codigo),
  CONSTRAINT CHK_Cliente_Codigo CHECK(Codigo > 0),
  CONSTRAINT CHK_Cliente_Renda CHECK(Renda >= 0));

Exemplo 2 - Com uso explícito de domínios:

CREATE DOMAIN DM_ChavePrimaria INTEGER NOT NULL CHECK(VALUE > 0);
CREATE DOMAIN DM_NomePessoa VARCHAR(40) NOT NULL;
CREATE DOMAIN DM_Fone VARCHAR(20);
CREATE DOMAIN DM_Renda NUMERIC(9,2) DEFAULT 0 NOT NULL CHECK(VALUE >= 0);

CREATE TABLE Cliente(
  Codigo  DM_ChavePrimaria,
  Nome    DM_NomePessoa,
  Fone    DM_Fone,
  Fax     DM_Fone,
  Celular DM_Fone,
  Renda   DM_Renda,
  CONSTRAINT PK_Cliente PRIMARY KEY(Codigo));

Comentários:

  • O benefício imediato do uso explícito de domínios é a organização do código que define as tabelas.
  • Como um mesmo domínio será usado em várias tabelas (exemplo: DM_NomePessoa), ganharemos muito tempo ao definir outras tabelas que comporão o banco de dados.
  • O domínio DM_Fone é um exemplo que demonstra como um mesmo domínio pode ser usado para colunas diferentes que possuem conteúdos semelhantes.
  • Os domínios DM_ChavePrimaria e DM_Renda mostram aspectos mais interessantes na declaração de domínios, tais como a especificação de um valor padrão (DEFAULT) e regras para validação (CHECK).
  • Se mais tarde resolvermos alterar os nomes de pessoas para 50 caracteres, ou seja, VARCHAR(50), bastará alterar a definição do domínio DM_NomePessoa e todos os campos definidos com este domínio serão automaticamente ajustados. Neste caso bastaria o comando ALTER DOMAIN DM_NomePessoa TYPE VARCHAR(50).
  • Nos bancos de dados que crio, uso domínios explicitamente para todos os campos de todas as tabelas, mesmo onde aparentemente são desnecessários. Mas é bom lembrar que domínios mal definidos podem trazer mais prejuízos do que benefícios. Portanto, antes de sair criando domínios deliberadamente, faça um estudo minucioso do banco de dados a ser construído.

Autor: Daniel P. Guimarães
Home-page: www.tecnobyte.com.br

Início


Trocar o tipo de um campo

Para alterar o tipo de um campo no FireBird (ou InterBase 6.0 ou superior) execute o comando SQL abaixo:
ALTER TABLE NomeDaTabela ALTER NomeDoCampo TYPE NovoTipo
Exemplos:
ALTER TABLE Cliente ALTER Nome TYPE VARCHAR(40);
ALTER TABLE Venda ALTER Total TYPE NUMERIC(18, 2);
Obs:

Em geral este comando não funciona se a troca de tipo implicar em perda de dados.

Sugestão:

Onde aparece NovoTipo você poderá usar um nome de domínio.

Autor: Daniel P. Guimarães
Home-page: www.tecnobyte.com.br

Início


Alterar o tamanho de um campo

Para alterar o tamanho de um campo CHAR ou VARCHAR no FireBird (ou InterBase 6.0 ou superior) basta executar o comando SQL abaixo:
ALTER TABLE NomeDaTabela ALTER NomeDoCampo TYPE NovoTipo;
Exemplo:

ALTER TABLE Cliente ALTER Nome TYPE VARCHAR(50);
Obs:

Este comando não funciona se a alteração de tamanho implicar em perda de dados, ou seja, não serve para reduzir o tamanho de um campo.

Autor: Daniel P. Guimarães
Home-page: www.tecnobyte.com.br

Início


Transação multi-banco com IBX

Embora seja um recurso pouco conhecido, o InterBase/FireBird suporta uma única transação vinculada a dois ou mais bancos e os componentes InterBase Express (IBX) suportam este recurso de forma transparente. Para usar este recurso com IBX siga os passos abaixo:
  • Coloque um IBDatabase para cada banco de dados.
  • Coloque apenas um IBTransaction.
  • Conecte cada IBDatabase ao IBTransaction pela propriedade DefaultTransaction.
  • Coloque quantos IBSQL ou IBDataSet forem necessários.
  • Conecte cada IBSQL ou IBDataSet ao respectivo IBDatabase pela propriedade Database.
  • Conecte cada IBSQL ou IBDataSet ao mesmo IBTransaction pela propriedade Transaction.
  • Pronto, agora é só trabalhar normalmente.

Importante

Deixe a propriedade DefaultDatabase do IBTransaction sem preencher.

Sugestão

Use esta técnica sempre que precisar transferir dados de um banco de dados para outro.

Autor: Daniel P. Guimarães
Home-page: www.tecnobyte.com.br

Início


Excluir código-fonte de stored procedure

Uma grande preocupação que tem tomado conta da cabeça de muitos programadores é a possibilidade de um programador concorrente pegar o código-fonte das stored procedures armazenadas em banco de dados InterBase/FireBird. Uma solução encontrada é apagar o código-fonte diretamente da tabela de sistema onde o InterBase grava as informações relativas às stored procedures. Para fazer isto execute o comando abaixo:
UPDATE RDB$PROCEDURES SET RDB$PROCEDURE_SOURCE = 'empty'

Observações

A mesma coisa pode ser feita com triggers. No entanto é importante lembrar que você não deve atribuir NULL, pois havia um bug no InterBase que fazia o trigger ser disparado duas vezes caso o código-fonte estivesse NULL. Não sei se o bug foi corrigido. De qualquer forma, atribua uma string qualquer, tal como no exemplo acima.

Início


Obter os campos da chave-primária

Execute o comando SELECT abaixo para obter os nomes dos 
campos da chave-primaria de uma tabela do InterBase ou
FireBird.

SELECT RDB$FIELD_NAME
FROM
  RDB$RELATION_CONSTRAINTS C,
  RDB$INDEX_SEGMENTS S
WHERE
  C.RDB$RELATION_NAME = 'NomeDaTabela' AND
  C.RDB$CONSTRAINT_TYPE = 'PRIMARY KEY' AND
  S.RDB$INDEX_NAME = C.RDB$INDEX_NAME
ORDER BY RDB$FIELD_POSITION

Observações

Estes objetos com nomes iniciados com RDB$ são chamados de objetos de sistema e são usados internamente pelo InterBase/FireBird. As tabelas começadas com RDB$ contém dados sobre a estrutura do banco de dados.

Autor: Daniel P. Guimarães
Home-page: www.tecnobyte.com.br

Início


Definir forced writes usando o gfix

Para mudar a propriedade "Forced Writes" de um banco de dados 
InterBase usando o gfix faça:

Para ativar:
gfix banco -write sync -user sysdba -password senha

Para desativar:
gfix banco -write async -user sysdba -password senha

Onde:

banco = Caminho completo do banco de dados (arquivo .gdb).
senha = senha do sysdba.

Observações

Você também poderá usar o IBConsole para alterar esta propriedade.

Autor: Daniel P. Guimarães
Home-page: www.tecnobyte.com.br

Início


Definir sweep interval com gfix

Para definir o "sweep interval" de um banco de dados InterBase 
usando o gfix, execute:

gfix banco -housekeeping n -user sysdba -password senha

Onde:

banco = Caminho completo do banco de dados (arquivo .gdb).
n = Intervalo de sweep.
senha = senha do sysdba.

Observações

Você também poderá alterar esta propriedade do banco de dados usando o IBConsole.

Autor: Daniel P. Guimarães
Home-page: www.tecnobyte.com.br

Início


Obter a data do servidor

Isto é facilmente possível se você usa um banco de dados 
Client/Server, tal como Interbase, SQL Server, Oracle, etc. 

No Interbase6 execute a Query abaixo:

SELECT CURRENT_DATE FROM RDB$DATABASE;

O resultado é a data do servidor onde está rodando o 
Interbase Server.

Observações

A tabela usada no SELECT foi RDB$DATABASE, mas poderia ser qualquer tabela que possua apenas um registro. RDB$DATABASE é uma tabela de sistema do Interbase.

Autor: Daniel P. Guimarães
Home-page: www.tecnobyte.com.br

Início


Página atualizada em 23 de julho de 2014
Todos os direitos reservados
www.tecnobyte.com.br