1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

VB.net - SQL Server | Apagar registos que estão noutras tabelas

Discussão em 'Programação' iniciada por diog0silva, 9 de Abril de 2009. (Respostas: 10; Visualizações: 2509)

  1. diog0silva

    diog0silva Power Member

    Boas.

    Tou com uma dúvida. Eu já coloquei aqui a questão.

    Tipo, eu quero apagar um registo duma tabela. Porém, esse registo está relacionado com outra tabela. Por exemplo, não posso apagar um cliente se ele tiver compras efectuadas.

    Se fossem só duas tabelas relacionadas, fazia-se bem. Mas eu tenho praí umas quatro, e torna-se complicado saber q registos apagar.

    Não há nenhuma maneira de apagar um registo duma tabela, apagando automaticamente todos os registos nas outras tabelas que lhe digam respeito?
     
  2. AliFromCairo

    AliFromCairo Power Member

    Há. Ao definires as foreign keys, utilizas a cláusula ON DELETE CASCADE.
     
  3. diog0silva

    diog0silva Power Member

    Obrigadão :D
     
  4. JmP

    JmP

    Boas,
    E se, por exemplo quisermos impedir que apague um registo( da tabelaprincipal) que esteja a ser utilizado numa outra tabela(tabelasecundaria) e enquanto não apaguem na outra tabela(tabelasecundaria), não de para apagar nesta(tabelaprincipal)?
    Em visual basic 2008...
     
    Última edição: 28 de Abril de 2009
  5. diog0silva

    diog0silva Power Member

    Se bem percebi a tua duvida, é exactamente aquilo que eu não queria lol

    Ou seja, eu tenho que utilizar o ON DELETE CASCADE para que, ao apagar um registo da tabela principal, apague todos os seus registos em tabelas secundárias. Tu (e repito: se bem percebi a tua dúvida), ao nao utilizares o ON DELETE CASCADE, ele nao te deixa apagar registos da tabela principal, sem que primeiro apagues os seus registos em tabelas secundarias.
     
  6. GanondorfTM

    GanondorfTM Power Member

    JmP,

    aquilo que me parece que tens de fazer é, na tabela principal metes ON DELETE CASCADE, e na secundaria metes ON DELETE SET NULL. Assim, se apagares na secundaria, o valor fica a null, enqt que se apagares na outra, ele apaga todos os registos que tenham o valor que escolheste apagar.
     
  7. JmP

    JmP

    Mas o que eu realmente cria era que ele não deixa-se apagar.
    A minha base de dados esta em access
     
  8. diog0silva

    diog0silva Power Member

    Em Access, ao criares a relação entre as duas tabelas, não podes por o visto na opção 'Propagar Eliminação dos Registos Relacionados'.

    Acho que é só fazeres isso, mas se não for, alguém que me corrija lol :D
     
  9. JmP

    JmP

    Mas não existe nenhuma forma de por um aviso no vb 2008 para impedir...ia verificar para ver se o registo estava a ser utilizado na tabela secundaria, se assim fosse emitia uma msgbox a avisar,se não estivesse a ser usado por nenhum deixava eliminar
     
  10. diog0silva

    diog0silva Power Member

    Eu não sei se estou a perceber bem o que queres fazer mas pelo que percebi queres algo do genero:

    Ao tentar apagar um registo, se existir registos relacionados não deixa apagar e aparece uma MsgBox. Se não existir nenhum registo relacionado, deixa eliminar.

    Se for isto que queres, então a solução é:

    No Access, não pões o visto na opção 'Propagar Eliminação dos Registos Relacionados'. No VB, no código do botão eliminar registos, pões algo do género:

    Try
    código para apagar registo
    Catch ex As Exception
    MsgBox("Existem registos relacionados!")
    End Try
     
  11. JmP

    JmP

    Sim é isso que eu quero... eu tentei como disseste e ele continua a deixar apagar os registos mas agora como nao tem o visto naquela opção apaga o registo completo..em antes so apagava o campo relacionado e metia para la outro valor que existisse...mas o que eu queria era que aquela msgbox aparece e impedisse de eliminar
     

Partilhar esta Página