No artigo da semana passada, tivemos uma breve introdução à biblioteca SMO, que pode ser tanto utilizada pelo .NET quanto pelo PowerShell para criar aplicações ou scripts para gerenciar o SQL Server.
Nesta semana, demonstrarei como utilizar as classes Smo.Backup e Smo.BackupDeviceItem, de um outro assembly do SMO, o SmoExtended, que poderá ser encontrado no caminho:
C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.SmoExtended.dll
As classes Smo.Backup e Smo.BackupDeviceItem são responsáveis respectivamente por gerar backup e determinar onde este será salvo.
Para demonstrar a utilização destas classes, adequei o exemplo da semana passada, que relacionava os bancos de dados de uma determinada instancia do SQL Server, para também possibilitar identificar a data de ultimo backup de um determinado banco de dados e realizar o backup do mesmo:

Ajuste realizado:
// Gerando a classe Smo.Backup
var backup = new Backup { Database = database.Name };
// Definindo com o Smo.BackupDeviceItem onde será salvo o backup
var path = string.Format(@"C:\Temp\{0}_{1:yyyy-MM-dd HH_mm_ss}.bak", database.Name, DateTime.Now);
backup.Devices.AddDevice(path, DeviceType.File);
// Executando o backup
backup.SqlBackup(server);
Código completo:
using System;
using System.Linq;
using System.Security;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;
namespace DemoSmo
{
class Program
{
static void Main()
{
Console.WriteLine("Servidor:");
var serverInstance = Console.ReadLine();
Console.WriteLine();
Console.WriteLine("Usuário:");
var user = Console.ReadLine();
Console.WriteLine();
ServerConnection conn;
if (!string.IsNullOrEmpty(user))
{
Console.WriteLine("Senha:");
var pass = ReadPassword();
Console.WriteLine();
// Criando um objeto de conexão com SQL Authentication
conn = new ServerConnection(serverInstance, user, pass);
}
else
{
// Criando um objeto de conexão com Windows Authentication
conn = new ServerConnection(serverInstance);
}
// Criando um objeto que abstrai a instância do SQL Server
var server = new Server(conn);
Console.WriteLine("Carregando lista de bancos de dados ...");
Console.WriteLine();
try
{
// Recuperando a lista de banco de dados
var lst = server.Databases.Cast<Database>().OrderBy(db => db.ID).ToArray();
// Escrevendo a relação de banco de dados encontrados
foreach (var db in lst) Console.WriteLine("{0}. {1}", db.ID, db.Name);
// Recuperando o banco de dados por meio do número informado pelo usuário
Console.WriteLine();
Console.WriteLine("Digite o número do banco de dados:");
var key = Console.ReadLine();
int id;
if (!int.TryParse(key, out id)) return;
var database = lst.FirstOrDefault(db => db.ID == id);
if (database == null) return;
Console.WriteLine();
// Recuperando informações do último backup do banco de dados
if (database.LastBackupDate == DateTime.MinValue)
{
Console.WriteLine("Nenhum backup encontrado.");
}
else
{
Console.WriteLine("Último backup: {0:yyyy-MM-dd HH:mm:ss}", database.LastBackupDate);
}
Console.WriteLine();
Console.WriteLine("Aperte ENTER para gerar um backup, ou qualquer outra tecla para sair.");
if (Console.ReadKey().Key != ConsoleKey.Enter) return;
// Gerando a classe Smo.Backup
var backup = new Backup { Database = database.Name };
// Definindo com o Smo.BackupDeviceItem onde será salvo o backup
var path = string.Format(@"C:\Temp\{0}_{1:yyyy-MM-dd HH_mm_ss}.bak", database.Name, DateTime.Now);
backup.Devices.AddDevice(path, DeviceType.File);
// Executando o backup
backup.SqlBackup(server);
Console.WriteLine();
Console.WriteLine("Backup concluído ...");
Console.ReadKey();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
// Método para evitar que a senha digitada apareça na tela da aplicação
private static SecureString ReadPassword()
{
var pass = new SecureString();
while (true)
{
var key = Console.ReadKey(true);
if (key.Key == ConsoleKey.Enter) break;
pass.AppendChar(key.KeyChar);
Console.Write("*");
}
Console.WriteLine();
return pass;
}
}
}
2 Respostas para “Gerando backups do SQL Server por .NET”