Firebird e Interbase Dicas

Download Firebird e Interbase Dicas

Post on 15-Jul-2015

389 views

Category:

Documents

0 download

TRANSCRIPT

Dicas de InterBase e FirebirdConfigurar o Firewall do Windows XP com SP2 para Interbase/Firebird Listar as tabelas e views do banco de dados Backup e restore com gbak Obter o valor de um generator Reiniciar a contagem de um generator Excluir generator Criar e usar domnios (domain's) Trocar o tipo de um campo Alterar o tamanho de um campo Transao multi-banco com IBX Excluir cdigo-fonte de stored procedure Obter os campos da chave-primria Definir forced writes usando o gfix Definir sweep interval com gfix Obter a data do servidorConfigurar o Firewall do Windows XP com SP2 para Interbase/Firebird O pacote de atualizao Service Pack 2 (SP2) do Windows XP inclui um Firewall para proteo da rede contra acesso no autorizado, seja pela internet ou atravs da rede local. Este programa bloqueia automaticamente quase todas as portas de acesso do protocolo TCP/IP, incluindo a porta 3050 que por padro usada pelos bancos de dados Interbase e Firebird.Ento 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 necessrio adicionar uma exceo, ou seja, informar ao Firewall que a porta 3050 no deve ser bloqueada. Para fazer isto siga osos passos abaixo:Clique em Iniciar/Configuraes/Painel de controle; Abra o item denominado Firewall do Windows; V para Excees; Clique em Adicionar porta; No campo Nome digite Firebird ou Interbase; No campo Nmero da Porta digite 3050; Escolha o protocolo TCP e clique em Ok.Aps este procedimento a porta 3050 estar desbloqueada e o banco de dados Interbase ou Firebird estar acessvel atravs da rede.Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.brIncio 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;Observao:Para no incluir as tabelas e views de sistema, acrescente o filtro (RDB$SYSTEM_FLAG = 0 OR RDB$SYSTEM_FLAG IS NULL) na clusula 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. Guimares Home-page: www.tecnobyte.com.brIncio Backup e restore com gbakO InterBase/FireBird possui uma ferramenta de linha de comando especfica para fazer e restaurar cpias de segurana (backup). No Windows o nome do programa gbak.exe e no Linux seu nome gbak (sem extenso). Em ambos os sistemas a localizao deste arquivo o sub-diretrio bin do InterBase/FireBird.As sintaxes bsicas deste comando so:Para fazer um backup:gbak -b -user usuario -password senha arquivo_banco arquivo_backupPara restaurar um backup:gbak -r -user usuario -password senha arquivo_backup arquivo_bancoOnde:usuario: o nome de login do usurio (geralmente SYSDBA). senha: a senha do usurio. arquivo_banco: o arquivo de banco de dados (geralmente com extenso .gdb). arquivo_backup: o arquivo de backup (geralmente com extenso .gbk).Exemplo de backup:gbak -b -user SYSDBA -password masterkey c:\sistema\dados.gdb c:\backup\dados.gbkExemplo de restore:gbak -r -user SYSDBA -password masterkey c:\backup\dados.gbk c:\sistema\dados.gdbAutor: Daniel P. Guimares Home-page: www.tecnobyte.com.brIncio Obter o valor de um generatorPara obter o valor de um generator devemos usar a funo 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 no 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 atravs de uma aplicao, 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 propsito. Eis um exemplo:SELECT GEN_ID(Gen_Cliente_Codigo, 1) FROM RDB$DATABASE;Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.brIncio 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 nmero inteiro.O exemplo abaixo define o valor do generator GEN_Cliente_Codigo igual a zero:SET GENERATOR GEN_Cliente_Codigo TO 0Observao:O valor obtido com GEN_ID(GEN_Cliente_Codigo, 1) aps o exemplo dado anteriormente ser 1 (um), pois a funo GEN_ID retorna o valor do generator j incrementado.Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.brIncio 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. Guimares Home-page: www.tecnobyte.com.brIncio Criar e usar domnios (domain's)No InterBase e FireBird domnios so como tipos de dados. Tais domnios tm grande semelhana com o conceito de domnio aplicado matemtica, ou seja, um domnio define um conjunto de valores vlidos para uma dada situao.Podemos criar qualquer banco de dados sem fazer uso explcito de domnios. No entanto usar domnios explicitamente pode deixar o banco de dados mais organizado, com regras claras e bem definidas, e ainda conseguir uma economia substancial de mo de obra na construo e manuteno do banco.Para demonstrar a utilidade dos domnios, vamos criar dois exemplos.Exemplo 1 - Sem uso explcito de domnios:CREATE TABLE Cliente( Codigo INTEGER NOT NULL, Nome Fone Fax VARCHAR(40) NOT NULL, VARCHAR(20), 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 explcito de domnios: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 Fone Fax DM_NomePessoa, DM_Fone, DM_Fone,Celular DM_Fone, Renda DM_Renda, CONSTRAINT PK_Cliente PRIMARY KEY(Codigo));Comentrios:O benefcio imediato do uso explcito de domnios a organizao do cdigo que define as tabelas. Como um mesmo domnio ser usado em vrias tabelas (exemplo: DM_NomePessoa), ganharemos muito tempo ao definir outras tabelas que comporo o banco de dados. O domnio DM_Fone um exemplo que demonstra como um mesmo domnio pode ser usado para colunas diferentes que possuem contedos semelhantes. Os domnios DM_ChavePrimaria e DM_Renda mostram aspectos mais interessantes na declarao de domnios, tais como a especificao de um valor padro (DEFAULT) e regras para validao (CHECK). Se mais tarde resolvermos alterar os nomes de pessoas para 50 caracteres, ou seja, VARCHAR(50), bastar alterar a definio do domnio DM_NomePessoa e todos os campos definidos com este domnio sero automaticamente ajustados. Neste caso bastaria o comando ALTER DOMAINDM_NomePessoa TYPE VARCHAR(50). Nos bancos de dados que crio, uso domnios explicitamente para todos os campos de todas as tabelas, mesmo onde aparentemente so desnecessrios. Mas bom lembrar que domnios mal definidos podem trazer mais prejuzos do que benefcios. Portanto, antes de sair criando domnios deliberadamente, faa um estudo minucioso do banco de dados a ser construdo.Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.brIncio 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 NovoTipoExemplos:ALTER TABLE Cliente ALTER Nome TYPE VARCHAR(40); ALTER TABLE Venda ALTER Total TYPE NUMERIC(18, 2);Obs:Em geral este comando no funciona se a troca de tipo implicar em perda de dados.Sugesto:Onde aparece NovoTipo voc poder usar um nome de domnio.Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.brIncio 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 no funciona se a alterao de tamanho implicar em perda de dados, ou seja, no serve para reduzir o tamanho de um campo.Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.brIncio Transao multi-banco com IBXEmbora seja um recurso pouco conhecido, o InterBase/FireBird suporta uma nica transao 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 necessrios. 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.ImportanteDeixe a propriedade DefaultDatabase do IBTransaction sem preencher.SugestoUse esta tcnica sempre que precisar transferir dados de um banco de dados para outro.Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.brIncioExcluir cdigo-fonte de stored procedure Uma grande preocupao que tem tomado conta da cabea de muitos programadores a possibilidade de um programador concorrente pegar o cdigo-fonte das stored procedures armazenadas em banco de dados InterBase/FireBird. Uma soluo encontrada apagar o cdigo-fonte diretamente da tabela de sistema onde o InterBase grava as informaes relativas s stored procedures. Para fazer isto execute o comando abaixo:UPDATE RDB$PROCEDURES SET RDB$PROCEDURE_SOURCE = 'empty'ObservaesA mesma coisa pode ser feita com triggers. No entanto importante lembrar que voc no deve atribuir NULL, pois havia um bug no InterBase que fazia o trigger ser disparado duas vezes caso o cdigo-fonte estivesse NULL. No sei se o bug foi corrigido. De qualquer forma, atribua uma string qualquer, tal como no exemplo acima.Incio Obter os campos da chave-primriaExecute 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 SWHERE 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_POSITIONObservaesEstes objetos com nomes iniciados com RDB$ so chamados de objetos de sistema e so usados internamente pelo InterBase/FireBird. As tabelas comeadas com RDB$ contm dados sobre a estrutura do banco de dados.Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.brIncio Definir forced writes usando o gfixPara mudar a propriedade "Forced Writes" de um banco de dados InterBase usando o gfix faa:Para ativar: gfix banco -write sync -user sysdba -password senhaPara desativar: gfix banco -write async -user sysdba -password senhaOnde:banco = Caminho completo do banco de dados (arquivo .gdb). senha = senha do sysdba.ObservaesVoc tambm poder usar o IBConsole para alterar esta propriedade.Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.brIncio 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 senhaOnde:banco = Caminho completo do banco de dados (arquivo .gdb). n = Intervalo de sweep.senha = senha do sysdba.ObservaesVoc tambm poder alterar esta propriedade do banco de dados usando o IBConsole.Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.brIncio Obter a data do servidorIsto facilmente possvel 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.ObservaesA 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. Guimares Home-page: www.tecnobyte.com.brInciohttp://www.tecnobyte.com.br/dica9.html