В настоящее время у нас есть несколько баз данных, но мы хотели бы объединить их и вместо этого разделить контексты нашего домена с помощью схем.
В MS SQL Server 2008 R2 как я могу переместить все содержимое одной схемы в другую навалом?
Например, все таблицы, представления, процедуры, индексы и т. Д., Которые мы создали в dbo
схеме, теперь будут жить в foo
схеме.
РЕДАКТИРОВАТЬ: Я хотел уточнить на основе замечательных комментариев AaronBertrand. Это не многопользовательская ситуация. В нашей ситуации плагины внутренних инструментов разрабатывались изолированно разработчиками, которые не объединяли свои таблицы с базой данных инструмента.
sql-server-2008-r2
schema
Мэтью
источник
источник
Ответы:
Основная концепция на самом деле довольно проста: вы генерируете скрипт из которого
sys.objects
иsys.schemas
строитеALTER SCHEMA TRANSFER
операторы. Так, например, у вас есть три объекта вdbo
схеме, и вы хотите переместить все их вblat
схему:Следующий код:
Даст этот скрипт (но, возможно, не в этом порядке):
(Вы можете захотеть добавить дополнительные фильтры, чтобы исключить объекты в
dbo
схеме, которые вы не хотите перемещать, исключить определенные типы объектов (например, возможно, все ваши функции являются служебными функциями и не должны перемещаться), сгенерировать сценарий упорядочен по типу объекта и т. д.)Но есть пара проблем с перемещением всех ваших объектов в новую схему:
Вероятно, ваш код все еще будет ссылаться на эти объекты как
dbo.object
- нет простого способа исправить это, кроме грубой силы. Вы, вероятно, можете найти все вхожденияdbo.
довольно легко, но они также могут возвращать ложные срабатывания, такие какEXEC dbo.sp_executesql
,dbo.
в комментариях, истинные ссылки на объекты, которые остаются вdbo.
схеме, и т. Д.Ваши зависимости, вероятно, будут совершенно не в порядке, но я не проверил это полностью. Я знаю, что в этом сценарии:
Внешние ключи на самом деле переносятся более плавно, чем я ожидал (с оговоркой, которую я тестирую на гораздо более свежей версии, чем вы). Но поскольку код по-
blat.pX
прежнему ссылаетсяdbo.bar
, очевидно, выполняется процедура:Собирается дать эту ошибку:
И запросы на зависимость, такие как:
Выдаст эту ошибку:
И запрашивая мнение:
Выдает эти ошибки:
Таким образом, это может повлечь за собой много очистки. И после того, как вы исправите все ссылки на объекты, вы, вероятно, захотите перекомпилировать все модули и обновить все представления в новой схеме. Вы можете сгенерировать скрипт для этого, очень похожий на пример выше.
источник