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 estarã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.
sql-server-2008-r2
schema
Mateus
fonte
fonte
Respostas:
O conceito básico é realmente bastante simples: você gera um script
sys.objects
esys.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 código a seguir:
Produzirá este script (mas talvez não nesta ordem):
Você pode adicionar filtros adicionais para deixar de fora os objetos no
dbo
esquema que não deseja mover, excluir 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 existem alguns problemas ao mover todos os seus objetos para um novo esquema:
Provavelmente, seu código ainda fará referência a esses objetos como
dbo.object
- não há maneira fácil de corrigir isso, exceto a força bruta. Provavelmente, você pode encontrar todas as ocorrências comdbo.
bastante facilidade, mas elas também podem retornar falsos positivos, comoEXEC dbo.sp_executesql
,dbo.
nos comentários, verdadeiras referências a objetos que permanecem nodbo.
esquema, etc.Suas dependências provavelmente estarão completamente fora de sintonia, mas ainda 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 que você). Mas porque o código
blat.pX
ainda faz referênciadbo.bar
, obviamente executando o procedimento:Vai gerar este erro:
E consultas de dependência, como:
Irá gerar este erro:
E consultando a visualização:
Rende estes erros:
Portanto, isso pode envolver muita limpeza. E depois de corrigir todas as referências a objetos, você provavelmente desejará recompilar todos os módulos e atualizar todas as visualizações no novo esquema. Você pode gerar um script parecido com o exemplo acima.
fonte