SQL Server 2012: A veces es mejor parcial

SQL Server 2012 será compatible con las bases de datos parcialmente independientes, lo que debiera solucionar algunos problemas de migración y de consolidación.

Denny Cherry

Las bases de datos contenidas parcialmente solucionan algunos de los principales problemas de consolidación y migración en torno a las bases de datos de SQL Server desde SQL Server versión 4.2. Afortunadamente, esta será una de las muchas características nuevas que se introducirán con SQL Server 2012.

El primer problema que solucionan las bases de datos contenidas parcialmente es llevar una base de datos de una instancia de SQL Server a otra sin tener que identificar los inicios de sesión de SQL Server que usa la base de datos. También abarca la creación de esos inicios de sesión en la instancia de base de datos de destino.

SQL Server 2012 hace esta acción con un inicio de sesión contenido de SQL Server. Este es un usuario de SQL Server creado dentro de la base de datos contenida, pero sin un inicio de sesión de SQL Server coincidente. Este usuario contenido dentro de la base de datos contenida tiene una contraseña almacenada dentro de la base de datos contenida, por lo que la autenticación funciona como estaba previsto.

El segundo problema que se soluciona es que los conflictos de intercalación entre las tablas dentro de las bases de datos contenidas y las tablas temporales efectivamente desaparecen. SQL Server automáticamente crea tablas temporales dentro del alcance de la base de datos contenida cuando se intercala. Esto permite que la misma instancia de SQL Server hospede bases de datos de distintas intercalaciones, sin la necesidad de modificar las instrucciones CREATE TABLE para especificar la intercalación ni tener que especificar la instrucción COLLATE dentro de la sintaxis de la instrucción JOIN.

A diferencia de algunas de las características nuevas que requieren que el nivel de compatibilidad de la base de datos se defina en el valor más reciente, las bases de datos contenidas parcialmente actualmente son compatibles hasta con SQL Server 2005. Por otro lado, la característica de base de datos contenida todavía no está completa. Debería estar completada en algún momento entre el lanzamiento de SQL Server 2012 CTP3 y cuando el producto se lance a producción durante la primera mitad de 2012.

Configuración de una base de datos contenida parcialmente

Antes de poder cambiar una base de datos de no contenida a contenida parcialmente, primero debe cambiar una configuración de servidor con el procedimiento almacenado en el sistema sp_configure. Use el procedimiento almacenamiento en el sistema sp_configure para cambiar la configuración de "autenticación de base de datos contenida" de 0 a 1, luego use la instrucción RECONFIGURE para activar la configuración nueva, de la siguiente manera:

EXEC sp_configure 'contained database authentication', 1 RECONFIGURE GO

Después de habilitar la configuración de "autenticación de base de datos contenida", puede cambiar una base de datos específica a contenida parcialmente. Puede usar SQL Server Management Studio tal como aparece en la figura 1, la instrucción ALTER DATABASE o a través de la creación de una base de datos nueva como una base de datos contenida:

ALTER DATABASE: USE [master] GO ALTER DATABASE [Cont] SET CONTAINMENT=PARTIAL GO CREATE DATABASE: CREATE DATABASE [Cont1] CONTAINMENT=PARTIAL GO

Para crear una nueva base de datos contenida parcialmente o alterar una base de datos para que se contenga parcialmente, conéctese a la instancia de SQL Server en el explorador de objetos. Haga clic con el botón secundario para crear una base de datos nueva o seleccione una base de datos existente. Seleccione las propiedades (dependiendo si crea una base de datos nueva o si cambia una base de datos existente). En cualquier caso, seleccione la pestaña "Opciones" y cambie la lista desplegable "Tipo de contención" de "Ninguno" a "Parcial".

The Database Properties window lets you change the database containment setting

Figura 1 La ventana Propiedades de la base de datos le permite cambiar la configuración de la contención de la base de datos.

Para cambiar una base de datos existentes de no contenida a contenida parcialmente, use T/SQL y la instrucción ALTER DATABASE. Para cambiar correctamente la configuración de la contención de la base de datos, la instrucción ALTER DATABASE debe poder tener un bloqueo exclusivo de toda la base de datos. Por lo tanto, tendrá que programar una breve interrupción en la unidad de negocio que usa esta base de datos en especial.

Cómo evitar errores de intercalación de tablas temporales

Las nuevas bases de datos contenidas parcialmente permiten que existan varias intercalaciones diferentes en la misma instancia de SQL Server. No tendrá que preocuparse sobre los problemas de intercalación al combinar tablas temporales. Puede probar esto al tomar una instancia de Microsoft SQL Server y creando una base de datos contenida parcialmente de una intercalación distinta. Luego cree una tabla física y una tabla temporal dentro de la base de datos contenida parcialmente. Cargue datos en las dos tablas e intente combinarlas.

Cree una base de datos con la intercalación de base de datos Albanian_100_CI_AI_KS_WS, mientras que la instancia usa la intercalación SQL_Latin1_General_CP1_CI_AS, tal como aparece en la figura 2. Crea una tabla llamada dbo.Employee dentro de las bases de datos nuevas y carga tres filas en la tabla. También crea una tabla temporal llamada #emp e inserta una sola fila en la tabla. Cuando las tablas se combinan en el final de la consulta, se devuelve una fila. Si la configuración de la base de datos contenida no está definida en parcial, se devolvería un error.

Figura 2 Cree y use una base de datos contenida parcialmente.

use master GO CREATE DATABASE [Cont] CONTAINMENT = PARTIAL ONPRIMARY (NAME = N'Cont', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\Cont.mdf', SIZE = 4096KB, FILEGROWTH= 1024KB) LOGON (NAME = N'Cont_log',FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\Cont_log.ldf', SIZE = 1024KB, FILEGROWTH = 10%) COLLATE Albanian_100_CI_AI_KS_WS GO Use Cont GO Create table Employee (EmployeeId INTPRIMARYKEY, LastName nvarchar(100), FirstName nvarchar(100)) GO Insert into Employee (EmployeeId,LastName,FirstName) values (1,'last1','first1'), (2,'last2','first2'),(3,'last3','first3') GO Create table #emp (LastName nvarchar(100)) GO Insert into #emp (LastName) values ('last1') GO select* from Employee join #emp on Employee.LastName = #emp.LastName

Usuarios contenidos

Los usuarios contenidos son similares a los inicios de sesión de SQL Server tradicionales, excepto en que no tienen un inicio de sesión que se alinea con el usuario de base de datos contenida. Cree un usuario contenido con SQL Server Management Studio o la instrucción CREATE USER T/SQL.

Para usar SQL Server Management Studio, conéctese a la instancia que hospeda la base de datos contenida en el explorador de objetos. Navegue a Base de datos | {Su base de datos contenida} | Seguridad | Usuarios. Haga clic con el botón secundario en la carpeta Usuarios y seleccione "Nuevo usuario" en el menú contextual. En la lista desplegable "Tipo de usuario", seleccione "Usuario de SQL con contraseña". Rellene los campos de nombre de usuario y contraseña (consulte la figura 3), así como también el esquema predeterminado y cualquier pertenencia de rol de base de datos que deba configurar.

Create a contained SQL user with SQL Server Management Studio

Figura 3 Cree un usuario de SQL contenido con SQL Server Management Studio.

Después de crear el usuario contenido, puede examinar la vista de catálogo sys.database_principals dentro de la base de datos contenida. El conjunto de registros que se devuelve al consultar la vista de catálogo mostrará la nueva columna llamada authentication_type definida en un valor de 2. También mostrará la columna authentication_type_desc definida en un valor de "DATABASE" cuando el usuario es un usuario contenido.

Cree un usuario de base de datos contenido mediante el uso de T/SQL con la instrucción CREATE USER. SQL Server sabe que está creando un usuario contenido en lugar de un usuario que se alinea con un inicio de sesión en el nivel de instancia a través de la especificación de la instrucción WITH PASSWORD, tal como aparece aquí:

CREATE USER MyContainedUser WITHPASSWORD = 'MyContainedUserPassword' GO

Puede crear usuarios contenidos de SQL, así como también inicios de sesión contenidos de Windows. Cambie la lista desplegable "Tipo de usuario" (consulte la figura 4) a "Usuario de Windows" y escriba el nombre de usuario sin seleccionar un inicio de sesión.

Create a contained Windows Login using SQL Server Management Studio

Figura 4 Cree un inicio de sesión contenido de Windows con SQL Server Management Studio.

También puede crear usuarios contenidos de Windows con la instrucción CREATE USER T/SQL, tal como se muestra a continuación:

CREATE USER [CAPT-MAL\test] WITH DEFAULT_SCHEMA = [dbo] GO

Inicie sesión en la base de datos contenida con un inicio de sesión contenido, tal como lo haría con un usuario tradicional (no contenido). El gran truco para el usuario contenido es que debe especificar el nombre de la base de datos en la cadena de conexión cuando se conecte. Si no lo hace, SQL Server supondrá que un inicio de sesión tradicional de SQL Server intenta la conexión. El inicio de sesión no se realizará si no hay un inicio de sesión que coincida con el nombre de usuario y la contraseña definidos en el nivel de instancia.

Hágalo en el cuadro de diálogo de conexión SQL Server Management Studio con un clic en el botón Opciones que aparece en la parte inferior de la ventana del inicio de sesión. Seleccione la pestaña "Propiedades de conexión". En la pestaña "Propiedades de conexión" se puede escribir el nombre de base de datos de la base de datos contenida en la lista desplegable "Conectarse a base de datos" (consulte la figura 5).

No podrá consultar la lista de bases de datos hospedadas en la instancia de SQL Server como el usuario contenido especificado en la pestaña "Inicio de sesión". Ese usuario contenido no tiene derechos sobre la base de datos maestra sin primero no se autentica contra la base de datos contenida que mantiene su nombre de usuario y contraseña. Debido a esto, tendrá que conocer el nombre de la base de datos y escribirlo manualmente en el cuadro.

The “Connection Properties” tab of the SQL Server Management Studio connection dialog window

Figura 5 La pestaña "Propiedades de conexión" de la ventana de diálogo de conexión SQL Server Management Studio.

Tal como puede ver desde estas dos características, la consolidación de instancias de bases de datos en una instancia de SQL Server 2012 será mucho más fácil. Demorará un poco y se probará para garantizar que la aplicación de la base de datos es completamente compatible con la característica de base de datos contenida. Pero una vez que haya habilitado la configuración de base de datos contenida, las futuras migraciones y consolidaciones de bases de datos serán mucho más suaves y ese es precisamente el objetivo.

Denny Cherry

Denny Cherry, MVP, es consultor independiente con más de una década de experiencia trabajando con soluciones de Microsoft SQL Server, Hyper-V, vSphere y Enterprise Storage. Actualmente posee varias certificaciones de Microsoft relacionadas con las versiones 2000 a 2008 de SQL Server, incluida Microsoft Certified Master. Ha escrito varios libros y docenas de artículos técnicos sobre la administración de SQL Server.

Contenido relacionado