Eu tenho um ambiente de teste para um banco de dados que quero recarregar com novos dados no início de um ciclo de teste. Não estou interessado em reconstruir o banco de dados inteiro - simplesmente "redefinindo" os dados.
Qual é a melhor maneira de remover todos os dados de todas as tabelas usando o TSQL? Existem procedimentos, visualizações etc. do sistema armazenados que podem ser usados? Eu não quero criar e manter manualmente instruções de tabela truncadas para cada tabela - eu preferiria que fosse dinâmico.
sql-server
tsql
Raio
fonte
fonte
Ao lidar com a exclusão de dados de tabelas que possuem relacionamentos de chave estrangeira - o que é basicamente o caso de qualquer banco de dados projetado adequadamente - podemos desativar todas as restrições, excluir todos os dados e reativar as restrições.
Mais sobre como desativar restrições e gatilhos aqui
se algumas das tabelas tiverem colunas de identidade, convém realizá-las novamente
Observe que o comportamento do RESEED difere entre uma tabela nova em folha e uma que teve alguns dados inseridos anteriormente no BOL :
Obrigado a Robert por apontar o fato de que desabilitar restrições não permite o uso de truncado, as restrições teriam que ser eliminadas e depois recriadas
fonte
SET ROWCOUNT 0
no início do seu script, pois o padrão é limitar as ações a 500 linhas! Você receberá erros frustrantes como eu, porque nem todos os dados foram realmente excluídos.Aqui está o rei papai dos scripts de limpeza de banco de dados. Ele limpa todas as tabelas e as repassa corretamente:
Aproveite, mas tenha cuidado!
fonte
SET QUOTED_IDENTITY OFF
em seu corpo ( link ). ATUALIZAÇÃO: a correção é adicionar "SET QUOTED_IDENTIFIERS on;" para o início de cada instrução que gera esse erro (conforme mencionado aqui )A maneira mais simples de fazer isso é
isso fornecerá um script que descarta e recria todas as suas tabelas sem a necessidade de se preocupar com a depuração ou se você incluiu tudo. Enquanto isso executa mais do que apenas um truncado, os resultados são os mesmos. Lembre-se de que suas chaves primárias de incremento automático começarão em 0, em vez de tabelas truncadas que lembrarão o último valor atribuído. Você também pode executar isso a partir do código se não tiver acesso ao Management studio em seus ambientes de pré-produto ou produção.
1
2)
3)
fonte
Truncar todas as tabelas só funcionará se você não tiver nenhum relacionamento de chave estrangeira entre elas, pois o SQL Server não permitirá que você trunque uma tabela com uma chave estrangeira.
Uma alternativa para isso é determinar as tabelas com chaves estrangeiras e excluí-las primeiro. Em seguida, você pode truncar as tabelas sem chaves estrangeiras posteriormente.
Consulte http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=65341 e http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=72957 para obter mais detalhes.
fonte
Uma opção alternativa que eu gosto de usar com o MSSQL Server Deveploper ou Enterprise é criar uma captura instantânea do banco de dados imediatamente após a criação do esquema vazio. Nesse ponto, você pode continuar restaurando o banco de dados de volta ao instantâneo.
fonte
Não faça isso! Realmente, não é uma boa ideia.
Se você souber quais tabelas deseja truncar, crie um procedimento armazenado que as trunque. Você pode corrigir o pedido para evitar problemas com chaves estrangeiras.
Se você realmente deseja truncar todos (para que o BCP possa carregá-los, por exemplo), você seria rápido em descartar o banco de dados e criar um novo a partir do zero, o que traria o benefício adicional de saber exatamente onde você está.
fonte
Se você deseja manter os dados em uma tabela específica (ou seja, uma tabela de pesquisa estática) ao excluir / truncar dados em outras tabelas dentro do mesmo banco de dados, precisará de um loop com as exceções nela. Era isso que eu estava procurando quando me deparei com essa pergunta.
sp_MSForEachTable me parece com erros (isto é, comportamento inconsistente com instruções IF), e é provavelmente por isso que não é documentado pela MS.
fonte
A parte mais difícil de truncar todas as tabelas é remover e re-adicionar as restrições de chave estrangeira.
A consulta a seguir cria as instruções drop & create para cada restrição relacionada a cada nome de tabela em @myTempTable. Se você deseja gerá-los para todas as tabelas, use o esquema de informações para reunir esses nomes.
Depois, copio as instruções para executar - mas com um pouco de esforço de desenvolvimento, você pode usar um cursor para executá-las dinamicamente.
fonte
É muito mais fácil (e possivelmente ainda mais rápido) criar um script para o seu banco de dados, basta soltar e criá-lo a partir do script.
fonte
Faça um banco de dados "modelo" vazio, faça um backup completo. Quando você precisar atualizar, basta restaurar usando WITH REPLACE. Rápido, simples, à prova de balas. E se algumas tabelas aqui ou ali precisarem de alguns dados básicos (por exemplo, informações de configuração ou apenas informações básicas que fazem com que seu aplicativo seja executado), eles também lidam com isso.
fonte
Este é um maneira de fazer isso ... provavelmente há outras 10 que são melhores / mais eficientes, mas parece que isso é feito com pouca frequência, então aqui vai ...
obtenha uma lista dos
tables
esysobjects
, em seguida, faça um loop sobre aqueles com um cursor, chamandosp_execsql('truncate table ' + @table_name)
cada umiteration
.fonte
Execute a seção comentada uma vez, preencha a tabela _TruncateList com as tabelas que você deseja truncar e, em seguida, execute o restante do script. A tabela _ScriptLog precisará ser limpa com o tempo, se você fizer muito isso.
Você pode modificar isso se quiser fazer todas as tabelas, basta colocar o nome SELECT em #TruncateList FROM sys.tables. No entanto, você geralmente não deseja fazer todos eles.
Além disso, isso afetará todas as chaves estrangeiras no banco de dados, e você também poderá modificá-las se for muito forte para o seu aplicativo. Não é para os meus propósitos.
fonte
Não vejo por que limpar dados seria melhor que um script para descartar e recriar cada tabela.
Isso ou mantenha um backup do seu banco de dados vazio e restaure-o sobre o antigo
fonte
Antes de truncar as tabelas, você deve remover todas as chaves estrangeiras. Use este script para gerar scripts finais para eliminar e recriar todas as chaves estrangeiras no banco de dados. Defina a variável @action como 'CREATE' ou 'DROP'.
fonte
selecione 'excluir de' + TABLE_NAME de INFORMATION_SCHEMA.TABLES em que TABLE_TYPE = 'BASE TABLE'
de onde vem o resultado.
Copie e cole na janela de consulta e execute o comando
fonte
É um pouco tarde, mas pode ajudar alguém. Às vezes, criei um procedimento que faz o seguinte usando o T-SQL:
Eu listei no meu blog aqui
fonte