Dicas de InterBase e Firebird
Configurar o Firewall do Windows XP com SP2 para Interbase/FirebirdO 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:
Autor: Daniel P. Guimarães Listar as tabelas e views do banco de dadosTabelas 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 Backup e restore com gbakO 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:
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 Obter o valor de um generatorPara 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 NomeTabelaOnde 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 Reiniciar a contagem de um generatorPara 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 Excluir generatorNo 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 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:
Autor: Daniel P. Guimarães Trocar o tipo de um campoPara 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 NovoTipoExemplos: 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 Alterar o tamanho de um campoPara 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 Transação multi-banco com IBXEmbora 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:
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 Excluir código-fonte de stored procedureUma 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. Obter os campos da chave-primáriaExecute 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 Definir forced writes usando o gfixPara 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 Definir sweep interval com gfixPara 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 Obter a data do servidorIsto é 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 Página atualizada em 23 de janeiro de 2012 |