ÍNDICE
1) Como fazer para utilizar caracteres
acentuados (português) e obter ordenação correta nos índices
?
R: Para o português, defina o CHARACTER SET como ISO8859_1 e nos campos onde houver indexação, use COLLATE PT_PT. Fazendo isso o Interbase utilizará a ordenação correta para o português. Voce também pode utilizar CHARACTER SET WIN1252 COLLATE PXW_INTL850. (Carlos H. Cantu)
À seguir está uma mensagem postada por Paulo Henrique Albanez na lista Interbase-BR com alguns testes interessantes sobre o assunto ! Vale a pena ser lido :
Fiz alguns
testes e espero solucionar o problema. Criei a seguinte Tabela : CREATE
TABLE "TESTE" ("CODIGO" INTEGER NOT NULL, Se não definir o Character Set da conexão, só consigo digitar acentos no campo Nome1 Se definir o Character Set da conexão para ISO8859_1 ou WIN1252: Eu consigo digitar acentos nos campos Nome2 e Nome3, mas não no campo Nome1, porque este não tem um Character Set definido. Eu preenchi a tabela com os seguintes valores:
Sem especificar o CHARACTER SET e COLLATE, executei a seguinte SQL (SELECT Código, Nome1 FROM TESTE Order by Nome1). Resultado :
Como vocês podem verificar, a ordenação faz distinção de maiúscula e minúscula e de letras acentuadas e não acentuadas. Nas minhas aplicações este tipo de ordenação não serve. Utilizando CHARACTER SET ISO8859_1 COLLATE PT_PT. Executei a seguinte SQL (SELECT Código, Nome2 FROM TESTE order by Nome2). Resultado :
Como vocês podem verificar, a ordenação não faz distinção de maiúsculo e minúsculo e de letras acentuadas, mas também não considera espaço e outros caracteres (Observe: AA vem antes A B). Utilizando CHARACTER SET WIN1252 COLLATE PXW_INTL850 Executei a seguinte SQL (SELECT Código, Nome3 FROM TESTE order by Nome3). Resultado:
Este CHARACTER SET e o COLLATE não fazem distinção de maiúsculo e minúsculo e nem de letras acentuadas. Com este Character Set eu posso utilizar uma clausula where Nome >= 'A' and > Nome <= 'A~' , e tenho com resultado todos os nomes começando com A (A, ã, á, a, â, Ã, etc). Para utilizar Character Set você tem que definir o Character Set da conexão. Como definir o Character Set da conexão: IBConsole: - No IBConsole, é só você clicar com o botão direito do mouse em cima do alias do banco de dados (com este desconectado) e selecionar a opção Connect As..., desse modo você terá várias opções inclusive o Character Set. IBO: - Selecione o componente TIB_Connection e defina a propriedade CharSet = WIN1252. IBX: - Selecione o componente TIBDatabase e adicione na propriedade Params a seguinte linha lc_ctype=WIN1252 ou lc_ctype=ISO8859_1. BDE: - Usando o BDE Administrator, click em Configuration -> Drivers -> Native -> INTRBASE e escolha para LANGDRIVER a opção Borland PTG Latin-1 ou Paradox 'intl' 850. Nos demais programas como EMS QuickDesk, IBExpress, etc, quase sempre, quando você registra ou conecta ao banco de dados tem a opção para se definir o Character Set. Só há um problema, Character Set definido como None não é compatível com os demais e vice-versa. Exemplo: Se você definiu um campo sem o Character Set e digitou acentos quando você definir o Character Set da conexão você terá problemas com os dados acentuados desse campo, o mesmo acontece se você criar um campo com Character Set definido e depois não definir o Character Set da conexão. Em resumo Character Set = None, não é compatível com nenhum outro Character Set, já se você definir o Character Set este só não será combatível com o Character Set = None. PHA |
2) Como usar campos auto-incrementais no Interbase ?
R: O Interbase não possui suporte direto ao tipo de dado autoincremental, mas voce pode facilmente simular esse tipo de dado, até com algumas vantagens. Veja a seguir um exemplo de como faze-lo :
Imagine que voce tenha uma tabela CLIENTES com um campo CODIGO INTEGER NOT NULL que é sua chave primária. Voce deseja que o campo CODIGO seja auto-incremental. Para isso, defina um generator como o seguinte :
CREATE GENERATOR GEN_CLIENTE;
Depois, crie um TRIGGER na posição BEFORE INSERT da tabela CLIENTES, como o seguinte :
CREATE TRIGGER CLIENTES_BIIF (NEW.CODIGO IS NULL) THEN NEW.CODIGO = GEN_ID(GEN_CLIENTE,1);
END
Com isso voce está simulando um campo auto-incremental, com a vantagem de que se voce atribuir um valor ao campo CODIGO, o trigger utilizará esse valor para o campo e não irá gerar um novo, o que é muito útil quando voce está migrando dados de uma base para outra e não quer que os códigos se alterem. (Carlos H. Cantu)
3) Qual é o melhor tipo de dado para se trabalhar com valores monetários ?
R: Para não ter problemas com arredondamento, aconselha-se o uso do tipo NUMERIC (9,2) no Interbase 5.6 e anteriores e de NUMERIC(18,2) no Interbase 6.0 Dialect 3. Dessa maneira, o Interbase armazenará os dados com INTEIROS dentro do Banco de Dados, fazendo com que não haja problemas de arredondamento comuns em tipos FLOAT ou DOUBLE. Não esqueça também de setar o flag ENABLE BCD para TRUE no BDE. O campo NUMERIC (9,2) tem capacidade de armazenar valores até 9.999.999,99. (Carlos H. Cantu)
PS: A razão dos arredondamentos nos campos DOUBLE é devido ao fato do Interbase armazenar esses valores no formato definido pelo IEEE, onde é conhecido que números com base-2 nem sempre se convertem corretamente em número de base-10 (Bill Karwin - lista Mers). Veja também o artigo que explica como os números no formato IEEE são gerados e porque os erros de arredondamento acontecem.
PS2: Segue uma mensagem interessante de Geoff Worboys onde ele descreve porque às vezes ainda é melhor utilizar DOUBLES :
Just some notes for clarification... One thing that should be remembered is that there are legitimate uses for DOUBLE as a format for currency, and indeed there are some instances where it is the required form. Specifically, there are some calculations that MUST be done with DOUBLE rather than an exact form such as NUMERIC, because some calculations require that no rounding is performed on the intermediate values, but only on the final result. Indeed some implementations require a specific form of rounding which may not match that automatically performed using NUMERIC. The main point to be aware of when using DOUBLE is to perform your own specific rounding on the value at the appropriate times. Regrettably InterBase does not (yet) provide such functions, but these can be provided by UDF or performed at the client. Generally, if you do specific rounding when required (for example; to two decimal places), then you will avoid rounding errors even if storing the result in the database in this format. Where you _may_ still be impacted by rounding problems is if you try a process (such as summing) on the values for many (thousands) of records using the DOUBLE format. In such instances each value could first be converted to the appropriate NUMERIC format for processing, perhaps at the client if not supported in IB. So... Given that IB v5.x NUMERIC(9,2) is not really large enough for many currency implementations you could legitimately use DOUBLE for storing the values, just remember to do your own explicit rounding and when processing large numbers records you may want to do this at the client using an INT64 based format. If you are using IB v6.x NUMERIC(18,2) then remember that you may need to convert to DOUBLE at times to ensure you do not lose decimal places in the middle of calculations. HTH Geoff |
4) Qual arquitetura (Superserver ou Classic) tem a melhor performance no Linux ?
R: Aqui estão duas respostas da lista de discussão Interbase na MERs que tentam responder essa pergunta :
5) O Interbase suporta campos CASE INSENSITIVE ???
R: O IB não tem suporte direto à campos CASE INSENSITIVE, no entanto, foi lançado uma relação de drivers de COLLATE que fazem com que qualquer campo haja dessa maneira. Para isso basta voce definir a COLLATE apropriada quando for definir um campo no seu BD. Para o português, voce pode utilizar a COLLATE PT_PT_NOCASE ou PXW_INTL850_NOCASE. Pegue os drivers na página http://www.BrookstoneSystems.com/ (Carlos H. Cantu)
6) Qual o tamanho máximo da chave em um índice ?
R: O tamanho máximo da chave em um índice é de 254bytes. Alguns character sets ocupam até 3 bytes por caracter, ex :
3 bytes: UNICODE_FSS
only
2 bytes: GB, SJIS, EUC_J, KSC5601 (eg: all the Asian charsets)
1 byte: *ALL OTHER* character sets.
Um string utilizando uma COLLATE pode ocupar de 1 a 6 bytes por caracter. Sendo assim, se a sua setagem utiliza um set de caracteres/collate que utilizam 3 bytes por caracter, o tamanho da sua chave não poderá ultrapassar 254/3 = 84 caracteres. (Carlos H. Cantu)
7) Onde encontro um driver ODBC para o IB 6 ?
R: Existe um driver ODBC disponível com a instalação do cliente da versão 5.6 do IB. Esse driver irá funcionar com o IB 6 mas os novos tipos de dados não serão suportados. Para baixar o driver visite a página de download em : http://www.interbase.com/open/downloads/5x_eval_kits.html (Retirado do site do Interbase)
Também está disponível um driver ODBC em fase beta. Veja na página de downloads.
8) Posso conectar meu cliente 5.x à um servidor 6.0 (ou vice-versa) ?
R: Ambos os casos são possíveis. Se voce conectar um servidor 6.0 utilizando um cliente 5.x voce não poderá utilizar os novos recursos do IB 6 (como os tipos DATE, TIME, os comandos ALTER TABLE, etc...).
O cliente 6.0 também pode se conectar à um servidor 5.6 mas quando houver uma conexão haverá um aviso que o dialeto utilizado será o Dialeto 1. Para não obter essa mensagem voce deve setar o dialeto para 1 antes de conectar o BD. Ex :
SQL> set sql dialect
1;
SQL> connect 5x_server:/usr/interbase/examples/database/employee.gdb;
(Retirado do site do Interbase)
9)Quando tento conectar ou registrar um BD obtenho a mensagem DPB Constant(0) is unknown. Oque é isso ?
R: Voce deve atualizar sua versão do IBConsole. A que acompanha o primeiro release do IB6 está com bugs. Pegue a nova versão aqui (ou então um console alternativo, como o IB_WISQL, Marathon, QuickDesk, etc...). (Carlos H. Cantu)
10)Onde eu encontro o IBReplicator para fazer replicação de dados no IB ?
R: O IBReplicator foi desenvolvido pela Synectics Software e pode ser encontrado em http://www.synectics.co.za. PS: Ele não é Open Source nem grátis.
11)O que devo usar, CHAR ou VARCHAR ?
R: A regra é : Utilize CHAR somente para campos onde voce saiba o tamanho exato da informação que será armazenada e que esse tamanho seja fixo. Por exemplo, um campo que armazenará a sigla de um estado sempre utilizará 2 caracteres, portanto use CHAR(2) nesse campo.
Utilize o VARCHAR quando o tamanho da informação que será armazenada é variável (ex : Nomes, endereços,etc...) e quando voce não se importa com o fato dos strings retornarem exatos (sem espaços em branco no final). Via de regra, utilize VARCHAR sempre, a não ser que voce tenha um motivo que justifique o seu não uso.
Utilize CHAR quando voce estiver definindo tabelas externas. O Varchar contém 2 bytes de informação que armazenam o tamanho do string e que causa algumas chateações nos editores de texto quando exibidos. (Adaptação por Carlos H. Cantu de uma resposta dada por Ann Harrison na lista MERs)
12)Quando devo colocar ":" nos comandos SQL ?
R: Resposta curta : São requeridos antes dos nomes de variáveis locais pelo parser de stored procedures e triggers, no contexto onde eles podem ser interpretados como nome de colunas. Mais detalhes :
Por exemplo:
create table t (a integer, b integer);
create procedure
p (b integer)
as
begin
update t set
a = b;
update t set a = :b;
end
Voce pode notar que os 2 comandos tem significados bem distintos, dependendo de como o parser reconhecer b como uma variável local (parâmetros contam como variáveis locais) ou como uma coluna.
Agora considere um outro exemplo :
create procedure
p (c integer)
as begin
update t set
a = c;
update t set a = :c;
end
Aqui, o primeiro update é sintaticamente correto, mas semânticamente incorreto, pois a coluna c não existe na tabela. Voce vai obter um erro quando executar o comando. No entanto, com o ":", o parser irá reconhecer c como uma variável local.
Em casos onde voce está usando variáveis locais fora de um comando SQL, por exemplo em um comando de atribuição ou expressão condicional, não há necessidade do ":". Ex :
c = c + 1;
if (c > 10) then ...
Esses tipos de expressões não podem referenciar colunas em tabelas, portanto não há possibilidade de uma interpretação errada. Se voce usar subqueries com expressões, então há novamente a necessidade de utilizar o ":". (Bill Karwin - lista MERs)
13) É possível ter instalado o IB 6 e o IB 5 em um mesmo computador ?
R: Sim, mas não é possível ter os dois rodando ao mesmo tempo e as versões devem ser instaladas em diretórios diferentes.
No Windows : Tenha cuidado para saber qual a GDS32.DLL que está ativa no seu diretório System. Para simplificar o processo, crie cópias da GDS32.DLL do IB 5 e do IB 6. Antes de iniciar uma determinada versão do servidor, certifique-se que a DLL correta está no diretório system do Windows. Venho utilizando essa configuração com sucesso. (Carlos H. Cantu)
Resposta "oficial" enviada por Bill Karwin na lista MERs : Strictly speaking, you can have multiple GDS32.DLL's in your path, but applications search for DLLs in the order the directories occur in the PATH environment variable. As long as the _first_ GDS32.DLL that your app finds is the right one, you're all right. :-) To run
multiple versions of IB on Win32, I do this:
This renaming
is necessary because the registry keys point to the 'InterBase' location.
Renaming directories is easier than editing the registry. No Linux : (resposta de "David Brookstone Schnepper" na lista MERs) On Unix,
we used to do this all the time in development (for classic architecture).
For super-server,
you need to start the server listening on a different port. Then connect
to it with connect server: Summary: it's possible, there's a lot of rough edges, it can be cleaned up quite a bit, and NEVER do it on your production server! |
14) Como posso proteger meu banco de dados para que outras pessoas não tenham acesso ao meu arquivo GDB ?
R: Os passos são os seguintes :
1) Certifique-se que o arquivo GDB está localizado em um diretório liberado apenas para o ROOT e o processo do servidor. Isso vai inibir que algum usuário copie o arquivo.
2)Crie um Role com o nome de SYSDBA, o que vai previnir que algum usuário use o nome do SYSDBA. Isso só vai funcionar se voce seguiu o passo 1, pois senão qualquer um poderá editar o arquivo GDB com um editor de texto e remover o role SYSDBA. (Resposta enviada por Phil Shrimpton na lista MERs)
Outra resposta enviada por Dalton Calford :
This is a known
issue, there are methods of dealing with it, from manually creating a role called
sysdba (this will keep out the average user) to creating triggers on all system
tables to prevent SYSDBA from doing anything to the database. You can hide your
trigger and procedure code and use level 4 or 5 normalization to prevent a easy
reverse engineering.
best regards
Dalton
15)Como posso fazer para saber se existe algum valor duplicado em um campo antes de torna-lo uma primary key ?
R: Execute o seguinte comando (Bill Karwin) :
SELECT * FROM MEMBILL
M1, MEMBILL M2
WHERE M1.NAME = M2.NAME AND M1.RDB$DB_KEY != M2.RDB$DB_KEY
16)Acabei de instalar o IB 6 for Linux. Como faço para startar o servidor ?
R: A documentação do IB explica como inicializar o servidor IB na versão SuperServer. Existe também a versão Classic do IB 6.0 para o Linux.
VERSÃO CLASSICA
Não há um método único de inicializar o servidor.
A versão classic do IB 6 utiliza o processo inetd para aguardar futuras
conexões. Portanto, para ter certeza de que voce instalou corretamente
o IB, voce pode executar o seguinte comando :
netstat -a |grep gds_db
Voce deve ver um item para gds_db no estado de espera (LISTEN). Isso significa que o inetd está no aguardo de requisões de conexão. O script de instalação insere uma linha no arquivo /etc/inetd.conf configurando o inetd para esperar por pedidos de conexões na porta do Interbase (gds_db = 3050) e dividir o processo gds_inet_server para cada pedido de conexão. Portanto, não há nada para ser inicializado.
Para testar uma conexão, rode o isql e conecte ao bando de dados de exemplo chamado employee.gdb
$> /usr/interbase/bin/isql
Use CONNECT or CREATE DATABASE to specify a database
SQL> connect /usr/interbase/examples/employee.gdb;
Database: /usr/interbase/examples/employee.gdb
SQL> show tables;
COUNTRY CUSTOMER DEPARTMENT EMPLOYEE EMPLOYEE_PROJECT JOB PHONE_LIST PROJECT
PROJ_DEPT_BUDGET SALARY_HISTORY SALES
SQL>
(Extraído do IBPhoenix InterBase® KnowledgeBase).
17) Como posso apagar um Generator ?
R: Voce pode remover um generator anteriormente criado utilizando a seguinte instrução SQL :
DELETE
FROM RDB$GENERATORS
WHERE RDB$GENERATOR_NAME = 'NOME_DO_SEU_GENERATOR';
(Carlos H. Cantu)
18) Exemplo de UDF para utilizar em tabela de plano de contas
R: Click aqui para dar o download dos arquivos zipados. (Rotinas de Daniel Pereira Guimarães).
20) Como usar campos Boolean no Interbase ?
R: O Interbase não possui um tipo lógico de dado lógico (boolean). No entanto, isso é facilmente resolvido utilizando um DOMAIN para simular um tipo boolean :
CREATE DOMAIN LOGICO AS CHAR(1) DEFAULT 'N' NOT NULL CHECK (VALUE IN ('S','N'));
Nesse caso voce usaria os valores S para SIM e N para não. Voce também pode optar por usar um SMALLINT ao invés de um tipo CHAR :
CREATE DOMAIN LOGICO AS SMALLINT DEFAULT 0 NOT NULL CHECK (VALUE IN (0,1));
21) Interbase 6.0.1 não inicializa no Red Hat Linux 7.0
R: Esse problema é devido ao fato do pacote original do Red Hat 7.0 vir acompanhado de bibliotecas do Glibc em fase beta. Aplique as atualizações encontradas no site da Red Hat (http://www.redhat.com/errata) para resolver o problema.
22) Como passar um grupo de valores para ser usado em uma Stored Procedure ou uma Query parametrizada ?
R: Muitas pessoas gostariam de poder fazer algo do tipo :
select * from vendas where cartao in (:cartoes);
e passar o valor do parâmetro "cartoes" em run-time. Obviamente isso não é possível, mas há uma maneira de fazer algo equivalente usando LIKE ao invés de IN :
select * from vendas where :cartoes like '%' || cartao || '%'
Retirado da Borland
Community - autor Wayne Niddery
23) Como simular um travamento pessimista
usando IBX ?
Certifique-se que a opção Autocommit esteja em OFF.
Cheque se a transação está InTransaction e se estiver de um commit (e se houver uma exceção, rollback).
Dentro de um loop faça o seguinte :
De um Start na
transação.
Defina o comando SQL que vai travar o registro (por exemplo : update ATable
set pkfield=pkfield where pkfield = :pkfield).
De um Prepare no comando de trava.
Passe o parâmetro necessário (no exemplo, pkfield)
Execute o comando de trava.
Se voce obter uma exceção de conflito de compartilhamento, de
um rollback na transação e re-inicie o Loop, senão saia
do loop.
Se a transação
continua InTransaction então voce conseguiu travar o registro.
A partir daí,
faça o seguinte :
Se necessário coloque o dataset em modo de edição.
Quando estiver pronto para atualizar os dados:
Se o comando de atualização (update) estiver preparado então
desprepare-o (mude Prepared para false).
Prepare o update.
Atribua os valores aos parâmetros conforme necessário.
Execute o update.
De um Commit e em caso de exceção de um rollback. (Nesse estágio,
se voce obteve uma exceção não foi devido à um conflito
de compartilhamento mas sim devido à qualquer outro motivo).
Essa estratégia mantém o registro travado até que a transação seja finalizada.
Reconheça que, em um ambiente multiusuário com alto nível de concorrência, o método de travamento pessimista irá influir negativamente na performance. Se sua aplicação permite que um usuário vá almoçar deixando uma transação aberta eles com certeza irão querer a sua cabeça. Se eu tivesse a necessidade de usar travamento pessimista nesse tipo de ambiente então com certeza eu iria repensar no meu design.
Resposta enviada por Helen Borrie no forum de Interbase.
PS: Logo após a postagem dessa mensagem, Ann Harrison, a "mãe" do Interbase deu as seguintes opniões :
Seria melhor utilizar uma transação configurada como WAIT no Loop acima pois eliminaria muitas interações desnecessárias.
Ao invés de usar uma transação no-wait e desperdiçar o tempo do servidor, porque não postar uma mensagem periodica para o usuário dizendo que voce "continua vivo" ?
24) Como retornar somentes o X primeiros (últimos,etc...) registros de uma tabela ?
Veja o exemplo abaixo... variando-se o comando select (alterando-se a clausula where, order by, etc...) pode-se obter os últimos X registros, etc... etc...
CREATE PROCEDURE
RETORNA_X_REGISTROS (NUM_ROWS INTEGER)
RETURNS (lista de campos que voce quer que retorne)
AS
declare variable counter integer;
begin
counter = 0;
for select (campos que voce quer que retorne)
from Sua_Tabela
order by campo_chave_primária
into
:Variaveis de retorno que recebem o valor dos campos acima
do begin
if (:counter >= :NUM_ROWS) then exit;
suspend;
counter = counter + 1;
end
end
25) Qual a diferença entre SWEEP e Garbage Collection ?
Um sweep inclui uma garbage collection - todos os registros no banco de dados são visitados e limpos de necessário. Um sweep também reseta a OIT (Oldest Interesting Transaction) pois ele desfaz qualquer alteração feita por uma transação que não foi commitada - portanto ele pode mudar o seu status para commitada.
Garbage collection é um processo contínuo no banco de dados. Toda a vez que uma transação visita um registro, ela examina o registro e faz a sua limpeza de se necessário. Na versão SuperServer do IB 6, a transação chama uma thread especial que é utilizada somente para fazer essa função. Em outras versões, a transação faz as alterações ela mesma. (Ann Harrison - lista IB-support no YahooGroups)
26)
Como instalar o IB 6 no Linux Conectiva
?
De: Vinicius
Gallafrio <gallafrio@i...> Data: Ter, 24 de Out de 2000 7:00pm Assunto: Re: [IB-BR] Linux/IB- não consigo !!
# echo "localhost" > /etc/hosts.equiv
USANDO O
IB6 Para parar: # /usr/interbase/bin/ibmgr -shut -user sysdba -password masterkey Agilizando
o Log:
FIM |
27) O Segment size de um Blob influencia no limite de tamanho do mesmo ?
Não. Um blob pode utilizar quantos segmentos forem necessários para armazenar os dados. A função dessa opção no interbase pode estar mais relacionada com a performance na recuperação dos dados do que no armazenamento do mesmo. Abaixo segue uma resposta de Bill Karwin :
A opção segment é quase que sem sentido. Voce pode ter blobs com segmentos de tamanho variável, e um aplicativo pode requisitar um blob através de segmentos de tamanhos diferentes ao que foi definido na criação do campo. A opção de segment size é praticamente consultiva para aplicativos que que armazenam e recuperam blobs automaticamente, com o por exemplo a BDE e o grpe.
28) Como evitar erros de arredondamento em cálculos com o IB
(Inspirado em uma resposta enviada por Ann Harrison)
Muitas pessoas enfrentam problemas com o armazenamento e cálculo de valores em ponto flutuante no Interbase.
Durante o desenvolvimento do IB6, foi decidido que os cálculos deveriam ser feitos utilizando-se o tipo numérico do resultado (inteiro ou float) internamente. Nas versões anteriores, todos os cálculos internos eram feitos usando-se o tipo Double Precision, e posteriormente o resultado era convertido ao tipo de dado do resultado. Para quem usa o dialeto 3, isso não causa muito problema pois ele pode utilizar inteiros de 64bits durante os calculos intermediários. Para quem usa o dialeto 1 isso pode ser desastroso porque muitos cálculos extrapolam o limite de 32bits dos inteiros. Infelizmente, a checagem de overflows não foi codificada corretamente. Cálculos com resultados intermediários muito grandes para o tipo de resultado podem produzir valores bizarros e inesperados.
Ao mesmo tempo, as regras de precisão decimal foram apertadas, fazendo com que por exemplo, ( 1 / 2 ) * 2 = 0.
Só Deus sabe qual foi o tipo de dado utilizado para campos calculados. Talvez tenha se escolhido um tipo não apropriado e provavelmente baseado em inteiros.
Note também que bancos anteriormente criados no dialeto 1 ou em versões do IB anteriores à 6.0 quando convertidos para o dialeto 3 continuam mantendo o mesmo comportamento de armazenamento em relação aos campos que já existiam no Banco de Dados. Por isso é aconselhável que ao invés de simplesmente trocar o dialeto de um banco de 1 para 3, voce crie um novo banco de dados no dialeto 3 com a metadata extraida do banco original. Depois, usando uma ferramenta de PUMP (como por exemplo o IBDataPump) voce pode transferir os dados do banco antigo para o novo.
Uma dica para evitar os erros de arredondamento em calculos feitos em triggers em bancos utilizando o dialeto 1 é voce usar um CAST no cálculo do valor. Por exemplo, ao invés de fazer o cálculo da seguinte forma
NEW.TOTAL = NEW.A + NEW.B - NEW.C (supondo que os 4 campos sejam do tipo NUMERIC 15,2)
voce deve faze-lo assim :
NEW.TOTAL = CAST((NEW.A + NEW.B - NEW.C) AS NUMERIC(18, 2))
Aparentemente isso funcionaria devido ao fato de se estar estabelecendo um resultado do tipo float.
PS: No firebird, o comportamento dos cálculos para BDs no dialeto 1 foi revertido para o que era usado nas versões anteriores do IB 6.
Para mais informações, veja também a dica 3.
29) O Interbase é realmente FREE ?
SIM e NÃO ! Hoje existem versões do Interbase que são FREE, ou seja, podem ser baixadas da Internet, distrbuídas e utilizadas gratuitamente e não possuem qualquer restrição quanto ao número de usuários. Atualmente as versões FREE são :
Interbase 6 Open
Source (Borland)
FireBird 1.0 (Comunidade Open Source)
Depois de ter aberto o código do Interbase, a Borland resolveu disponibilizar versões certificadas por ela para aqueles clientes que desejarem ter um respaldo da Borland na utilização do produto. As versões certificadas do Interbase NÃO são gratuitas e seguem o mesmo esquema de licenciamento que as versões anteriores do IB tinham. Segundo a Borland, as versões certificadas tem algumas diferenças da versão Open Source, como por exemplo o fato de virem acompanhadas de driver ODBC, suporte da Borland, etc... No que diz respeito aos bugs, a Borland diz que eles estão sendo corrigidos tanto nas versões certificadas como na versão Open Source.
Depois que a Borland lançou as versões certificadas ela parou de atualizar os binários da versão Open Source. Isso significa que para ter um IB atualizado voce precisa baixar o código e compila-lo em sua máquina, ou acessar um site que lhe ofereça o IB já compilado (como por exemplo http://mers.com).
O FireBird, derivado do IB e totalmente compatível com o mesmo, está sendo desenvolvido pela comunidade Open Source e já ganhou novos recursos e muitas correções de bugs ! Sem dúvida nenhuma é uma ótima alternativa ! Voce pode baixar o FireBird em www.ibphoenix.com.