Descartando um grupo de tabelas no SQL Server
-
08-06-2019 - |
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.
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.
- Usando as visualizações do sistema INFORMATION_SCHEMA, recupere uma lista de todas as chaves estrangeiras relacionadas a qualquer uma dessas tabelas
- Elimine cada uma dessas chaves estrangeiras
- Agora você poderá eliminar todas as tabelas, usando a ordem que desejar.