Conexao exclusiva com o banco

Firebird

30/11/2004

Ola para todos. Eu migrei recentemente pra o DBEXPREX minha aplicacao que usa um banco firebird 1.5... bem eu por força das circustancias tenho muitas vezes criar tabelas dinamicamente... ate ai tudo bem .. eu as crio sem maires poblemas.. mas no momento em que vou criar chaves estrangeiras ... na maioria das vezes recebo a mensagem de erro ´object in use´ o poblema e que sempre so eu estou logado no banco e nem mesmo estou com a dita tabela aberta... haveria uma maneira de que este erro nao acontecese ou mesmo que houvese alguem eu conseguise acesso direto a esta tabela ou seja acesso exclusivo de modo que ela ficase bloqueada para que eu a altere


Wilson Luz

Wilson Luz

Curtidas 0

Respostas

Vinicius2k

Vinicius2k

30/11/2004

Colega,

Como exatamente vc faz esta criação? Através da aplicação ou de uma ferramenta externa?
Vc, *provavelmente*, está recebendo esta mensagem porque existe alguma transação pendente envolvendo o objeto que vc pretende alterar...

T+


GOSTEI 0
Wilson Luz

Wilson Luz

30/11/2004

bem.. eu utilizo uma SQLQuery comum e passo os comando um a um...
tipo coisas assim
REATE TABLE AUX_00(
AUX_00_CODIGO INTEGER NOT NULL,
AUX_00_CLIE_EMP INTEGER,
AUX_00_CLIENTE INTEGER ,
AUX_00_NOME VARCHAR(10));

COMMIT WORK;

alter table AUX_00
add constraint PK_AUX_000
primary key (AUX_00_CODIGO) ;
COMMIT WORK;

ALTER TABLE AUX_00
ADD CONSTRAINT AUX_00_CLI_FK FOREIGN KEY (AUX_00_CLIE_EMP,AUX_00_CLIENTE) REFERENCES CLIENTE (CLI_EMP_ID, CLI_ID) ON DELETE CASCADE;
COMMIT WORK;

funciona bem o unico poblema se ma criacao da chave estrangeira quando a tabela CLIENTE esta foi aberta em qualquer transacao... mesmo de select .... eu uso o ibexpert ... acontece que mesmo fechando o ibexpert fechando a aplicacao... o erro de object in use permanece ...ao que parece o banco mantem um registro que a tabela esta em uso mais aparentemente isto nao e muito eficiente ja que mesmo fechando a aplicacao que fez uso da tabela este estatus nao e atualizado.. unica solucao que tenho encontrado e dar um shutdown no banco... o servidor e local em minha maquina e ....dai ao executar novamente funciona bem ... vi uma materia uma vez que explicava como desconectar uma tabela especifica usando comandos de baixo nivel da propia gds32 .. mas nao sei mais onde esta este material.... pois pelo que eu entendi isto seria o ideal pra mim por que na minha aplicacao eu sempre estou criando estas tabelas temporarias e sempre com realacionamento na tabela de CLIENTES dai eu simplesmente forcaria um shutdown

GOSTEI 0
Wilson Luz

Wilson Luz

30/11/2004

nesta tabela e o poblema estaria resolvido.... bem pelo meos e o que imagino..
GOSTEI 0
Vinicius2k

Vinicius2k

30/11/2004

Colega,

O ideal nestes casos, é que vc utilizasse um componente de execução de scripts, como o IBScript (Paleta IBX).
Não garanto que vá funcionar, mas tente fazer o seguinte...
Uma instrução por vez na SQLQuery abrindo e commitando a transação em cada uma delas...
Ex:
1. abre transação -> cria tabela -> commit transação
2. abre transação -> cria a PK -> commit transação
e etc...
No meu ponto de vista é a própria aplicação que está ´travando´ a tabela porque CREATE e ALTER estão dentro da mesma transação... acho que vale a pena testar...

T+


GOSTEI 0
Weber

Weber

30/11/2004

O commit não pode estar dentro do Script, você deve usar IBTransation.Commit.


GOSTEI 0
Wilson Luz

Wilson Luz

30/11/2004

bem estive testando com as sugestoes dos colegas, e cheguei a uma observacao importante notei que indiferente a comitar cada linha de execucao do script por fora ou dentro do script o erro se reptia quando estava com o ibexpet aberto... mesmo sem nehuma tabela aberta ou transacao ativa ... apenas conectado na base... ao dar um disconect from database magicamente o escript funciona.... dai cheguei a conclusao que o ibexpert executa select no metadados do banco para montar aquele treview com informacoes da estrutura das tabeleas,trigers..etc. Dai que evidentemente pra isto ele inicia uma transacao na qual todos os objetos do banco inclusive tabelas sao mencionado... de modo que o banco com razao.. informa que o objeto esta em uso pois uma transacao envolvendo o objeto ´CLIENTES´ esta de fato em execucao.... bem acho que o aplicativo(IBEXPERT) devereia fechar esta transacao. mas pelo visto nao e o que acontece...pois conforme eu observei e so fechar a conexao com ele que tudo funciona...


GOSTEI 0
POSTAR