Conexao exclusiva com o banco

30/11/2004

0

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

Responder

Posts

01/12/2004

Vinicius2k

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+


Responder

01/12/2004

Wilson Luz

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

Responder

01/12/2004

Wilson Luz

nesta tabela e o poblema estaria resolvido.... bem pelo meos e o que imagino..
Responder

01/12/2004

Vinicius2k

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+


Responder

01/12/2004

Weber

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


Responder

02/12/2004

Wilson Luz

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...


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar