Jump to content

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

Recommended Posts

Posted

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]

Posted

@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]

  • Moderadores
Posted
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 ; ^


 

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

Projeto ACBr

 

 

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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.