#sql-server #truncate
#sql-сервер #обрезать
Вопрос:
Я должен выполнить в тестовой среде усечение всех таблиц трех разных тестовых баз данных. Мне нужен sql-запрос, который учитывает ограничения таблицы, потому что все коды, которые я тестировал в базе данных AdventureWorks, выдают следующую ошибку:
Невозможно ОБРЕЗАТЬ ТАБЛИЦУ ‘Person.CountryRegion’ потому что на него ссылается объект ‘vStateProvinceCountryRegion’
Комментарии:
1. Ошибка сообщает вам о проблеме. Вы не можете
TRUNCATE
использовать таблицы, если они используются другими объектами; вам придетсяDROP
блокировать объекты, а затем воссоздавать их, если вы «должны»TRUNCATE
все. Если честно, звучит как проблема XY .2. Я попробовал следующий код gist.github.com/danguilherme/04fbe3906b46844f9351 это работает, но я не могу вручную перечислить имена таблиц. Существует ли код, который усекает все таблицы с заданным именем базы данных? В моем случае три тестовые базы данных содержат сотни таблиц
3. Как я уже упоминал, вы не можете просто слепо
TRUNCATE
использовать таблицы, когда существуют ограничения и привязки схемы. Сначала вам нужно будет выполнитьDROP
их, а затем воссоздать заново. это не тривиальная задача. Я бы лично предложил повторно развернуть вашу базу данных из вашего проекта управления версиями / базы данных, поскольку в ней не будет данных (кроме тех, которые могут быть обязательными для работы приложения).4. Спасибо за ваш ответ, к сожалению, у меня нет проекта базы данных или сценариев создания
5. Затем вам понадобятся
DROP
блокирующие объекты,TRUNCATE
, а затем повторноCREATE
отредактированные объектыDROP
послеTRUNCATE
завершения. Это будет очень ручная задача.
Ответ №1:
Вы могли бы попробовать что-то вроде:
-- Disable all FK constraints...
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT ALL";
GO
-- TRUNCATE TABLES...
-- Enable all FK constraints...
EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL";
GO