Master / Detail no delphi/interbase.

Delphi

16/03/2009

É possivel IGNORAR a relação master/detail feita no banco interbase 6, em uma instrução ´DELETE FROM....´ em uma qry-dbexpres?


Fausto.malheiros

Fausto.malheiros

Curtidas 0

Respostas

Aeciovc

Aeciovc

16/03/2009

como assim ignorar??

vc fala em relação ao Cascade do delete?

flw!!


GOSTEI 0
Fausto.malheiros

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.


GOSTEI 0
Mdv

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


GOSTEI 0
Marco Salles

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_

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

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_

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!


GOSTEI 0
Pestana_

Pestana_

16/03/2009

Para remover a constraint no Interbase/Firebird:
alter table nomeTabela drop constraint nomeConstraint



GOSTEI 0
Fausto.malheiros

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:


GOSTEI 0
Pestana_

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.

alter table tabelaFilha add constraint fk_tabelaFilha_idPai 
foreing key (idPai) references tabelaPai(id)



GOSTEI 0
Fausto.malheiros

Fausto.malheiros

16/03/2009

Blz Pestana! Vlw pelas dicas....obrigado.


GOSTEI 0
POSTAR