Как создать и использовать хранимую процедуру для SQL-Sever, которая удалит данные во всех таблицах в базе данных с помощью VS 2010?
Я использовал структуру сущностей с ASP.NET MVC, и я ищу простой и быстрый способ удалить всю информацию в базе данных. Требуется довольно много времени, чтобы удалить всю информацию из объекта объектов, а затем сохранить изменения в базе данных (возможно, потому, что существует много отношений «многие ко многим»), и я думаю, что должно быть очень быстро просто удалить все информации с хранимой процедурой, но я не уверен, как это сделать. Как создать и использовать хранимую процедуру для SQL-Sever, которая удалит данные во всех таблицах в базе данных с помощью VS 2010? Также, если я это сделаю, команда будет совместима с другой версией SQL-Server? (Я использую 2008 на моем тестирующем comptuer, но когда я загружаю его, я не уверен, что моя хостинговая компания использует 2008 или 2005).
Благодаря!!
- Есть ли способ переопределить только удаление хранимой процедуры в Entity Framework
- Использование SqlQuery в платформе Entity Framework
- Entity Framework 6 - таблица «многие-ко-многим» с дополнительной информацией
- Лучший способ сохранить много изменений в EF без блокировки DB
- Выберите строки «N» и получите количество строк, используя Entity Framework
- Почему мы должны писать SET FMTONLY OFF в хранимых процедурах при использовании Entity Framework
- В чем смысл исходного каталога в строке подключения базы данных Sql Server?
- Идентификатор Auto-increment на основе составного первичного ключа
- Entity Framework и советник по настройке SQL Server
- Почему Entity Framework генерирует исключение при изменении порядка SqlParameter?
- Не удается открыть базу данных <база данных>, запрошенную при входе в систему. Ошибка входа в систему. Ошибка входа для пользователя <user>
- Использование скомпилированной модели для подключения DbContext - Bad Sql
- Возможно ли создать временную таблицу в SQL Server 2016 с использованием метода Entity Framework, основанного на кодах?
Это решение будет хорошо работать с точки зрения удаления всех ваших данных в таблицах базы данных.
Вы можете создать это хранимое proc прямо в Visual Studio на сервере разработки SQL Server 2008. Он будет хорошо работать в любой версии SQL Server (2000+).
CREATE PROC NukeMyDatabase AS --order is important here. delete data in FK'd tables first. DELETE Foo DELETE Bar TRUNCATE TABLE Baz
Я предпочитаю TRUNCATE TABLE
, так как это быстрее. Это будет зависеть от вашей модели данных, поскольку вы не можете выдать TRUNCATE TABLE
в таблице, на которую ссылается ограничение внешнего ключа (т.е. родительские таблицы).
Затем вы можете вызвать эту сохраненную процедуру, используя Entity Framework, после добавления ее в ваш .edmx:
myContext.NukeMyDatabase();
Недавно я столкнулся с аналогичной проблемой, потому что мне пришлось очистить более 200 таблиц, которые были связаны между собой многими ограничениями внешнего ключа.
Критическая проблема, как указал p.campbell, определяет правильный порядок операторов DELETE
.
Ограничения внешнего ключа между таблицами по существу представляют собой иерархию. Если таблица 3 зависит от таблицы 2, а таблица 2 зависит от таблицы 1, то таблица 1 является корнем, а таблица 3 является листом.
Другими словами, если вы собираетесь удалить из этих трех таблиц, вы должны начать с таблицы, которая не имеет зависимостей и будет работать вверх. Это цель этого кода:
DECLARE @sql VARCHAR(MAX) SET @sql = '' ;WITH c AS ( SELECT parent_object_id AS org_child, parent_object_id, referenced_object_id, 1 AS Depth FROM sys.foreign_keys UNION ALL SELECT c.org_child, k.parent_object_id, k.referenced_object_id, Depth + 1 FROM c INNER JOIN sys.foreign_keys k ON c.referenced_object_id = k.parent_object_id WHERE c.parent_object_id != k.referenced_object_id ), c2 AS ( SELECT OBJECT_NAME(org_child) AS ObjectName, MAX(Depth) AS Depth FROM c GROUP BY org_child UNION ALL SELECT OBJECT_NAME(object_id), 0 AS Depth FROM sys.objects o LEFT OUTER JOIN c ON o.object_id = c.org_child WHERE c.org_child IS NULL AND o.type = 'U' ) SELECT @sql = @sql + 'DELETE FROM ' + CAST(ObjectName AS VARCHAR(100)) + ';' + CHAR(13) + CHAR(10) /** for readability in PRINT statement */ FROM c2 ORDER BY Depth DESC PRINT @sql /** EXEC (@sql) **/
exec sp_MSForEachTable 'truncate table ?';
Но я бы рекомендовал другой подход: возьмите резервную копию пустой базы данных и просто восстановите эту резервную копию перед каждым прогоном. Более того, у вас вообще нет базы данных, и ваше приложение сможет развертывать саму базу данных, используя набор сценариев обновления версии схемы .