У меня есть тестовая среда для базы данных, которую я хочу перезагрузить с новыми данными в начале цикла тестирования. Я не заинтересован в перестройке всей базы данных, просто в «переустановке» данных.
Каков наилучший способ удалить все данные из всех таблиц с помощью TSQL? Существуют ли системные хранимые процедуры, представления и т. Д., Которые можно использовать? Я не хочу вручную создавать и поддерживать усеченные операторы таблиц для каждой таблицы - я бы предпочел, чтобы они были динамическими.
sql-server
tsql
луч
источник
источник
Имея дело с удалением данных из таблиц, которые имеют отношения внешнего ключа - что в основном имеет место с любой правильно спроектированной базой данных - мы можем отключить все ограничения, удалить все данные и затем снова включить ограничения
Подробнее об отключении ограничений и триггеров здесь
если в некоторых таблицах есть столбцы идентификаторов, мы можем захотеть снова их заполнить
Обратите внимание, что поведение RESEED отличается между новой таблицей и таблицей, в которую ранее были вставлены некоторые данные из BOL :
Спасибо Роберту за то, что он указал на тот факт, что отключение ограничений не позволяет использовать усечение, ограничения должны быть удалены, а затем воссозданы
источник
SET ROWCOUNT 0
в начало вашего сценария, поскольку по умолчанию ограничено количество действий до 500 строк! Вы получите разочаровывающие ошибки, как я сделал, потому что не все данные будут фактически удалены.Вот король папа сценариев очистки базы данных. Он очистит все таблицы и правильно их заполнит:
Наслаждайтесь, но будьте осторожны!
источник
SET QUOTED_IDENTITY OFF
в своем теле ( ссылка ). ОБНОВЛЕНИЕ: исправление заключается в добавлении «SET QUOTED_IDENTIFIERS on;» в начале каждого утверждения, которое вызывает эту ошибку (как упоминалось здесь )Самый простой способ сделать это
это даст вам сценарий, который удаляет и воссоздает все ваши таблицы без необходимости беспокоиться об отладке или о том, включены ли вы все. Хотя это выполняет больше, чем просто усечение, результаты одинаковы. Просто имейте в виду, что ваши автоматически увеличивающиеся первичные ключи будут начинаться с 0, в отличие от усеченных таблиц, которые будут помнить последнее назначенное значение. Вы также можете выполнить это из кода, если у вас нет доступа к Management studio в вашей среде PreProd или Production.
1.
2.
3.
источник
Усечение всех таблиц будет работать только в том случае, если между таблицами нет взаимосвязей с внешним ключом, поскольку SQL Server не позволит вам усекать таблицу с внешним ключом.
Альтернативой этому является определение таблиц с внешними ключами и удаление из них в первую очередь, затем вы можете обрезать таблицы без внешних ключей.
См. Http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=65341 и http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=72957 для получения дополнительной информации.
источник
Альтернативный вариант, который мне нравится использовать с MSSQL Server Deveploper или Enterprise, - это создание моментального снимка базы данных сразу после создания пустой схемы. На этом этапе вы можете просто восстановить базу данных обратно в моментальный снимок.
источник
Не делай этого! На самом деле, не очень хорошая идея.
Если вы знаете, какие таблицы вы хотите обрезать, создайте хранимую процедуру, которая их усекает. Вы можете исправить порядок, чтобы избежать проблем с внешним ключом.
Если вы действительно хотите обрезать их все (например, вы можете загрузить их с помощью BCP), вы также можете быстро удалить базу данных и создать новую с нуля, что даст вам дополнительное преимущество, если вы точно будете знать, где вы находитесь.
источник
Если вы хотите сохранить данные в определенной таблице (то есть в статической таблице поиска) при удалении / усечении данных в других таблицах в том же БД, то вам нужен цикл с исключениями в нем. Это то, что я искал, когда наткнулся на этот вопрос.
sp_MSForEachTable кажется мне глючным (то есть несовместимым поведением с операторами IF), поэтому, вероятно, это недокументировано MS.
источник
Самая сложная часть усечения всех таблиц - это удаление и повторное добавление ограничений внешнего ключа.
Следующий запрос создает операторы drop & create для каждого ограничения, относящегося к каждому имени таблицы в @myTempTable. Если вы хотите сгенерировать их для всех таблиц, вы можете просто использовать информационную схему для сбора имен этих таблиц.
Затем я просто копирую операторы для запуска, но с небольшим усилием разработчика вы можете использовать курсор для их динамического запуска.
источник
Намного проще (и, возможно, даже быстрее) составить сценарий для вашей базы данных, а затем просто удалить и создать ее из сценария.
источник
Создайте пустую «шаблонную» базу данных, сделайте полную резервную копию. Когда вам нужно обновить, просто восстановите, используя WITH REPLACE. Быстро, просто, пуленепробиваемо. И если пара таблиц здесь или там нуждается в каких-то базовых данных (например, информация о конфигурации или просто базовая информация, которая заставляет ваше приложение работать), то это тоже обрабатывается.
источник
Это один из способов сделать это ... вероятно, есть еще 10, которые лучше / эффективнее, но, похоже, это делается очень редко, так что вот так ...
получить список
tables
изsysobjects
, а затем перебрать тех, с курсором, вызываяsp_execsql('truncate table ' + @table_name)
для каждогоiteration
.источник
Запустите закомментированный раздел один раз, заполните таблицу _TruncateList таблицами, которые вы хотите усечь, а затем запустите остальную часть сценария. Таблицу _ScriptLog нужно будет со временем очищать, если вы делаете это много.
Вы можете изменить это, если хотите сделать все таблицы, просто поместите в SELECT имя INTO #TruncateList FROM sys.tables. Тем не менее, вы обычно не хотите делать их все.
Кроме того, это повлияет на все внешние ключи в базе данных, и вы также можете изменить это, если это слишком сильно для вашего приложения. Это не для моих целей.
источник
Я не понимаю, почему очистка данных будет лучше, чем сценарий для удаления и повторного создания каждой таблицы.
Это или сохранить резервную копию вашей пустой БД и восстановить ее поверх старой
источник
Перед усечением таблиц необходимо удалить все внешние ключи. Используйте этот скрипт для генерации финальных скриптов для удаления и воссоздания всех внешних ключей в базе данных. Пожалуйста, установите для переменной @action значение 'CREATE' или 'DROP'.
источник
выберите «удалить из» + TABLE_NAME из INFORMATION_SCHEMA.TABLES, где TABLE_TYPE = «BASE TABLE»
где результат пришел.
Скопируйте и вставьте в окно запроса и выполните команду
источник
Уже немного поздно, но это может кому-то помочь. Иногда я создавал процедуру, которая с помощью T-SQL выполняет следующие действия:
Я перечислил это в своем блоге здесь
источник