Actualmente tenemos varias bases de datos, pero nos gustaría combinarlas y, en su lugar, separar nuestros contextos de dominio mediante esquemas.
En MS SQL Server 2008 R2, ¿cómo puedo reubicar todo el contenido de un esquema en otro de forma masiva?
Por ejemplo, todas las tablas, vistas, procedimientos, índices, etc. que creamos en el dboesquema ahora vivirán en el fooesquema.
EDITAR: Quería aclarar sobre la base de los excelentes comentarios de AaronBertrand. Esta no es una situación de arrendamiento múltiple. Nuestra situación es donde los complementos de herramientas internas fueron desarrollados de forma aislada por desarrolladores que no fusionaron sus tablas en la base de datos de la herramienta.
sql-server-2008-r2
schema
Mateo
fuente
fuente

Respuestas:
El concepto básico es realmente bastante simple: genera un script desde
sys.objectsysys.schemasque construyeALTER SCHEMA TRANSFERdeclaraciones. Entonces, por ejemplo, tiene tres objetos en eldboesquema y desea moverlos todos alblatesquema:El siguiente código:
Producirá este script (pero quizás no en este orden):
(Es posible que desee agregar filtros adicionales para omitir objetos en el
dboesquema que no desea mover, omitir ciertos tipos de objetos (por ejemplo, tal vez todas sus funciones son funciones de utilidad y no necesitan moverse), generar el secuencia de comandos ordenada por tipo de objeto, etc.)Pero hay un par de problemas al mover todos sus objetos a un nuevo esquema:
Probablemente mucho su código seguirá haciendo referencia a estos objetos, ya que
dbo.objectno hay una manera fácil de solucionarlo, excepto la fuerza bruta. Probablemente pueda encontrar todas las ocurrencias de maneradbo.bastante fácil, pero también pueden devolver falsos positivos, comoEXEC dbo.sp_executesql,dbo.en los comentarios, referencias verdaderas a objetos que permanecen en eldbo.esquema, etc.Sus dependencias probablemente estarán completamente fuera de control, pero no lo he probado a fondo. Sé que en este escenario:
Las claves externas en realidad migran más suavemente de lo que esperaba (con la advertencia que estoy probando en una versión mucho más reciente que usted). Pero debido a que el código
blat.pXtodavía hace referenciadbo.bar, obviamente ejecuta el procedimiento:Va a producir este error:
Y consultas de dependencia, como:
Producirá este error:
Y consultando la vista:
Produce estos errores:
Entonces, esto podría implicar mucha limpieza. Y después de haber arreglado todas las referencias de objetos, probablemente querrá volver a compilar todos los módulos y actualizar todas las vistas en el nuevo esquema. Puede generar un script para eso bastante similar al ejemplo anterior.
fuente