Pergunta

Existe uma maneira simples de eliminar um grupo de tabelas inter-relacionadas no SQL Server?Idealmente, eu gostaria de evitar ter que me preocupar com a ordem em que eles estão sendo colocados, já que sei que todo o grupo terá ido embora no final do processo.

Foi útil?

Solução

Correndo o risco de parecer estúpido, não acredito que o SQL Server suporte a sintaxe delete/cascade.Acho que você pode configurar uma regra de exclusão para fazer exclusões em cascata (http://msdn.microsoft.com/en-us/library/ms152507.aspx), mas até onde eu sei, o truque do SQL Server é apenas executar sua consulta drop uma vez para cada tabela que você está descartando e verificar se funcionou.

Outras dicas

Uma abordagem diferente poderia ser:primeiro livre-se das restrições e depois elimine as mesas de uma só vez.

Em outras palavras, um DROP CONSTRAINT para cada restrição e depois um DROP TABLE para cada tabela;neste ponto, a ordem de execução não deve ser um problema.

Isto requer o sp___drop___restrições script que você pode encontrar em Diário de banco de dados:

sp_MSforeachtable @command1="print 'disabling constraints: ?'", @command2="sp_drop_constraints @tablename=?"
GO
sp_MSforeachtable @command1="print 'dropping: ?'", @command2="DROP TABLE ?"
GO

OBSERVAÇÃO isso - obviamente - se você pretendia eliminar TODAS as tabelas do seu banco de dados, então tome cuidado

Não tenho acesso ao SQL Server para testar isso, mas que tal:

DROP TABLE IF EXISTS table1, table2, table3 CASCADE;

Não tenho certeza se a abordagem de Derek funciona.Você ainda não marcou como melhor resposta.

Se não:com o SQL Server 2005 isso deveria ser possível, eu acho.
Lá eles introduziram exceções (que ainda não usei).Portanto, elimine a tabela, capture a exceção, se ocorrer uma, e tente a próxima tabela até que todas acabem.
Você pode armazenar a lista de tabelas em uma tabela temporária e usar um cursor para percorrê-la, se desejar.

Acabei usando o Apache ddlutils para realizar a eliminação para mim, o que resolveu o problema no meu caso, embora uma solução que funcionasse apenas no sql server fosse um pouco mais simples.

@Derek Park, eu não sabia que você poderia separar tabelas por vírgula, então isso é útil, mas não parece funcionar como esperado.Nether IF EXISTS nem CASCADE são reconhecidos pelo sql server, ao que parece, e em execução drop table X, Y, Z parece funcionar apenas se eles forem eliminados na ordem indicada.

Veja também http://msdn.microsoft.com/en-us/library/ms173790.aspx, que descreve a sintaxe da tabela suspensa.

O que impede você de descartar as tabelas em qualquer ordem são as dependências de chave estrangeira entre as tabelas.Portanto, livre-se dos FK antes de começar.

  1. Usando as visualizações do sistema INFORMATION_SCHEMA, recupere uma lista de todas as chaves estrangeiras relacionadas a qualquer uma dessas tabelas
  2. Elimine cada uma dessas chaves estrangeiras
  3. Agora você poderá eliminar todas as tabelas, usando a ordem que desejar.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top