Olá, pessoal!
Hoje irei apresentar um novo módulo de PowerShell que pode ajudar nas rotinas de testes, sempre que precisamos testar alguma nova rotina, funcionalidade, script, demonstrações, ou até mesmo brincar com T-SQL. Muito desses casos precisamos gerar tabelas com dados.
Apesar de ser uma tarefa relativamente simples, em alguns momentos precisamos de dados mais próximos da realidade. Para isso utilizaremos o módulo de PowerShell NameIT criado por Doug Finke.
Esse módulo já está publicado na PSGallery, então se você está operando em uma versão do PowerShell que seja igual ou superior a 3.0, pode instalar o módulo com o seguinte script:
Install-Module NameIT
Para validar a instalação do módulo:
Get-Module -ListAvailable -Name NameIT
Esse módulo proporciona uma forma fácil para gerar dados aleatórios e com mais riqueza do que costumamos gerar manualmente. Ele engloba os seguintes valores de geração a seguir. Os dados são baseados nos Estados Unidos – ainda não há suporte para nossa língua.
- [person]: gera nomes masculinos e femininos aleatórios
- [person female]: gera nomes femininos aleatórios
- [person male]: gera nomes masculinos aleatórios
- [address]: gera endereços aleatórios
- [state]: gera informações sobre estados
- [randomdate]: datas aleatórias
- [synonym word]: gera sinônimos de uma palavra
- [numeric]: gera números
- [alpha]: gera letras aleatórias
- [vowel]: gera vogais aleatórias
- [consonant]: gera consoantes aleatórias
- [syllable]: gera sílabas aleatórias
A principal função do módulo é a Invoke-Generate:
Invoke-Generate “[person], [address]” -Count 4
No exemplo acima a chamada do comando gera quatro nomes e endereços aleatórios. O parâmetro -Count indica a quantidade de itens que será gerado.
Podemos gerar palavras com combinações de valores aleatórios, como:
Invoke-Generate “Servidor-###-???” -count 5
No exemplo acima podemos notar que o carácter “#” é traduzido como um número aleatório e o caractere“?” é traduzido como uma letra aleatória.
Sinônimos para a palavra “Discovery”:
Invoke-Generate “[synonym discovery]”
Gerando nomes aleatórios do sexo feminino:
Invoke-Generate “[person female]” -5
Gerando dados sobre estados como abreviação, código postal e capital.
Invoke-Generate “[state abbr] [state zip] [state capital]” -5
Você pode customizar seus próprios conjuntos de dados para casos mais específicos. Exemplo:
$CustomData = @{
Times = @(‘São Paulo’,’Corinthians’,’Palmeiras’,’Santos’)
acao = @(‘Ganhou do’,’Perdeu para’,’Empatou com’)
}
Invoke-Generate “[times] [acao] [times]” -CustomData $CustomData
Apesar do resultado ser aleatório, representa uma grande verdade!
Criando um template para seus dados. O template pode facilitar na geração de dados em massa.
$template = “
name = [person]
phone = [randomdate]
“
Invoke-Generate $Template -AsPSObject -Count 10
Mais um exemplo de dados que podemos gerar aleatoriamente utilizando um dataset customizado:
$CustomData = @{
color = @(‘Red’,’Green’,’Blue’,’Black’,’White’)
weekday = @(‘Monday’,’Tuesday’,’Wednesday’,’Thursday’,’Friday’)
team = @(‘IT’,’Accounting’,’Marketing’,’Shipping’,’Administration’,’Sales’)
}
[pscustomobject]@{
id = Invoke-Generate “[guid]”
ComputerName = Invoke-Generate “Host-[state abbr]##”
user = Invoke-Generate “[person]”
Phone = Invoke-Generate “###-###-####”
Datains = Invoke-Generate “[randomdate]”
Status = Invoke-Generate ‘[status]’ -CustomData @{
status = @(‘Secure’,’Unpatched’,’Unsecure’)
}
FavoriteColor = Invoke-Generate “[color]” -CustomData $CustomData
DayOff = Invoke-Generate “[weekday]” -CustomData $CustomData
Team = Invoke-Generate “[team]” -CustomData $CustomData
Address = Invoke-Generate “[Address]”
Age = Invoke-Generate “##”
}
Para trazer essa brincadeira ao nosso mundo de SQL Server, eu desenvolvi o script no link abaixo:
#Load SMO
[Reflection.Assembly]::LoadWithPartialName(“Microsoft.SqlServer.Smo”) | Out-Null
#Put your SQL Server instance
$SqlInstance = “DESKTOP-A7S2JPV\SQLSERVER2017”
#Choice a dbname to be created
$Sqldb = “NameIT_DB”
#Number of lines to be inserted on table tb_users
$QtdLines = 1000
#Connect and create database
$srv = new-Object Microsoft.SqlServer.Management.Smo.Server($SqlInstance)
$db = New-Object Microsoft.SqlServer.Management.Smo.Database($srv, $Sqldb)
$db.Create()
#Create the Table called tb_users
$tb = new-object Microsoft.SqlServer.Management.Smo.Table($db, “tb_users”)
#Create columns to table tb_users
$col1 = new-object Microsoft.SqlServer.Management.Smo.Column($tb, “Age”, [Microsoft.SqlServer.Management.Smo.DataType]::Int)
$col2 = new-object Microsoft.SqlServer.Management.Smo.Column($tb, “street”, [Microsoft.SqlServer.Management.Smo.DataType]::VarChar(50))
$col3 = new-object Microsoft.SqlServer.Management.Smo.Column($tb, “Dateins”, [Microsoft.SqlServer.Management.Smo.DataType]::Varchar(20))
$col4 = new-object Microsoft.SqlServer.Management.Smo.Column($tb, “ComputerName”, [Microsoft.SqlServer.Management.Smo.DataType]::VarChar(100))
$col5 = new-object Microsoft.SqlServer.Management.Smo.Column($tb, “Phone”, [Microsoft.SqlServer.Management.Smo.DataType]::VarChar(100))
$col6 = new-object Microsoft.SqlServer.Management.Smo.Column($tb, “Id”, [Microsoft.SqlServer.Management.Smo.DataType]::varchar(50))
$col7 = new-object Microsoft.SqlServer.Management.Smo.Column($tb, “capital”, [Microsoft.SqlServer.Management.Smo.DataType]::VarChar(50))
$col8 = new-object Microsoft.SqlServer.Management.Smo.Column($tb, “UserName”, [Microsoft.SqlServer.Management.Smo.DataType]::VarChar(100))
$col9 = new-object Microsoft.SqlServer.Management.Smo.Column($tb, “state”, [Microsoft.SqlServer.Management.Smo.DataType]::VarChar(5))
$col10 = new-object Microsoft.SqlServer.Management.Smo.Column($tb, “zip”, [Microsoft.SqlServer.Management.Smo.DataType]::VarChar(15))
#Add columns
$tb.Columns.Add($col1)
$tb.Columns.Add($col2)
$tb.Columns.Add($col3)
$tb.Columns.Add($col4)
$tb.Columns.Add($col5)
$tb.Columns.Add($col6)
$tb.Columns.Add($col7)
$tb.Columns.Add($col8)
$tb.Columns.Add($col9)
$tb.Columns.Add($col10)
#Create table tb_users
$tb.Create()
#Create a template to make easier
$template =’
Age = ##
street = [Address]
Datains = [randomdate]
ComputerName = Host-[state abbr]##
Phone = ###-###-####
id = [guid]
capital = [state capital]
user = [person]
state = [state abbr]
zip = [state zip]
‘
#Fill variable called $table and transform to datatable
$table = Invoke-Generate $Template -AsPSObject -Count $QtdLines | ConvertTo-DbaDataTable
#Use Dbatools to write lines on SQL Server database
Write-DbaDataTable -SqlInstance $SqlInstance -InputObject $table -Database $Sqldb -Table $tb.Name
#Refresh table and show qtd lines
$tb.Refresh()
$tb.RowCount
O Script acima utiliza SMO para criar um banco de dados chamado NameIT_DB com uma tabela chamada tb_users, realizando uma inserção de 1000 linhas com dados aleatórios. Para inserção estou utilizando uma função do Dbatools a Write-DbaDataTable.
Cuidado com a quantidade de linhas que deseja inserir – isso pode levar algum tempo, por isso deixei o default de 1000 no script.
Como resultado do comando acima teremos o seguinte retorno:
Dados com nomes de rua, estado, código postal, capital, nomes e datas – a partir daqui você poderá brincar melhor com seus testes. O módulo NameIT proporciona uma riqueza de customização, para você que quer brincar com T-SQL gerar dados fakes pode ser uma ótima opção. Explore um pouco mais no GitHub:
Se você gosta de Python, tem uma biblioteca equivalente em:
Como referência tem o excelente artigo do Kevin Marquette, um mestre em PowerShell:
Bom, galera, ficamos por aqui. Como sempre reforço para que façam exemplos com seus mundos e pratiquem bastante. Espero que gostem e até a próxima!