Trabalhando e configurando um banco de dados padrão ANSI
- Para criar uma base que segue o padrão ANSI, utilizar a sintaxe WITH LOG MODE ANSI no CREATE DATABASE, ex.:
CREATE DATABASE db_teste IN dbsDados WITH LOG MODE ANSI; - Para verificar se um banco é ANSI há duas maneiras:
- SELECT name,is_ansi FROM sysmaster:sysdatabases
- Logo após conectar no banco , na variavel SQLCA.SQLWARN[3] ="W" - Todo banco ANSI é unbuffered para garantir maior segurança para recuperar dados. Não é possível força-lo para buffered nem remover o log de transação.
- Pode-se converter NÃO-ANSI (log, nolog, buflog) para ANSI basta utilizar o ontape ou ondblog
- Não é possível trocar um banco ANSI para NÃO-ANSI. Caso seja necessário faze-lo, será preciso exportar o banco e reimportar através de algum utilitário ( dbexport/dbimport, unload/load , HPL).
- ATENÇÃO: Muito cuidado quando é dado um grant de banco de dados para um usuário em um banco modo ANSI.Devido o padrão de Caixa Alta/Baixa ser diferente do banco NÃO-ANSI, ou seja, quando não é utilizado aspas para descrever o nome do usuário, pode ocorrer diferenças:
- O nome cmartins no padrão ANSI não é igual ao cmartins do padrão NÃO-ANSI.
- Quando um objeto é criado , nenhum privilégio é criado, sendo assim apenas o owner (dono) tem acesso ao objeto.
- O dono (owner) de um objeto deverá ser sempre informado ao acessa-lo, ex.:
select * from cesar.tabela_xyz.
A unica exceção é quando o usuário é dono do objeto que está acessando. - Não é necessário utilizar o BEGIN WORK para iniciar uma transação porque nele todo DML é considerado que faz parte de uma transação. Porém é necessãrio executar um COMMIT WORK para informar quando finalizar uma transação.
- O isolamento de transação padrão é o Repeatable Read.
- O isolamento de transação possui algumas diferenças do recurso do Informix:
- Não é permitido mudar o isolamento no meio de uma transação.
- Ao alterar o isolamento de transação, este é válido apenas até o fim da transação após isso o isolamento volta para o padrão do banco.
OBSERVAÇÃO: Testado na prática (Linux IDS 11.50 UC1de), isso não ocorreu!
- SQL
- O mesmo SQL (DML) deverá executar no NÃO-ANSI e ANSI , mesmo que o comando seja uma extenção do Informix.
- Todo cursor declarado em um banco ANSI é por padrão um "FOR UPDATE" , limitando assim os recursos utilizados no SELECT em questão (não pode ter funcões de agrupamento como distinct, sum e não pode ter mais de uma tabela. Para um select com estes recursos é necessário especificar o parametro FOR READ ONLY no final do select. Em um banco NÃO-ANSI o padrão é read only.
- Todos os sinonimos criados em um banco ANSI são PRIVATE e não é possivel mudar isso. Se tentar passar o parametro PUBLIC , irá ocorrer um erro de syntaxe.
- É possível verificar se um SQL está de acordo com o padrão ANSI quando executado com o DBACCESS. Basta definir a variavel DBANSIWARN=1 ou passar o parametro "-ansi" no dbaccess quando executa-lo por linha de comando. assim o dbaccess retorna um WARNING e o código de SQLSTATE (ver manual SQL Syntax: get diagnostics) exemplo:
echo "select * from teste" | dbaccess -ansi banco_ansi ; dbaccess -ansi banco_ansi arquivo.sql ;
- Comportamento dos tipos de dados (data type):
- Em banco ANSI, para campos caractere (CHAR, LVARCHAR,NCHAR,NVARCHAR,VARCHAR) se o usuário informar um valor maior que o especificado no campo o banco retorna erro. Em banco NÃO-ANSI o valor é simplismente truncado.
- Em banco ANSI para campos DECIMAL, na definição da tabela se não for especificado a parte fracional em um campo o valor padrão será 0 (zero), sendo assim será armazendo apenas numeros inteiros, por exemplo:
DEC(10) = DEC(10,0). Em um banco NÃO-ANSI o padrão é 16.
- Caracteres "escapados" (escape), são válidos apenas para caracteres especiais: "%","_" e o próprio escape "\\"
- In ANSI-compliant databases, SELECT, DELETE, UPDATE, and INSERT statements all set SQLCODE to 100 if no rows are returned.
- 622 leituras
Tags:





Comentar