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.
Para aquellos que estén interesados en obtener más detalles sobre las bases de datos contenidas, puedo recomendarles que lean este artículo http://www.sqlshack.com/contained-databases-in-sql-server/
El artículo señala las principales ventajas / desventajas del uso de bases de datos contenidas.
Desventajas
Las bases de datos parcialmente contenidas no pueden usar características como replicación, captura de datos de cambios, seguimiento de cambios, objetos vinculados a esquemas que dependen de funciones integradas con cambios de intercalación.
Ventajas
Por otro lado, como ya se mencionó, hay algunos beneficios de usar bases de datos contenidas, como:
ya que no habrá problemas de usuarios huérfanos.
El artículo también ayuda con:
fuente
Una desventaja es que no se puede obligar a un usuario de la base de datos a cambiar su propia contraseña como podrían hacerlo los inicios de sesión (
MUST_CHANGE
). Los usuarios no pueden administrar su propia contraseña a menos que les otorgue un permiso de usuario alternativo y les diga cómo cambiarla mediante una instrucción SQL. No les resulta fácil administrarlo a través de las interfaces de usuario o, al menos, no sé cómo.Una nota adicional es que encontré el uso inesperado e indocumentado de metadatos en la cláusula "PIVOT" Y "UNPIVOT", que pensé que debería estar solo en el catálogo del sistema (sys.tables / sys.columns / etc). Como se documenta en msdn :
Pero no mencionaron que la cláusula "PIVOT" Y "UNPIVOT" también usan los catálogos del sistema como mecanismo de ejecución. por lo tanto, produce un error de intercalación en todas partes cerca del uso de la cláusula "PIVOT" Y "UNPIVOT" durante la migración. Aquí hay algo de repro:
También puede ver que los artículos sobre la base de datos contenida están en su mayoría incompletos. así que decidir usarlo necesita una muy buena improvisación.
fuente