Criando Constraints e Índices no SQL Server com PowerShell

Para continuar com o prometido no primeiro artigo desta série de artigos sobre SMO, teremos a versão em PowerShell do artigo desta semana, que ao meu ver não ficou tão simples quanto o mesmo código escrito em .NET, mas permite ver como PowerShell pode ser mais simples que .NET em alguns momentos, e em outros nem tanto.

# Referências
[void][system.reflection.assembly]::loadfrom("C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.Smo.dll")

# Objetos
$server = new-object Microsoft.SqlServer.Management.Smo.Server(".\SQLEXPRESS")

# CREATE DATABASE [Estoque]
$database = new-object Microsoft.SqlServer.Management.Smo.Database($server, "Estoque")

$database.Create()

# Tipos a serem utilizados
$constraint_pk = [Microsoft.SqlServer.Management.Smo.IndexKeyType]::DriPrimaryKey
$constraint_uk = [Microsoft.SqlServer.Management.Smo.IndexKeyType]::DriUniqueKey
$type_int = [Microsoft.SqlServer.Management.Smo.DataType]::Int
$type_money =[Microsoft.SqlServer.Management.Smo.DataType]::Money
$type_varchar250 = [Microsoft.SqlServer.Management.Smo.DataType]::VarChar(250)
$type_decimal5_2 = [Microsoft.SqlServer.Management.Smo.DataType]::Decimal(2, 5)
$type_datetime = [Microsoft.SqlServer.Management.Smo.DataType]::DateTime

# CREATE TABLE [dbo].[Produto] ...
$table = new-object Microsoft.SqlServer.Management.Smo.Table($database, "Produto", "dbo")

$col = new-object Microsoft.SqlServer.Management.Smo.Column($table, "Id", $type_int)
$col.Nullable = $FALSE
$col.Identity = $TRUE
$table.Columns.Add($col)

$col = new-object Microsoft.SqlServer.Management.Smo.Column($table, "Nome", $type_varchar250)
$col.Nullable = $FALSE
$table.Columns.Add($col)

$col = new-object Microsoft.SqlServer.Management.Smo.Column($table, "Quantidade", $type_int)
$col.Nullable = $FALSE
$table.Columns.Add($col)

$col = new-object Microsoft.SqlServer.Management.Smo.Column($table, "Valor", $type_money)
$col.Nullable = $FALSE
$table.Columns.Add($col)

$col = new-object Microsoft.SqlServer.Management.Smo.Column($table, "Peso", $type_decimal5_2)
$col.Nullable = $FALSE
$table.Columns.Add($col)

$col = new-object Microsoft.SqlServer.Management.Smo.Column($table, "Frete", $type_money)
$col.Nullable = $TRUE
$table.Columns.Add($col)

$col = new-object Microsoft.SqlServer.Management.Smo.Column($table, "CategoriaId", $type_int)
$col.Nullable = $FALSE
$table.Columns.Add($col)

$col = new-object Microsoft.SqlServer.Management.Smo.Column($table, "DataCadastro", $type_datetime)
$col.Nullable = $FALSE
$table.Columns.Add($col)

$table.Create()

# CREATE TABLE [dbo].[Categoria] ...
$table2 = new-object Microsoft.SqlServer.Management.Smo.Table($database, "Categoria", "dbo")

$col = new-object Microsoft.SqlServer.Management.Smo.Column($table2, "Id", $type_int)
$col.Nullable = $FALSE
$col.Identity = $TRUE
$table2.Columns.Add($col)

$col = new-object Microsoft.SqlServer.Management.Smo.Column($table2, "Nome", $type_varchar250)
$col.Nullable = $FALSE
$table2.Columns.Add($col)

$table2.Create()

# ALTER TABLE [dbo].[Produto]
#   ADD CONSTRAINT [PK_Produto] PRIMARY KEY ([Id])
$pk = new-object Microsoft.SqlServer.Management.Smo.Index($table, "PK_Produto")
$pk.IndexKeyType = $constraint_pk

$col = new-object Microsoft.SqlServer.Management.Smo.IndexedColumn($pk, "Id")
$pk.IndexedColumns.Add($col)

$pk.Create()

# ALTER TABLE [dbo].[Categoria]
#   ADD CONSTRAINT [PK_Categoriao] PRIMARY KEY (Id)
$pk2 = new-object Microsoft.SqlServer.Management.Smo.Index($table2, "IndexedColumn")
$pk2.IndexKeyType = $constraint_pk

$col = new-object Microsoft.SqlServer.Management.Smo.IndexedColumn($pk2, "Id")
$pk2.IndexedColumns.Add($col)

$pk2.Create()

# ALTER TABLE [dbo].[Produto]
#   ADD CONSTRAINT [UK_Produto_Nome] UNIQUE ([Nome])
$uk = new-object Microsoft.SqlServer.Management.Smo.Index($table, "UK_Produto_Nome")
$uk.IndexKeyType = $constraint_uk

$col = new-object Microsoft.SqlServer.Management.Smo.IndexedColumn($uk, "Nome")
$uk.IndexedColumns.Add($col)

$uk.Create()

# CREATE INDEX [IX_Produto_NmQtVl]
#   ON [dbo].[Produto] ([Nome], [Quantidade], [Valor])
#   INCLUDE ([Peso])
$ix = new-object Microsoft.SqlServer.Management.Smo.Index($table, "IX_Produto_NmQtV")

$col = new-object Microsoft.SqlServer.Management.Smo.IndexedColumn($ix, "Nome")
$ix.IndexedColumns.Add($col)

$col = new-object Microsoft.SqlServer.Management.Smo.IndexedColumn($ix, "Quantidade")
$ix.IndexedColumns.Add($col)

$col = new-object Microsoft.SqlServer.Management.Smo.IndexedColumn($ix, "Valor")
$ix.IndexedColumns.Add($col)

$col = new-object Microsoft.SqlServer.Management.Smo.IndexedColumn($ix, "Peso")
$col.IsIncluded = $TRUE
$ix.IndexedColumns.Add($col)

$ix.Create()

# ALTER TABLE [dbo].[Produto]
#   ADD CONSTRAINT [DF_Produto_DataCadastro] DEFAULT (GETDATE()) FOR [DataCadastro]
$col = $table.Columns["DataCadastro"]
$def = $col.AddDefaultConstraint("DF_Produto_DataCadastro")
$def.Text = "(GETDATE())"
$def.Create()

# ALTER TABLE [dbo].[Produto]
#   ADD CONSTRAINT [PK_Categoriao] FOREIGN KEY ([CategoriaId])
#   REFERENCE [dbo].[Categoria] ([Id])
$fk = new-object Microsoft.SqlServer.Management.Smo.ForeignKey($table, "FK_Produto_Categoria")
$fk.ReferencedTableSchema = $table2.Schema
$fk.ReferencedTable = $table2.Name

$col = new-object Microsoft.SqlServer.Management.Smo.ForeignKeyColumn($fk, "CategoriaId", "Id")
$fk.Columns.Add($col)

$fk.Create()

# DROP TABLE [dbo].[Produto]
$table.Drop()

# DROP TABLE [dbo].[Categoria]
$table2.Drop()

# DROP DATABASE [dbo].[Estoque]
$database.Drop()
Anúncios

Um pensamento sobre “Criando Constraints e Índices no SQL Server com PowerShell

  1. Pingback: Trabalhando com SMO – Resumo « SQL From Hell.com

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s