Utilidades de Sql Server con ADO.NET - Cambiar la opción de acceso de una base de datos

Hola ¿Qué tal?...

Continuando con la serie de utilidades de Sql Server con ADO.NET, llega a escena una herramienta que nos proporcionará la manera de cambiar las opciones de la base de datos, en particular cambiar la opción de acceso de los usuarios, donde podrá ser Multiusuario o de un único usuario. Esto es útil para cuando se requieren realizar tareas de mantenimiento en la base de datos, comúnmente se solicita que al base de datos esté en Single_User, sin embargo, no solo será cambiar de Multi_User a Single_User, sino también de regreso, ya que dejar una base de datos como Single_User sería caótico para la aplicación que la consume.

Cambiar la configuración de una base de datos de Multi User a Single User y viceversa con T-SQL

Esta publicación está enfocada a SQL Server 2005 por ser la versión vigente de SQL Server, por lo que la manera de cambiar la configuración de la base de datos se realizará con Alter Database, en las versiones anteriores se utiliza un procedimiento almacenado denominado sp_dboption, aquí no cubriré el uso de este procedimiento almacenado ya que ha entrado en etapa de obsolescencia, así pues veremos la manera actual, que únicamente funciona con bases de datos de SQL Server 2005.

Las opciones que utilizaremos son MULTI_USER y SINGLE_USER. Al crear una base de datos se crea con la opción del segmento “db_user_access_option” asignada a MULTI_USER, esta opción permitirá que múltiples usuarios utilicen la base de datos, sin embargo, en ocasiones en las que se deben realizar tareas de reparación sobre la base de datos se requiere que esta tenga asignada la opción SINGLE_USER. En las bases de datos de SQL Server 2005 se cuenta con la capacidad de asignar estas opciones a través de la instrucción ALTER DATABASE. En el siguiente ejemplo mostraré como realizar estos cambios con T-SQL:

-- Cambia la opción de acceso de usuario de la base de datos
-- a SINGLE_USER revertiendo todas las transacciones
Alter Database AdventureWorks set SINGLE_USER With ROLLBACK IMMEDIATE

-- Cambia la opción de acceso de usuario de la base de datos
-- a MULTI_USER revertiendo todas las transacciones
Alter Database AdventureWorks set MULTI_USER With ROLLBACK IMMEDIATE

Estas opciones se deben cambiar solo de ser necesario para tareas donde la base de datos debe estar en modo de usuario único, una vez terminadas estas tareas se deberá regresar la base de datos a modo de usuario múltiple porque de otra manera, la base de datos solo podrá ser accedida por un único usuario a la vez.

Bien, con esto definimos las instrucciones que utilizaremos en nuestros métodos de utilidades para nuestra clase SqlUtilities.

Cambiar la configuración de una base de datos de Multi User a Single User y viceversa con ADO.NET

En esta sección haremos el método que permitirá modificar la propiedad del modo de acceso a la base de datos. Tal vez modifiquemos este método más adelante o tal vez no, ¿a qué me refiero?, pues en ocasiones será conveniente tener un método único para modificar propiedades de la base de datos, sin embargo, en Sql Server 2005 hay cierto tratamiento con las propiedades de la base de datos que hacen un poco complicado su tratamiento, veremos qué tanto se puede poner en un solo método y lo que tenga un tratamiento especial estará en métodos independientes.

Para el caso en específico de cambiar el modo de acceso de la base de datos, utilizaremos un enumerador que será declarado fuera de la clase SqlUtilities pero que estará dentro del mismo namespace que dicha clase. El enumerador se muestra en el siguiente ejemplo:

VB.NET

Public Enum DBUserAccessOption
    SINGLE_USER
    RESTRICTED_USER
    MULTI_USER
End Enum

C#

public enum DBUserAccessOption
{
    SINGLE_USER,
    RESTRICTED_USER,
    MULTI_USER
}

Este enumerador agrega una opción más: RESTRICTED_USER, el comportamiento en el código es el mismo que SINGLE_USER, solo que estará restringido el acceso a usuarios que tengan la función fija  en la base de datos de db_owner y los usuarios con las funciones fijas de servidor de dbcreator y sysadmin.

Una vez definido el enumerador procedemos a definir el método que nos ayudará a cambiar el modo en que se conectan a la base de datos los usuarios. Veamos en el siguiente ejemplo cómo quedará nuestro método:

VB.NET

Public Sub ChangeDbUserAccessOption( _
    ByVal DBUserAccessOption As DBUserAccessOption)

    'Se declaran la variables a utilizar
    Dim cmd As SqlCommand = New SqlCommand( _
           "ALTER DATABASE " & cnn.Database & _
           " SET " & DBUserAccessOption.ToString() & _
           " WITH ROLLBACK IMMEDIATE")

   'Se asigna la conexión al command
    cmd.Connection = cnn

    'Se intentará la ejecución del código
    Try
        'Se abre la conexión
        cnn.Open()
        'Se ejecuta la instrucción
        cmd.ExecuteNonQuery()
        mMessages = _
          "Se cambió la opción de acceso con éxito"
    Catch ex As Exception

        'Se capturan los mensajes de error
        mMessages = ex.Message
    Finally
        'se cierra la conexión
        cnn.Close()
    End Try
End
Sub

C#

public void ChangeDbUserAccessOption(
    DBUserAccessOption DBUserAccessOption)
{
    //Se declaran la variables a utilizar
    SqlCommand cmd = new SqlCommand(
          "ALTER DATABASE " + cnn.Database +
          " SET " + DBUserAccessOption.ToString() +
        
 " WITH ROLLBACK IMMEDIATE");

    //Se asigna la conexión al command
    cmd.Connection = cnn;

    //Se intentará la ejecución del código
    try
    {
        //Se abre la conexión
        cnn.Open();
        //Se ejecuta la instrucción
        cmd.ExecuteNonQuery();
        messages =
          "Se cambió la opción de acceso con éxito";
    }
    catch (SqlException ex)
    {
        //Se capturan los mensajes de error
        messages = ex.Message;
    }
    finally
    {
        //se cierra la conexión
        cnn.Close();
    }
}

Esta instrucción no desencadena el evento InfoMessage del objeto cnn, por lo que agregamos un mensaje indicando que la operación se llevó a cabo con éxito.

Este método nos deja con una necesidad… saber qué opción de acceso tiene actualmente nuestra base de datos, lo cual justifica la siguiente publicación.

Referencias de la Publicación

 Esta publicación forma parte de la Serie 2 de la colección Utilidades de SQL Server con ADO.NET

Indice de publicaciones que conforman la Serie II:

Serie II Parte I: Diagnosticar y Reparar Tablas de una Base de Datos (http://msmvps.com/blogs/otelis/archive/2007/06/22/utilidades-de-sql-server-con-ado-net-diagnosticar-y-reparar-tablas.aspx)

Serie II Parte II: Cambiar la opción de acceso de una base de datos (http://msmvps.com/blogs/otelis/archive/2007/07/02/utilidades-de-sql-server-con-ado-net-cambiar-la-opci-243-n-de-acceso-de-una-base-de-datos.aspx)

Serie II Parte III: Consultar la opción de acceso de una base de datos (http://msmvps.com/blogs/otelis/archive/2007/07/02/utilidades-de-sql-server-con-ado-net-consultar-la-opci-243-n-de-acceso-de-una-base-de-datos.aspx)
 

Referencias Adicionales

Con esto terminamos nuestro recorrido por esta utilidad, si tienes alguna duda o comentario no dudes en dejarme tus comentarios. Las referencias de este tema las pongo a continuación:

DBCC CHECKTABLE
http://msdn2.microsoft.com/en-us/library/ms174338.aspx

ALTER TABLE
http://msdn2.microsoft.com/en-us/library/ms190273.aspx

sys.databases
http://msdn2.microsoft.com/en-us/library/ms178534.aspx

Primera entrega de SqlUtilities
http://msmvps.com/blogs/otelis/archive/2007/06/19/utilidades-de-sql-server-con-ado-net-regenerar-campos-identity.aspx

Bien, pues espero que sea de utilidad.

Saludos…

Octavio Telis

Published Monday, July 02, 2007 5:12 AM by Octavio Telis Aynés
Filed under: , , , , ,

Leave a Comment

(required) 
(required) 
(optional)
(required) 
Powered by Community Server (Commercial Edition), by Telligent Systems