Ir para conteúdo
  • Cadastre-se

dev botao

Firebird - SET NOT NULL


  • Este tópico foi criado há 2394 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Bom dia a todos,

Estou fazendo um refatoring no meu software, entre as modificações alguns campos devem ser not null.

Bem, o que acontece é que sou uma software house, ou seja, tenho vários banco de dados.

Eu utilizo Firebird, tenho algo em torno de 80% em FB 2.5.x e o restante em 3.0.x.

 

Bem, meus sistemas se atualizam de forma automatica, tenho uma aplicação que baixa a nova versão e roda um script no banco atualizando tudo, entretanto barrei num problema complexo com o Firebird agora.

Na versão 3.0 é permitido usar SET NOT NULL, logo posso usar da seguinte forma:

ALTER TABLE [tabela] ALTER COLUMN [coluna] SET NOT NULL;

Entretanto na versão 2.5 o código acima não funciona, então tenho que usar desta forma:

UPDATE RDB$RELATION_FIELDS SET RDB$NULL_FLAG = 1 WHERE (RDB$FIELD_NAME = 'campo') AND (RDB$RELATION_NAME = 'tabela');

Mas o update em tabelas de sistema não é permitido no FB 3.0.x.

 

Existe alguma solução para isto que eu possa usar num script. Em ultimo caso vou usar o script da 2.5.x e deixar que o erro aconteça nos clientes que estejam na versão 3.0.x minimizando o problema,

mas isso vai "quebrar" meus scripts posteriormente.

 

Att, Marcos

Marcos Gerene

[email protected]

Link para o comentário
Compartilhar em outros sites

@BigWings

 

Obrigado pela atenção, meu script é basicamente um arquivo txt separado por # que rodo no banco.

ex:

ALTER TABLE CLIENTE ADD CLI_ID INTEGER NOT NULL;
#
ALTER TABLE PRODUTO ADD PROD_ID INTEGER NOT NULL;

Eu leio isso, faço um split com # executo ação a ação.

 

Como eu poderia usar o recurso que me falou neste caso, pode me dar um exemplo?

Marcos Gerene

[email protected]

Link para o comentário
Compartilhar em outros sites

  • Moderadores
10 minutos atrás, Marcos Gerene disse:

@BigWings

 

Obrigado pela atenção, meu script é basicamente um arquivo txt separado por # que rodo no banco.

ex:


ALTER TABLE CLIENTE ADD CLI_ID INTEGER NOT NULL;
#
ALTER TABLE PRODUTO ADD PROD_ID INTEGER NOT NULL;

Eu leio isso, faço um split com # executo ação a ação.

 

Como eu poderia usar o recurso que me falou neste caso, pode me dar um exemplo?

Pelo que entendi o # é apenas para controlar as execuções de comandos individuais...

Você pode criar uma procedure ou usar um execute block:

set term ^ ;

execute block
as
  declare variable VERSAO_FB_SERVIDOR varchar(20);
  declare variable STTMNT varchar(200);
begin

  STTMNT = '';
  select rdb$get_context('SYSTEM', 'ENGINE_VERSION') from rdb$database into :VERSAO_FB_SERVIDOR;

  if (VERSAO_FB_SERVIDOR like '3.0.%') then
    STTMNT = 'alter table TABELA alter CAMPO set not null;';
  else if (VERSAO_FB_SERVIDOR like '2.5.%') then
    STTMNT = 'update RDB$RELATION_FIELDS set RDB$NULL_FLAG = 1 where (RDB$FIELD_NAME = ''campo'') and (RDB$RELATION_NAME = ''tabela'');';

  if (STTMNT <> '') then
    execute statement STTMNT;

end^

set term ; ^


 

  • Curtir 2
Equipe ACBr BigWings
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

 

 

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 2394 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.