8

Estoy desarrollando una aplicación para varios inquilinos. Elegí el enfoque "Base de datos compartida/Esquemas separados".¿Cómo actualizar en una aplicación Multi Tenant todos los esquemas de todos los inquilinos?

Mi idea es tener un esquema predeterminado (dbo) y al implementar este esquema, para hacer una actualización de los esquemas de los inquilinos (tenantA, tenantB, tenantC); en otras palabras, para hacer esquemas sincronizados.

¿Cómo puedo sincronizar los esquemas de los inquilinos con el esquema predeterminado?

estoy usando SQL Server 2008.

Respuesta

5

Lo primero que necesitará es una tabla u otro mecanismo para almacenar la información de la versión del esquema. Si nada más para que pueda enlazar su aplicación y esquema juntos. No hay nada más doloroso que una versión de la aplicación contra el mal esquema — defecto, corrupción de datos, etc.

La aplicación debe rechazar o apagado si no es la versión correcta — Es posible obtener un retroceso cuando no es correcto, pero lo protege del día realmente malo cuando la base de datos corrompe los datos valiosos.

Necesitará una forma de rastrear cambios como Subversion u otra cosa — de SQL puede exportar el esquema inicial. Desde aquí necesitarás un mecanismo para rastrear los cambios usando una buena herramienta como SQL compare y luego rastrear los cambios de esquema y hacer coincidir una actualización en el número de versión en la base de datos de destino.

Mantenemos cada delta en una carpeta separada debajo de la utilidad de actualización que creamos. Esta utilidad inicia sesión en el servidor, lee la información de la versión y luego aplica los scripts de transformación de la próxima versión en la base de datos hasta que no pueda encontrar más scripts de actualización en su subcarpeta. Esto nos permite actualizar una base de datos sin importar la antigüedad de la versión actual. Si hay transformaciones de datos únicas para el inquilino, estas se volverán complicadas.

Por supuesto, siempre debe hacer una copia de seguridad de la base de datos que escribe en un archivo externo preferible con un número de versión identificable para que pueda encontrarlo y restaurarlo cuando los guiones fallan. Y eventualmente solo planeará descubrir cómo recuperar y restaurar.


Vi que hay algún tipo de herramienta de mejora de esquema en el nuevo VS 2010 pero no lo he usado. Eso también podría serle útil.

+0

Estaba pensando en usar un framework como Migrator.Net o RikMigrations. Entonces, puedo en mi Build Server crear una compilación que obtenga la última versión y ejecute un comando que verifique y actualice mis esquemas. Un problema que veo es cuando la aplicación tiene muchos inquilinos, este proceso de esquemas de actualización será lento y peligroso. ¿Qué te parece? Gracias Mike –

+0

Si puede cerrar la aplicación durante una ventana de mantenimiento, esta es la mejor/más fácil. No te preocupes por las actualizaciones de datos, etc., puedes tener varias instancias haciendo copias de seguridad y migrando contra tus servidores sql. lo que hicimos fue configurar una página de puerta de entrada que redirige a los usuarios de una versión particular a un seridor/ruta particular. Si aparece una solicitud de autenticación y su db se marca como una actualización, los redireccionamos a la página "Abajo para el mantenimiento" y no los pasamos a la aplicación. una vez que es una copia de seguridad para ellos, pueden ser redirigidos desde la autenticación a servidores con la nueva versión – MikeJ

+0

Miré rikMigrations. Lo malo que vi fue que no tiene una forma de trabajar con SP o Vistas, probablemente porque estas se actualizan cuando se ejecuta cualquier código DDL. incluimos en nuestro código de scripts actual para soltar todos estos artefactos y luego reconstruirlos para el nuevo esquema. – MikeJ

1

No hay ningún comando mágico para sincronizar los esquemas por lo que yo sé. Tendría que usar una herramienta, ya sea integrada o comprada (consulte Red Gate's SQL Compare y SQL Examiner; debe ajustarlas para comparar diferentes esquemas).

Sin embargo, la sincronización a menudo puede ser una tarea complicada. Si agregó una columna, ¿necesita también llenar esa columna con datos? Si divide una columna en dos nuevas columnas, tiene que haber un código de conversión para algo así.

Mi sugerencia sería realizar un seguimiento muy cuidadoso de las secuencias de comandos que ejecute en el esquema dbo y asegúrese de que también se ejecuten contra los otros esquemas cuando corresponda. A continuación, puede utilizar una herramienta como SQL Compare como una comprobación de cordura ocasional para buscar cualquier diferencia inesperada.

+1

Mi idea es automatizar este proceso. Utilizando un programa como SQL Compare de Red Gate, , el proceso es manual. Gracias. –

+0

En realidad, SQL Compare tiene una API y funcionalidad de línea de comandos, por lo tanto, si solo mantiene las estructuras sincronizadas Y (aquí está la parte importante, no importa qué método use), si puede encontrar reglas bien definidas sobre cómo la sincronización funciona, entonces debería poder automatizarlo con SQL Compare. –

Cuestiones relacionadas