El objetivo principal de las bases de datos contenidas es facilitar la transferencia de su base de datos a un nuevo servidor sin muchos andamios. Con eso en mente, trataré algunos problemas potenciales que harán que esta migración sea más difícil, y la mayoría gira en torno al hecho de que las bases de datos contenidas solo están parcialmente contenidas en SQL Server 2012 (la contención no se aplica realmente).
Cadenas de conexión
Las cadenas de conexión a una base de datos contenida deben especificar explícitamente la base de datos en la cadena de conexión. Ya no puede confiar en la base de datos predeterminada del inicio de sesión para establecer una conexión; Si no especifica una base de datos, SQL Server no va a recorrer todas las bases de datos contenidas e intentará encontrar cualquier base de datos donde sus credenciales puedan coincidir.
Cross-db consultas
Incluso si crea el mismo usuario con la misma contraseña en dos bases de datos diferentes en el mismo servidor, su aplicación no podrá realizar consultas entre bases de datos. Los nombres de usuario y contraseñas pueden ser los mismos, pero son no el mismo usuario. ¿La razón de esto? Si ha contenido bases de datos en un servidor alojado, no se le debe impedir tener el mismo usuario contenido que otra persona que esté usando el mismo servidor alojado. Cuando llega la contención completa (probablemente en la versión posterior a SQL Server 2012 nunca), las consultas entre bases de datos estarán absolutamente prohibidas de todos modos. Recomiendo encarecidamente que no cree inicios de sesión a nivel de servidor con el mismo nombre que los usuarios de la base de datos contenida, e intente evitar crear el mismo nombre de usuario contenido en las bases de datos contenidas. Si necesita ejecutar consultas que lleguen a múltiples bases de datos contenidas, hágalo utilizando un inicio de sesión a nivel de servidor que tenga los privilegios apropiados (puede pensar que esto es así sysadmin
, pero para consultas de solo lectura, esto es CONNECT ANY DATABASE
y SELECT ALL USER SECURABLES
).
Sinónimos
La mayoría de los nombres de 3 y 4 partes son fáciles de identificar y aparecen en un DMV. Sin embargo, si crea un sinónimo que apunta a un nombre de 3 o 4 partes, estos no aparecen en el DMV. Por lo tanto, si hace un uso intensivo de sinónimos, es posible que pierda algunas dependencias externas, y esto puede causar problemas en el punto en que migra la base de datos a un servidor diferente. Me quejé de este problema, pero se cerró como "por diseño" y no sobrevivió a la migración al nuevo sistema de comentarios . Tenga en cuenta que el DMV también perderá nombres de 3 y 4 partes que se construyen a través de SQL dinámico.
Política de contraseñas
Si ha creado un usuario de base de datos contenido en un sistema sin una política de contraseñas, puede resultarle difícil crear el mismo usuario en un sistema diferente que tenga una política de contraseñas. Esto se debe a que la CREATE USER
sintaxis no admite eludir la política de contraseña. Archivé un error sobre este problema, y permanece abierto (y tampoco sobrevivió al movimiento cuando se retiró Connect). Y me parece extraño que en un sistema con una política de contraseñas, puede crear un inicio de sesión a nivel de servidor que omita fácilmente la política, pero no puede crear un usuario de base de datos que lo haga, aunque este usuario es inherentemente menos riesgo de seguridad.
Colación
Como ya no podemos confiar en la recopilación de tempdb, es posible que deba cambiar cualquier código que actualmente utilice la clasificación explícita o DATABASE_DEFAULT
utilizar CATALOG_DEFAULT
en su lugar. Consulte este artículo de BOL para conocer algunos posibles problemas .
IntelliSense
Si se conecta a una base de datos contenida como un usuario contenido, SSMS no admitirá completamente IntelliSense. Obtendrá subrayado básico para los errores de sintaxis, pero no habrá listas de autocompletado o información sobre herramientas y todas las cosas divertidas. Archivé un error sobre este problema, y permanece abierto , y uno más que no sobrevivió al movimiento.
Herramientas de datos de SQL Server
Si planea usar SSDT para el desarrollo de bases de datos, actualmente no hay soporte completo para las bases de datos contenidas. Lo que realmente significa que la construcción del proyecto no fallará si usa alguna característica o sintaxis que rompa la contención, ya que SSDT actualmente no sabe qué es la contención y qué podría romperla.
ALTERAR BASE DE DATOS
Al ejecutar un ALTER DATABASE
comando desde el contexto de una base de datos contenida, en lugar de ALTER DATABASE foo
lo que necesitará usar ALTER DATABASE CURRENT
, esto es para que si la base de datos se mueve, cambia de nombre, etc., estos comandos no necesitan saber nada sobre su contexto externo o referencia .
Algunos otros
Algunas cosas que probablemente no deberías seguir usando, pero que deberían mencionarse en la lista de cosas que no son compatibles o están en desuso y no deberían usarse en bases de datos contenidas:
- procedimientos numerados
- procedimientos temporales
- cambios de intercalación en objetos enlazados
- cambiar la captura de datos
- seguimiento de cambios
- replicación
Dicho todo esto, estas no son necesariamente desventajas para usar bases de datos contenidas, son solo problemas que debe tener en cuenta y no se divulgan explícitamente en la documentación oficial.
También deberá asegurarse de que si se va a migrar una base de datos contenida, o es parte de un grupo de disponibilidad o se está duplicando, que todos los servidores de destino potenciales tienen la sp_configure
opción contained database authentication
establecida en 1.
Puede encontrar esta publicación de blog útil, así como esta , aunque sean anteriores a RTM.