SQL Server Management Objects (SMO) y WMI

Los desarrolladores de base de datos no sólo deben consultar y manipular datos, sino que también realizan periódicamente tareas administrativas. SQL Server™ Management Objects (SMO) ofrece a los desarrolladores un sólido conjunto de herramientas para realizar operaciones, tales como la copia de seguridad o la restauración de bases de datos, y la ejecución de comandos de lenguaje de definición de datos (DDL). Mediante el SQL SMO también puede conectar con SQL Server, crear iteraciones en una colección de objetos de base de datos y realizar varias tareas en ellos.

 Hablaré sobre cómo se puede usar SMO para examinar los objetos de una base de datos y para realizar diversas tareas administrativas. En especial, trataré temas como el diseño de proyectos para que usen SMO y cómo conectar con un servidor. También explicaré paso a paso el ejemplo de una aplicación que ejecuta comandos DDL o DML (lenguaje de manipulación de datos) sobre la base de datos. Demostraré cómo usar SMO para realizar y comprobar copias de seguridad y restauraciones de la base de datos y para terminar un overview de Windows Management Instrumentation (WMI)

SQL  Management Objects

Biblioteca de clases manejadas para administrar SQL Server

Se instalan con las Herramientas Cliente de SQL Server 2005

 

EnumRegisteredServers

 

Método compartido que permite obtener la lista de servidores disponibles en la red

Obtiene información del servidor, sin crear una instancia

 

•Nombre

•Modo de autenticación

•Instancia

 

A partir de la instancia de la clase Server, se pueden obtener las bases de datos y sus detalle como la versión de la instancia de SQL Server utilizado al crear la Database, el estad, etc.

 

El servidor expone toda su configuración:

 

•Microsoft.SqlServer.Management.Smo.Server.Configuration.Properties

•Cada una: (Microsoft.SqlServer.Management.Smo.ConfigProperty)

 

oDisplayName

oDescription

oConfigValue

 

Permitiendo Administrar el conjunto de servidores como un todo

 

Ejemplo:

 

Recuperar los valores de las propiedades, establecer un nuevo valor para una o más de ellas y

establecer el cambio en cada uno de los servidores que se desee

 

Principios básicos de SMO

 

SMO es una biblioteca de objetos de Microsoft® .NET que permite administrar uno o más servidores de bases de datos. Está diseñado para funcionar con las nuevas características que presentó SQL Server 2005, pero también conecta con bases de datos de SQL Server 2000 con compatibilidad para sus respectivas características heredadas. Sin embargo, algunas de las clases, las propiedades y los métodos de SMO sólo funcionan con SQL Server 2005 para admitir características nuevas como, por ejemplo, SQL Service Broker y Snapshots Isolation (aislamiento de instantáneas).

Aunque SQL Distributed Management Objects basado en COM (SQL-DMO) se sigue incluyendo con SQL Server 2005, no se actualizó para que incluya el acceso directo a las características más recientes de SQL Server 2005, como se hizo con SMO. Al diseñar una aplicación .NET que administre una base de datos de SQL Server, es recomendable elegir SQL SMO frente al uso de la interoperabilidad COM con DMO. También debe considerar la actualización de las aplicaciones que ahora usan DMO para que, en su lugar, usen SMO.

Puede instalar SMO durante la instalación de Microsoft® SQL Server 2005 si activa la opción para instalar las herramientas cliente. A continuación, al crear un proyecto que usará SMO, haga referencia primero a los ensamblados apropiados. Los dos archivos DLL a los que debe hacer referencia son Microsoft.SqlServer.Smo.dll y Microsoft.SqlServer.ConnectionInfo.dll. El primero contiene las clases principales de SMO (tal como Database, Server, Backup y Restore) mientras que el segundo contiene la biblioteca de clases que ayudan a administrar las conexiones con los objetos de SQL Server. En muchos casos, también deberá hacer referencia a Microsoft.SqlServer.SqlEnum.dll, que contiene en su mayor parte útiles enumeraciones y a Microsoft.SqlServer.SmoEnum.dll, que ofrece la clase Urn para el acceso mediante programación a direcciones del Nombre de recursos uniforme (URN) que identifican de manera exclusiva a los objetos de Microsoft SQL Server.

Listado de los servidores

 

Con SMO puede recuperar una lista de instalaciones disponibles de SQL Server en una red. Puede especificar argumentos que controlen si se debe buscar SQL Server en la red o sólo buscar de forma local. La clase SmoApplication expone un método estático llamado EnumAvailableSqlServers. Cuando se pasa un valor booleano true, el método sólo buscará los servidores locales y los devolverá a todos. Si se pasa un valor false a este método, hará que busque todos los servidores disponibles en la red. El código siguiente obtiene una lista de instancias de SQL Server disponibles en la red y las devuelve en una DataTable de ADO.NET:

 

DataTable dtServer = SmoApplication.EnumAvailableSqlServers(false);

       

StringBuilder sbServer = new StringBuilder(250);

 

foreach (DataRow row in dtServer.Rows)

{

     sbServer.Append(row["Server"].ToString());

     if (row["Instance"] != null && row["Instance"].ToString().Length > 0)

     {

          sbServer.Append(@"\");

          sbServer.Append(row["Instance"].ToString());

          sbServer.Append(Environment.NewLine);

     }

}

MessageBox.Show(sbServer.ToString());

 

Conexión a un servidor

 

 Al generar una aplicación con SMO, uno de los primeros pasos suele ser conectarse a una instancia de SQL Server. No hay nada extraordinario aquí; establecer una conexión requiere que se pase el nombre del SQL Server (y su nombre de instancia si existen varias instancias) y las credenciales de inicio de sesión. Si desea conectar con autenticación de Windows ®, puede especificarlo con SMO.

 

Creé una clase llamada SMOHelper en el ejemplo de la aplicación para ayudar con algunas rutinas comunes que usará mi aplicación. Se puede usar una instancia de la clase SMOHelper para interactuar con un SQL Server individual. Tiene un constructor que acepta que la información necesaria para conectarse a un servidor mediante autenticación de Windows o de SQL Server.

 

Demo 1: Muestro el constructor SMOHelper que adquiere y configura las propiedades de clase adecuadas, que usarán los métodos de esta clase para realizar operaciones con la base de datos.

 

public SMOHelper(string serverAndInstanceName, string userName, string password, bool useWindowsAuthentication)

{

    this.server = new Server();

    if (serverAndInstanceName.Contains(@"\"))

    {

         int slashPos = serverAndInstanceName.IndexOf(‘\\’);

         this.serverName = serverAndInstanceName.Substring(0, slashPos);

         this.instance = serverAndInstanceName.Substring(slashPos + 1);

    }

    else

    {

         serverName = serverAndInstanceName;

         instance = string.Empty;

    }

    this.userName = userName;

    this.password = password;

    this.useWindowsAuthentication = useWindowsAuthentication;

}

 

Las conexiones a un servidor se realizan al crear una instancia de la clase Server y establecer las propiedades de la clase ConnectionContext.

 

Demo 2: Establece la conexión según el tipo de autenticación que seleccionó el usuario en el formulario. Aunque puede llamar explícitamente al método Connect de ConnectionContext, esto no es realmente necesario, ya que SMO obtiene y libera conexiones de un grupo.

 

public void Connect()

{

    server.ConnectionContext.ServerInstance = ServerAndInstanceName;

    if (this.useWindowsAuthentication)

    {

        server.ConnectionContext.LoginSecure = useWindowsAuthentication;

    }

    else

    {

        server.ConnectionContext.LoginSecure = this.useWindowsAuthentication;

        server.ConnectionContext.Login = this.userName;

        server.ConnectionContext.Password = this.password;

    }

    server.ConnectionContext.Connect();

}

 

Listado de bases de datos

 

Una vez conectado al servidor, se puede recuperar la lista de bases de datos de ese servidor a través de la propiedad Databases del objeto Server. En el ejemplo de aplicación, usé el enlace de datos para enlazar la lista de bases de datos del servidor a un control de cuadro combinado. Creé iteraciones a través de DatabaseCollection y un List<string> para que contenga los nombres de las bases de datos. A continuación, esta lista se vincula al control del cuadro combinado donde el usuario puede seleccionar una base de datos y realizar una acción sobre ella. El fragmento de código siguiente pasa por las bases de datos y genera la lista de cadenas de nombre

 

public List<string> GetDatabaseNameList()

        {

            List<string> dbList = new List<string>();

            foreach (Database db in server.Databases)

                dbList.Add(db.Name);

            return dbList;

        }

En el fragmento de código anterior, sólo quería una lista de nombres de base de datos, así que sólo creé un List<string>. Sin embargo, el control de cuadro combinado se podría haber enlazado igual de fácil a una lista de clases personalizadas (tal como List<MyDatabase>) que ajusta los objetos funcionalmente enriquecidos que normalmente se devuelven de muchos métodos de SMO.

 

Copia de seguridad de una base de datos

 

Una de las tareas más comunes para la que los desarrolladores usan SMO es para hacer copias de seguridad de una base de datos. SMO facilita bastante la tarea de hacer una copia de seguridad de la base de datos con su clase Backup

La clase Backup de SMO expone algunos eventos que pueden usarse como ayuda para seguir el progreso de una copia de seguridad.

 

Demo 3: Copia de seguridad de una base de datos con SMO

 

 public void BackupDatabase(string databaseName)

 {

      Console.WriteLine("*** Backing up ***");

      Backup backup = new Backup();

      backup.Action = BackupActionType.Database;

      backup.Database = databaseName;

      backup.Devices.Clear();

      backup.Incremental = false;

      backup.Initialize = true;

      backup.LogTruncation = BackupTruncateLogType.Truncate;

      string fileName = string.Format("{0}\\{1}.bak", testFolder, databaseName);

      BackupDeviceItem backupItemDevice = new BackupDeviceItem(fileName, DeviceType.File);

      backup.Devices.Add(backupItemDevice);

      backup.PercentCompleteNotification = 10;

      backup.PercentComplete += new PercentCompleteEventHandler(backup_PercentComplete);

      backup.Complete += new ServerMessageEventHandler(backup_Complete);

      backup.SqlBackup(server);

}

 

En BackupDatabase, primero creo una instancia de la clase Backup. A continuación, establecí la propiedad Action al valor de enumeración de BackupActionType.Database (también se pueden hacer copias de seguridad de registros y archivos). Evidentemente, luego establecí el nombre de la base de datos de la que se debe crear la copia de seguridad y algunas otras propiedades. Puesto que quiero realizar una copia de seguridad completa de la base de datos, indico a la copia de seguridad que no deseo una copia de seguridad incremental. Para ello, establezco la propiedad Incremental en false.

Al realizar una copia de seguridad de una base de datos, es necesario especificar la ubicación de la ruta de acceso al archivo y el nombre de archivo donde desea crear el archivo de copia de seguridad. En mi código, pongo todas las copias de seguridad en la misma carpeta para simplificarlo (consulte la variable testFolder). Cuando elijo dónde crear el archivo de copia de seguridad, creo un BackupDeviceItem y lo agrego a la lista Devices de la clase Backup. Opté por guardar la copia de seguridad como un archivo, pero también puede guardarse en otros destinos como LogicalDevice o Tape.

Agregué un controlador de eventos al evento PercentComplete para que el proceso de copia de seguridad notifique al formulario que lo llama y a su control ProgressBar. Este evento se produce en un intervalo definido por la propiedad PercentCompleteNotification. En el ejemplo de aplicación, esto es lo que hace que el control ProgressBar muestre el progreso. También agregué un controlador de eventos al evento Complete para que se pueda notificar al formulario cuando se haya finalizado la copia de seguridad.

Por último, ejecuto el método SqlBackup, que es lo que en realidad realiza la tarea de copia de seguridad de la base de datos. Tenga presente que hacer una copia de seguridad de una base de datos puede tardar más de lo previsto en función de varios factores como, por ejemplo, el tamaño de la base de datos y su contenido. 

About justindeveloper

I am MCP (Microsoft Certified Professional). MCTS (Microsoft Certified Technology Specialist) and MCPD (Microsoft Certified Professional Developer), also I am SAP Business One Certified!! Desarrollando desde el IDE de Visual Studio NET 2003 hasta ahora con el Visual Studio NET 2010. Desde Microsoft SQL Server 2000 hasta ahora con el Microsoft SQL Server 2008 R2 y tambien con SharePoint, desde WSS 3.0 y MOSS 2007 y ahora familirizandome con el Sharepoint Foundation 2010 & Sharepoint Server 2010. The software development will follow being every time more wonderful!
This entry was posted in Development. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s