Master / Detail no delphi/interbase.
É possivel IGNORAR a relação master/detail feita no banco interbase 6, em uma instrução ´DELETE FROM....´ em uma qry-dbexpres?
Fausto.malheiros
Curtidas 0
Respostas
Aeciovc
16/03/2009
como assim ignorar??
vc fala em relação ao Cascade do delete?
flw!!
vc fala em relação ao Cascade do delete?
flw!!
GOSTEI 0
Fausto.malheiros
16/03/2009
A condição de master/detail não me deixa excluir a tabela master....mas surgiu uma daquelas situações em que isso vai ser necessário...pela modelagem de dados que foi feita...
Então preciso IGNORAR essa condição...Preciso excluir aquela tabela sem que o INTERBASE me retorne erro.
Então preciso IGNORAR essa condição...Preciso excluir aquela tabela sem que o INTERBASE me retorne erro.
GOSTEI 0
Mdv
16/03/2009
Até onde eu sei se existir relacionamento entre as tabelas, qualquer banco de dados retornara erro.
Não conheço alguma maneira de fazer isso sem excluir tambem os registros filhos antes de excluir o registro pai.
att. MDV
Não conheço alguma maneira de fazer isso sem excluir tambem os registros filhos antes de excluir o registro pai.
att. MDV
GOSTEI 0
Marco Salles
16/03/2009
Tecnologia :
qry-dbexpres
Ao excluir um Regsitro vc receberá a mensagem :
[b:b193971846]´cannot Delete Master Records With Details´[/b:b193971846]
Indicando que não é possivel excluir um Registro Mestre se ele possui Detalhes.
Porem para que isto seje permitido altere a sub-Propriedade poCasacadeDeletes da Propriedade Options do DataSetProvider
claro que para isto funcionar , no Script de criação do Banco , nas definição das chaves estrangeiras , que o Registro das Tabelas ESPECIFICAS <GEN/ESP> serão excluidas automaticamente.
GOSTEI 0
Pestana_
16/03/2009
Até onde eu sei se existir relacionamento entre as tabelas, qualquer banco de dados retornara erro.
Não conheço alguma maneira de fazer isso sem excluir tambem os registros filhos antes de excluir o registro pai.
att. MDV
Você esta querendo excluir o registro da tabela pai mesmo que contenha registros na tabela filho? se for isso, então você pode definir como on delete cascade na tabela filho.
exemplo:
create table tabelaPai( id integer not null, campo1 varchar(50), campo2 numeric(10,2), constraint pk_tabelaPai primary key (id)); create table tabelaFilho( id integer not null, idPai integer not null, campo1 varchar(30), campo2 integer, constraint pk_tabelaFilho primary key (id), constraint fk_tabelaFilho_IdPai foreign key(idPai) references tabelaPai(id) on delete cascade);
Com isso você pode excluir o registro da tabela pai sem se preocupar se existe registro na tabela filho, mesmo que tenha registros filhos o mesmo será deletado automaticamente pelo o banco.
Agora se você não quer definir como on delete cascade e quer deletar registros na tabela pai e sem deletar registros na tabela filho isso não tem lógica e o próprio banco SGBD não aceita esse tipo de coisa.
GOSTEI 0
Fausto.malheiros
16/03/2009
Agora se você não quer definir como on delete cascade e quer deletar registros na tabela pai e sem deletar registros na tabela filho isso não tem lógica e o próprio banco SGBD não aceita esse tipo de coisa.
É isso mesmo Pestana. Foi uma falha na modelagem do banco. O Banco de dados esta corretissimo em não permitir isso...mas devido ás circunstancias imaginei ter algum jeito de ´driblar´ o banco nessa questão....mas felizmente ou infelizmente não sei....parece não ter jeito.
GOSTEI 0
Pestana_
16/03/2009
Pensei em uma alternativa, mas não sei se resolve:
Você poderia tentar deletar a constraint da tabela filha (constraint fk), com isso todos os regstros da tabela filha perderam a ´referência´ com a tabela pai, mas com este jeito você consegue deletar o registro da tabela pai (ou ex tabela pai :D) sem nenhum problema. Feito isso, é só relacionar os registros da tabela filha com a tabela pai novamente.
boa sorte!
Você poderia tentar deletar a constraint da tabela filha (constraint fk), com isso todos os regstros da tabela filha perderam a ´referência´ com a tabela pai, mas com este jeito você consegue deletar o registro da tabela pai (ou ex tabela pai :D) sem nenhum problema. Feito isso, é só relacionar os registros da tabela filha com a tabela pai novamente.
boa sorte!
GOSTEI 0
Pestana_
16/03/2009
Para remover a constraint no Interbase/Firebird:
alter table nomeTabela drop constraint nomeConstraint
GOSTEI 0
Fausto.malheiros
16/03/2009
Ta ai uma alternativa aplausivel...Posso desfazer o vinculo temporariamente...e voltar o vinculo quando a coisa se resolver.
Se isso não me trazer problema fisico no banco, esta RESOLVIDO...por que problema logico sei que podera me dar.
Blz...Vlw pela dica. :idea: :idea: :idea:
Se isso não me trazer problema fisico no banco, esta RESOLVIDO...por que problema logico sei que podera me dar.
Blz...Vlw pela dica. :idea: :idea: :idea:
GOSTEI 0
Pestana_
16/03/2009
bom até hoje eu não encontrei nada dizendo que vai trazer problemas físico do banco.
Depois que você deletar os registros da tabela pai, você pode criar a constraint novamente na tabela filha tornando o campo chave estrangeira.
Depois que você deletar os registros da tabela pai, você pode criar a constraint novamente na tabela filha tornando o campo chave estrangeira.
alter table tabelaFilha add constraint fk_tabelaFilha_idPai foreing key (idPai) references tabelaPai(id)
GOSTEI 0
Fausto.malheiros
16/03/2009
Blz Pestana! Vlw pelas dicas....obrigado.
GOSTEI 0