Fórum Tem como criar relacionamento com o BD em uso??? #45352
06/07/2004
0
Sei que da para criar / alterar e até ecluir campos com banco de dados em uso.
Porem não estou conseguindo criar um relacionamento com o banco de dados em uso.
Tentei:
ALTER TABLE ´PROD_DESC1´ ADD FOREIGN KEY (´CODPROD´) REFERENCES ´PRODUTOS´ (´CODIGO´) ON UPDATE CASCADE ON DELETE CASCADE;
E aparece:
unsuccessful metadata update.
object PRODUTOS is in use .
Tem como criar este relacionamento, sem que meus clientes tenham que fechar o sistema em todos os micros?
Larry
Curtir tópico
+ 0Posts
07/07/2004
Maicongabriel
Reveja seus conceitos amigo!
Nunca trabalhe sobre uma base de ´produção´!
Efetue uma cópia desta base e faça seus testes/alterações sobre ela e não sobre o banco de dados que o seus usuarios estao utilizando; Não é correto, não é seguro. :roll:
Gostei + 0
07/07/2004
Rodolpho123
Gostei + 0
07/07/2004
Larry
Reveja seus conceitos amigo!
Nunca trabalhe sobre uma base de ´produção´!
Efetue uma cópia desta base e faça seus testes/alterações sobre ela e não sobre o banco de dados que o seus usuarios estao utilizando; Não é correto, não é seguro. :roll:[/quote:5148e57a05]
Valeu pela dica,
Quando a exlcuir um campo é claro que não irei fazer com o sistema em uso, mas quando a adicionar um campo novo é muito comum e alterar o tamanho de um já existente é meio raro.
Não é aconselhavel faze-lo com o sistema em uso? pode haver corrompimento?
Gostei + 0
07/07/2004
Larry
Mesmo incluir campo novo (oque é muito comum) no sistema em uso pode corromper o banco de dados?
Gostei + 0
09/07/2004
Bon Jovi
Nao concordo... Ruim é o SGDB que está usando.
Gostei + 0
09/07/2004
Bon Jovi
´Corromper fácil´ é da natureza deste SGDB, infelizmente.
Gostei + 0
09/07/2004
Maicongabriel
Nao concordo... Ruim é o SGDB que está usando.[/quote:e4c641aeb3]
Que mania cara :evil:
Se você não gosta de IB/FB, porque frequênta o forum :?
Gostei + 0
09/07/2004
Afarias
Tais comentários revelam apenas sua total falta de conhecimento do Interbase ou Firebird ou qualquer outro SGBD-R.
Se vc quer aprender um pouco sobre essas ferramentas (como todos nós q frequentamos este fórum), acompanhe o fórum de mente aberta e leia mais para ter embasamento no que fala -- ninguem gosta de comentários vazios e sem comprometimento.
Todos aqui estão interessados em aprender e tirar o máximos destes [b:8f9be4aecd]super[/b:8f9be4aecd] bancos de dados -- grandes empresas a décadas o utilizam e não é possível q vc do alto de seu leigo entender queira desfazer isso.
Toda ferramenta tem seus prós e contras, estamos aqui tentando tirar o máximo dos ´prós´ do IB e/ou FB e contornar da melhor forma seus ´contras´ -- quem frequenta este grupo está buscando SOLUÇÃO -- solução com IB ou FB -- se vc não pode dar isso, ninguem vai ficar chateado por vc se abster.
Obrigado pela sua compreensão,
T+
Gostei + 0
09/07/2004
Rodolpho123
Disse tudo, Afarias. Esperamos que o nosso ´amigo´ adote esta mensagem...
Sem mais....
Gostei + 0
09/07/2004
Rodolpho123
Tudo é possivél. Mas eu aconselho assim: Quando for fazer qualquer modificação na estrutura do BD, 1º faça um BackUp e 2º proceder com a sua modificação. Desta forma, as chances de uma possível corrupção de BD é muito rara.
Gostei + 0
28/03/2008
Vitor Alcantara
Aproveitando o tópico ja aberto, gostaria de expressar minha dúvida.
Vez por outra tenho que fazer alterações em um BD (Firebird 1.5) de um sistema meu, dai desenvolvi um sisteminha de atualizações bem simples.
Tenho uma tabela no meu sistema com os seguintes campos.
Tab_Versao ( Tabela = VarChar(50), Versao = Integer, Descricao = VarChar(255), Tipo = Char(1) )
Nessa tebela eu guarda a versão atual de cada objeto (Tabelas, Procedures e Triggers) no meu banco de dados.
E tenho em meu executavel vários scripts de atualizações (IbScript) com a seguinte nomenclatura:NomeObjeto_Versao.
Ex: PRO_1 PRO_2; PRO_3 onde cada um é um script referente as atualizações feitas em cada versão.
Dai em meu sistema tenho um mecanismo que faz a varredura da versão que ta gravada no executavel com a versão do BD.
Exemplo no meu executavel tenho a versão 3 de uma tabela e na tab_versao tem a versão 1,
Então eu executo na seguinte ordem PRO_2 e depois PRO_3.
Estava tudo correndo bem até o dia em que tive de fazer a seguinte alteração em uma tabela do meu BD.
Corpo do Script.:
alter table FIN_CAIXA add constraint FK_FIN_CAIXA_FIN_CONTA1 foreign key (FINH_CODCONTA1,FINH_CODEMP) references FIN_CONTA(FINC_CODIGO,FINC_CODEMP); alter table FIN_CAIXA add constraint FK_FIN_CAIXA_FIN_CONTA2 foreign key (FINH_CODCONTA2,FINH_CODEMP) references FIN_CONTA(FINC_CODIGO,FINC_CODEMP); alter table FIN_CAIXA add constraint FK_FIN_CAIXA_FIN_CONTA3 foreign key (FINH_CODCONTA3,FINH_CODEMP) references FIN_CONTA(FINC_CODIGO,FINC_CODEMP); UPDATE TAB_VERSAO SET VERSAO =3 WHERE TABELA = ´FIN_CAIXA´;
Isso é feito da seguinte forma.(no Delphi)
1:Dou um StarTransaction ;
2:verifico e fasso as alterações nescessárias.
3:Caso de sucesso dou um COMMIT em caso de erro dou um ROLLBACK.
Só que nessa atualização que mostrei acima no script ocorre o seguinte erro
[b:eb11373e13]´Project DSEstoque.exe raised exception class EIBInterBaseError with message ´unsuccessful metadata update
object FIN_CONTA is in use ´.´[/b:eb11373e13]
Li em outros posts desse forum que se eu colocasse COMMIT WORk; após cada alteração feita no BD daria certa, dai fiz isso em cada final de alteração, mais o erro persiste.
Pessos aos amigos mais experientes que se puderme me dar uma luz de como corrigir isso, pois não seria legal ter que ir em cada cliente e executar o comando via IbExpert (que funciona perfeitamente o script).
PS: Estou utilizando Delphi 2007 e componentes de conexão da palheta Interbase.
olha o script das duas tabelas envolvidas.
CREATE GENERATOR GEN_FIN_CAIXA; CREATE TABLE FIN_CAIXA ( FINH_CODIGO INTEGER NOT NULL, FINH_CODEMP INTEGER NOT NULL, FINH_CODCONTA1 INTEGER NOT NULL, FINH_CODCONTA2 INTEGER NOT NULL, FINH_CODCONTA3 INTEGER NOT NULL, FINH_DATA DATE DEFAULT CURRENT_DATE NOT NULL, FINH_HORA TIME DEFAULT CURRENT_TIME NOT NULL, FINH_HISTORICO VARCHAR(255) NOT NULL, FINH_NUMERODOC VARCHAR(20) NOT NULL, FINH_CODLANC INTEGER, FINH_LANCDUPLO CAMPO_LOGICO /* CAMPO_LOGICO = CHAR(1) DEFAULT ´N´ NOT NULL CHECK (VALUE IN (´S´,´N´)) */, FINH_CREDITO DECIMAL(10,2) DEFAULT 0 NOT NULL, FINH_DEBITO DECIMAL(10,2) DEFAULT 0 NOT NULL, FINH_SALDO COMPUTED BY (FINH_CREDITO - FINH_DEBITO) ); /* Check constraints definition */ ALTER TABLE FIN_CAIXA ADD CONSTRAINT CK_FIN_CAIXA_CREDITO CHECK(FINH_CREDITO > 0); ALTER TABLE FIN_CAIXA ADD CONSTRAINT CK_FIN_CAIXA_DEBITO CHECK(FINH_DEBITO > 0); /******************************************************************************/ /* Primary Keys */ /******************************************************************************/ ALTER TABLE FIN_CAIXA ADD CONSTRAINT PK_FIN_CAIXA PRIMARY KEY (FINH_CODIGO); /******************************************************************************/ /* Triggers */ /******************************************************************************/ SET TERM ^ ; /******************************************************************************/ /* Triggers for tables */ /******************************************************************************/ /* Trigger: TRI_CHAVE_FIN_CAIXA */ CREATE OR ALTER TRIGGER TRI_CHAVE_FIN_CAIXA FOR FIN_CAIXA ACTIVE BEFORE INSERT POSITION 0 AS BEGIN IF (NEW.FINH_CODIGO IS NULL) THEN NEW.FINH_CODIGO = GEN_ID(GEN_FIN_CAIXA,1); END ^ SET TERM ; ^ /******************************************************************************/ /* Privileges */ /******************************************************************************/
/******************************************************************************/ /* Tables */ /******************************************************************************/ CREATE TABLE FIN_CONTA ( FINC_CODIGO INTEGER NOT NULL, FINC_CODEMP INTEGER NOT NULL, FINC_NOME VARCHAR(50) NOT NULL, FINC_NIVEL INTEGER NOT NULL, FINC_CODMAE INTEGER NOT NULL, FINC_CODRED INTEGER, FINC_CREDITO CAMPO_LOGICO /* CAMPO_LOGICO = CHAR(1) DEFAULT ´N´ NOT NULL CHECK (VALUE IN (´S´,´N´)) */ ); /******************************************************************************/ /* Unique Constraints */ /******************************************************************************/ ALTER TABLE FIN_CONTA ADD CONSTRAINT UN_FIN_CONTA_NOME UNIQUE (FINC_CODEMP, FINC_NIVEL, FINC_NOME); /******************************************************************************/ /* Primary Keys */ /******************************************************************************/ ALTER TABLE FIN_CONTA ADD CONSTRAINT PK_FIN_CONTA PRIMARY KEY (FINC_CODIGO, FINC_CODEMP); /******************************************************************************/ /* Privileges */ /******************************************************************************/
Agradeço desde já
Atenciosamente Vitor Araújo Alcãntara.
Gostei + 0
29/03/2008
Vitor Alcantara
Não sei se isso seria apropriado pois essa versão (me corrijam se estiver enganado) à 2.0 é uma versão de teste que não é recomendado ainda pra produção.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)