none
Delete Cascate RRS feed

  • Pergunta

  • Bom dia pessoal,

    bom, recentemente semana passada ficamos a metade de um dia para deletar do sistema alguns pedidos: por causa das diversas tabelas envolvidas. Hoje consegui montar uma serie de Deletes para fazer este processo via SQL, só que são muitos deletes que tenho que da F5. Teria como alguem me ajudar a transformar estes deletes começando de BAIXO para cima num só DELETE? Já que todas as tabelas tem a chave principal em comum.

    delete from TMOV where IDMOV in (130580) and SERIE='scm'
    delete from TMOTIVOCONCLPED where CODUSUARIO='usuario'
    delete from TMOVCOMPL where IDMOV in(130580)
    delete from TMOVFISCAL where IDMOV in(130580)
    delete from TMOVHISTORICO where IDMOV in(130580)
    delete from TMOVRATCCU where IDMOV in(130580)
    delete from TMOVTRANSP where IDMOV in(130580)
    delete from TNFE where IDMOV in(130580)
    delete from TITMMOV where IDMOV in(130580)
    delete from TITMMOVHISTORICO where IDMOV in(130580)
    delete from TITMMOVFISCAL where IDMOV in(130580)
    delete from TITMMOVCOMPL where IDMOV in(130580)


    CharlesTI.

    segunda-feira, 23 de novembro de 2015 12:33

Respostas

  • Charles,

    Você deve alterar as constraints de cada uma das tabelas 'filhas', habilitando o cascade no delete

    Por exemplo:

    CREATE TABLE TABELA1 (Cod int identity (1,1) primary key, nome varchar(10))
    CREATE TABLE TABELA2 (Cod int identity (1,1) primary key, cod1 int, nome varchar(10))
    go
    alter table tabela2
    add constraint fk_tb1_tb2 foreign key (cod1) references Tabela1 (cod) on delete no action
    go
    insert into TABELA1 values ('campo1')
    insert into TABELA2 values (1,'campo2')
    go
    delete from tabela1 where cod = 1 -- Erro!
    GO
    alter table tabela2
    drop constraint fk_tb1_tb2 
    go
    alter table tabela2
    add constraint fk_tb1_tb2 foreign key (cod1) references Tabela1 (cod) on delete cascade
    go
    select * from TABELA1 tb1 join TABELA2 tb2 on tb1.Cod = tb2.cod1
    go
    delete from tabela1 where cod = 1 -- funciona!
    GO
    select * from TABELA1 tb1 join TABELA2 tb2 on tb1.Cod = tb2.cod1 -- Vazio!
    []'s!



    /* Logan Destefani Merazzi - DBA | @LoganMerazzi | http://www.merazzi.eti.br
    Se a resposta for útil, vote nela. Se resolveu, marque-a como resposta. */


    • Editado Logan Destefani Merazzi segunda-feira, 23 de novembro de 2015 15:00
    • Marcado como Resposta Marcos SJ segunda-feira, 23 de novembro de 2015 18:34
    • Não Marcado como Resposta CHARLES.PTU segunda-feira, 23 de novembro de 2015 19:37
    • Marcado como Resposta CHARLES.PTU segunda-feira, 23 de novembro de 2015 19:37
    segunda-feira, 23 de novembro de 2015 14:05
  • Charles,

    Se você ver o meu exemplo, é mais ou menos a mesma coisa... você vai precisar fazer um drop das FKs já existentes e recriá-las, inserindo o DELETE CASCADE após a criação.

    Lembrando que: Você terá que fazer apenas um DELETE. Será o delete na tabela que possui a PK IDMOV. Os registros nas demais tabelas envolvidas serão removidas automaticamente.

    Particularmente, eu prefiro deixar o cascade desabilitado e fazer o delete manual, por mais trabalhoso que fique. Assim você evita a exclusão de registros por acidente, sabe como é... Todos somos suscetíveis a erro. :-)

    []'s!


    /* Logan Destefani Merazzi - DBA | @LoganMerazzi | http://www.merazzi.eti.br
    Se a resposta for útil, vote nela. Se resolveu, marque-a como resposta. */


    segunda-feira, 23 de novembro de 2015 18:53
  • Bom Charles,

    Eu nunca trabalhei com os sistemas da Totvs, mas o princípio é o mesmo.
    Sugestão:
    1. Se puder manipular os dados pelo SSMS, faça manualmente, não mexa nas estrutura, uma vez que isso pode demandar em perda de suporte e garantia. Sem contar que qualquer problema, recuperar o suporte pode sair mais caro.

    2. Se não puder manipular, faça de acordo com os recursos que eles fornecem (aplicação, por exemplo) ou abra um suporte para auxílio... As vezes exclusões desse gênero podem dar mais dores de cabeça posteriormente do que encontramos. Por mais que se o SQL, a regra de negócio embutida pode deixar passar alguma informação despercebida.

    Espero ter ajudado.

    []'s!


    /* Logan Destefani Merazzi - DBA | @LoganMerazzi | http://www.merazzi.eti.br
    Se a resposta for útil, vote nela. Se resolveu, marque-a como resposta. */

    • Marcado como Resposta CHARLES.PTU segunda-feira, 23 de novembro de 2015 19:36
    segunda-feira, 23 de novembro de 2015 19:08

Todas as Respostas

  • Charles,

    Você deve alterar as constraints de cada uma das tabelas 'filhas', habilitando o cascade no delete

    Por exemplo:

    CREATE TABLE TABELA1 (Cod int identity (1,1) primary key, nome varchar(10))
    CREATE TABLE TABELA2 (Cod int identity (1,1) primary key, cod1 int, nome varchar(10))
    go
    alter table tabela2
    add constraint fk_tb1_tb2 foreign key (cod1) references Tabela1 (cod) on delete no action
    go
    insert into TABELA1 values ('campo1')
    insert into TABELA2 values (1,'campo2')
    go
    delete from tabela1 where cod = 1 -- Erro!
    GO
    alter table tabela2
    drop constraint fk_tb1_tb2 
    go
    alter table tabela2
    add constraint fk_tb1_tb2 foreign key (cod1) references Tabela1 (cod) on delete cascade
    go
    select * from TABELA1 tb1 join TABELA2 tb2 on tb1.Cod = tb2.cod1
    go
    delete from tabela1 where cod = 1 -- funciona!
    GO
    select * from TABELA1 tb1 join TABELA2 tb2 on tb1.Cod = tb2.cod1 -- Vazio!
    []'s!



    /* Logan Destefani Merazzi - DBA | @LoganMerazzi | http://www.merazzi.eti.br
    Se a resposta for útil, vote nela. Se resolveu, marque-a como resposta. */


    • Editado Logan Destefani Merazzi segunda-feira, 23 de novembro de 2015 15:00
    • Marcado como Resposta Marcos SJ segunda-feira, 23 de novembro de 2015 18:34
    • Não Marcado como Resposta CHARLES.PTU segunda-feira, 23 de novembro de 2015 19:37
    • Marcado como Resposta CHARLES.PTU segunda-feira, 23 de novembro de 2015 19:37
    segunda-feira, 23 de novembro de 2015 14:05
  • Boa tarde Logan,

    mas essas alterações eu adiciono ou excluo, pq ja tem constraints nas tabelas.


    CharlesTI.

    segunda-feira, 23 de novembro de 2015 18:39
  • Charles,

    Se você ver o meu exemplo, é mais ou menos a mesma coisa... você vai precisar fazer um drop das FKs já existentes e recriá-las, inserindo o DELETE CASCADE após a criação.

    Lembrando que: Você terá que fazer apenas um DELETE. Será o delete na tabela que possui a PK IDMOV. Os registros nas demais tabelas envolvidas serão removidas automaticamente.

    Particularmente, eu prefiro deixar o cascade desabilitado e fazer o delete manual, por mais trabalhoso que fique. Assim você evita a exclusão de registros por acidente, sabe como é... Todos somos suscetíveis a erro. :-)

    []'s!


    /* Logan Destefani Merazzi - DBA | @LoganMerazzi | http://www.merazzi.eti.br
    Se a resposta for útil, vote nela. Se resolveu, marque-a como resposta. */


    segunda-feira, 23 de novembro de 2015 18:53
  • O problema que são Tabelas da Totvs Logan, será que não tem nenhum problema eu fazer isso não?

    CharlesTI.

    segunda-feira, 23 de novembro de 2015 18:54
  • Bom Charles,

    Eu nunca trabalhei com os sistemas da Totvs, mas o princípio é o mesmo.
    Sugestão:
    1. Se puder manipular os dados pelo SSMS, faça manualmente, não mexa nas estrutura, uma vez que isso pode demandar em perda de suporte e garantia. Sem contar que qualquer problema, recuperar o suporte pode sair mais caro.

    2. Se não puder manipular, faça de acordo com os recursos que eles fornecem (aplicação, por exemplo) ou abra um suporte para auxílio... As vezes exclusões desse gênero podem dar mais dores de cabeça posteriormente do que encontramos. Por mais que se o SQL, a regra de negócio embutida pode deixar passar alguma informação despercebida.

    Espero ter ajudado.

    []'s!


    /* Logan Destefani Merazzi - DBA | @LoganMerazzi | http://www.merazzi.eti.br
    Se a resposta for útil, vote nela. Se resolveu, marque-a como resposta. */

    • Marcado como Resposta CHARLES.PTU segunda-feira, 23 de novembro de 2015 19:36
    segunda-feira, 23 de novembro de 2015 19:08
  • Muitissimo obrigado Logan,

    vc me ajudou muito!!!


    CharlesTI.

    segunda-feira, 23 de novembro de 2015 19:36