Atualmente, temos vários bancos de dados, mas gostaríamos de combiná-los e, em vez disso, separar nossos contextos de domínio usando esquemas.
No MS SQL Server 2008 R2, como posso realocar todo o conteúdo de um esquema para outro em massa?
Por exemplo, todas as tabelas, visualizações, procedimentos, índices, etc... que criamos no dbo
esquema agora viverão no foo
esquema.
EDIT: Eu queria esclarecer com base nos ótimos comentários de AaronBertrand. Esta não é uma situação de multilocação. Nossa situação é onde os plug-ins de ferramentas internas foram desenvolvidos isoladamente por desenvolvedores que não mesclaram suas tabelas no banco de dados da ferramenta.
O conceito básico é bastante simples: você gera um script a partir do
sys.objects
qualsys.schemas
constróiALTER SCHEMA TRANSFER
instruções. Por exemplo, você tem três objetos nodbo
esquema e deseja mover todos eles para oblat
esquema:O seguinte código:
Irá render este script (mas talvez não nesta ordem):
(Você pode querer adicionar filtros adicionais para deixar de fora objetos no
dbo
esquema que você não deseja mover, deixar de fora certos tipos de objetos (por exemplo, talvez todas as suas funções sejam funções utilitárias e não precisem ser movidas), gere o script ordenado por tipo de objeto, etc.)Mas há alguns problemas em mover todos os seus objetos para um novo esquema:
Provavelmente, muito do seu código ainda fará referência a esses objetos como
dbo.object
- não há maneira fácil de corrigir isso, exceto força bruta. Você provavelmente pode encontrar todas as ocorrências de comdbo.
bastante facilidade, mas elas também podem retornar falsos positivos, comoEXEC dbo.sp_executesql
,dbo.
em comentários, referências verdadeiras a objetos que permanecem nodbo.
esquema, etc.Suas dependências provavelmente estarão completamente fora de sintonia, mas eu não testei isso completamente. Eu sei que neste cenário:
As chaves estrangeiras realmente migram mais suavemente do que eu esperava (com a ressalva de que estou testando em uma versão muito mais recente do que você). Mas como o código
blat.pX
ainda faz referênciadbo.bar
a , obviamente executando o procedimento:Vai dar esse erro:
E consultas de dependência, como:
Irá gerar este erro:
E consultando a view:
Gera estes erros:
Então, isso pode envolver muita limpeza. E depois de corrigir todas as referências de objeto, você provavelmente desejará recompilar todos os módulos e atualizar todas as exibições no novo esquema. Você pode gerar um script para isso bastante semelhante ao exemplo acima.