Criar scripts do banco de dados, ou de qualquer objeto do SQL Server por .NET não é algo muito complexo, pois os principais objetos do SMO possuem o método Script. Mas como gerar o script desejado é o que pode dar um pouco de dor de cabeça para quem esta começando com SMO, seja no .NET ou no PowerShell.
Para primeira demonstração, vamos ver como é simples gerar o script de criação do banco de dados:
using System;
using System.IO;
using Microsoft.SqlServer.Management.Smo;
namespace DemoSmo
{
class DemoScript1
{
static void Main()
{
const string serverName = @".\SQLEXPRESS";
const string databaseName = "DemoAspNet";
const string scriptPath = @"C:\TEMP\DemoAspNet.sql";
var server = new Server(serverName);
var database = server.Databases[databaseName];
// Gerando o script do banco de dados e salvando este em um arquivo
using (var file = new StreamWriter(scriptPath))
{
Console.WriteLine("Script do banco de dados...");
foreach (var str in database.Script())
{
file.WriteLine(str);
file.WriteLine("GO");
}
}
Console.WriteLine("Script concluído ...");
Console.ReadKey();
}
}
}
Agora a geração do script das tabelas do banco de dados:
using System;
using System.IO;
using System.Linq;
using Microsoft.SqlServer.Management.Smo;
namespace DemoSmo
{
class DemoScript2
{
static void Main()
{
const string serverName = @".\SQLEXPRESS";
const string databaseName = "DemoAspNet";
const string scriptPath = @"C:\TEMP\DemoAspNet.sql";
var server = new Server(serverName);
var database = server.Databases[databaseName];
using (var file = new StreamWriter(scriptPath))
{
Console.WriteLine("Script das tabelas...");
// Relacionando as tabelas do banco de dados
foreach (var table in database.Tables.Cast<Table>().Where(table => !table.IsSystemObject))
{
// Gerando o script de cada uma das tabelas
file.WriteLine("--");
file.WriteLine("-- Tabela: [{0}].[{1}]", table.Schema, table.Name);
file.WriteLine("--");
foreach (var str in table.Script())
{
file.WriteLine(str);
file.WriteLine("GO");
}
}
}
Console.WriteLine("Script concluído ...");
Console.ReadKey();
}
}
}
Na geração do script das tabelas, é bem provável que você vá se perguntar “onde estão as constraints das tabelas?”, ai entra o objeto ScriptOptions, o qual pode ser utilizado como argumento para o método Script, afim de definir como e do que será gerado o script.
Para entender isso, temos abaixo um ScriptOptions configurado para gerar o script das tabelas com as Primary Keys (DriPrimaryKey):
var scriptOptions = new ScriptingOptions { DriPrimaryKey = true };
O ScriptOptions para gerar o script de DROP das tabelas (ScriptDrops):
var scriptOptions = new ScriptingOptions { ScriptDrops = true };
E para um exemplo final, utilizando o ScriptOption afim de gerar o script das tabelas com as Keys e Constraints (DriAll) e sem informar Collation das colunas (NoCollation):
using System;
using System.IO;
using System.Linq;
using Microsoft.SqlServer.Management.Smo;
namespace DemoSmo
{
class DemoScript3
{
static void Main()
{
const string serverName = @".\SQLEXPRESS";
const string databaseName = "DemoAspNet";
const string scriptPath = @"C:\TEMP\DemoAspNet.sql";
var server = new Server(serverName);
var database = server.Databases[databaseName];
//Definindo o objeto ScriptingOptions
var scriptOptions = new ScriptingOptions { DriAll = true, NoCollation = true };
using (var file = new StreamWriter(scriptPath))
{
Console.WriteLine("Script das tabelas...");
foreach (var table in database.Tables.Cast<Table>().Where(table => !table.IsSystemObject))
{
//ScriptingOptions com argumento do método Script
file.WriteLine("\n\n--\n-- Tabela: [{0}].[{1}]\n--\n", table.Schema, table.Name);
foreach (var str in table.Script(scriptOptions))
{
file.WriteLine(str);
file.WriteLine("GO");
}
}
}
Console.WriteLine("Script concluído ...");
Console.ReadKey();
}
}
}
No artigo da próxima semana veremos como utilizar o objeto Scripter para gerar o script de vários objetos ao mesmo tempo, e ainda nesta semana a versão deste artigo para PowerShell.
Acho muito interessante a abordagem utilizanod SMO. Acho que esta ferramenta é pouco utitilizada e poderia aumentar em muito a flexibilidade de scripts, principalmente daqueles sistemas onde o schema tende a ser evolutivo com o tempo e naqueles casos onde há um mesmo produto em vários clientes, cada cliente com uma fase diferente do schema.