Getting your Trinity Audio player ready...
|
O ciclo de vida da maioria dos bancos envolve desenvolvedores e DBA´s compartilhando scripts para atualização de objetos e atividades de manutenção.
Existem algumas formas de fazer isso:
- gerar scripts de objetos
- Proporcionar acesso as partes interessadas (piada… eu sei…) para gerar os scripts
- DACPAC´s
- Backup/Restore
- etc..
Um pouco de contexto antes,,,
Um DAC (aplicativo da camada de dados) é uma entidade lógica de gerenciamento de banco de dados que define todos os objetos do SQL Server, como tabelas, exibições e objetos de instância, incluindo logons, associados a um banco de dados de usuário.
Todos tem seus prós e contras… não é a intenção deste post tratar isso…
Para quem gosta de gerar scripts dos objetos lembra que tem um outro post que faz isso…
A vantagem do DACPAC é que você pode usa-lo para comparação entre um projeto do TFS e esse pacote extraído da produção ou, caso você seja o DBA, você pode comparar esse pacote contra a sua base de produção ou uma base em homologação. Gerar os scripts para igualar os ambientes ou apenas conseguir ter ideia das diferenças.
Add-Type -AssemblyName System.Drawing Add-Type -AssemblyName System.Windows.Forms $data = get-date -format "_yyyyMMdd" $WindowTitle = "Gerador de DACPAC" $LabelPath = "Caminho:" $LabelServer = "Servidor:" # Create the Label. $label = New-Object System.Windows.Forms.Label $label.Location = New-Object System.Drawing.Size(10,20) $label.Size = New-Object System.Drawing.Size(280,20) $label.AutoSize = $true $label.Text = $LabelPath # Create the TextBox used to capture the user's text. $textBox = New-Object System.Windows.Forms.TextBox $textBox.Location = New-Object System.Drawing.Size(10,40) $textBox.Size = New-Object System.Drawing.Size(575,200) $textBox.AcceptsReturn = $true $textBox.AcceptsTab = $false $textBox.Multiline = $true $textBox.ScrollBars = 'Both' $textBox.Text = $DefaultText # Create textbox used to file destination $textBox2 = New-Object System.Windows.Forms.TextBox $textBox2.DataBindings.DefaultDataSourceUpdateMode = 0 $textBox2.Location = New-Object System.Drawing.Size(65,20) $textBox2.Name = "textBox2" $textBox2.Size = New-Object System.Drawing.Size(150,10) $textBox2.TabIndex = 0 # Create the Label. $label2 = New-Object System.Windows.Forms.Label $label2.Location = New-Object System.Drawing.Size(420,20) $label2.AutoSize = $true $label2.Text = $LabelServer # Create textbox for the Server name $textBoxServerName = New-Object System.Windows.Forms.TextBox $textBoxServerName.DataBindings.DefaultDataSourceUpdateMode = 0 $textBoxServerName.Location = New-Object System.Drawing.Size(480,20) $textBoxServerName.Name = "textBox2" $textBoxServerName.Size = New-Object System.Drawing.Size(100,10) $textBoxServerName.TabIndex = 0 # Create the OK button. $okButton = New-Object System.Windows.Forms.Button $okButton.Location = New-Object System.Drawing.Size(415,250) $okButton.Size = New-Object System.Drawing.Size(75,25) $okButton.Text = "OK" $okButton.Add_Click({ $form.Tag = $textBox.Text; $form.Close() }) # Create the Cancel button. $cancelButton = New-Object System.Windows.Forms.Button $cancelButton.Location = New-Object System.Drawing.Size(510,250) $cancelButton.Size = New-Object System.Drawing.Size(75,25) $cancelButton.Text = "Cancel" $cancelButton.Add_Click({ $form.Close() }) $app = New-Object -ComObject Shell.Application $button2_OnClick= { try { $browseForFolderOptions = 0 if ($NoNewFolderButton) { $browseForFolderOptions += 512 } $folder = $app.BrowseForFolder(0, $Message, $browseForFolderOptions, $InitialDirectory) $textbox2.Text = $folder.Self.Path #$selectedDirectory #.FileName.ToString() } catch { [System.Windows.Forms.MessageBox]::Show( $_.Exception.Message, "Error", [System.Windows.Forms.MessageBoxButtons]::OK, [System.Windows.Forms.MessageBoxIcon]::Error ) } } $button2 = New-Object System.Windows.Forms.Button $button2.Location = New-Object System.Drawing.Size(215,20) $button2.Size = New-Object System.Drawing.Size(50,20) $button2.Text = "..." $button2.UseVisualStyleBackColor = $True $button2.add_Click($button2_OnClick) # Create the form. $form = New-Object System.Windows.Forms.Form $form.Text = $WindowTitle $form.Size = New-Object System.Drawing.Size(610,320) $form.FormBorderStyle = 'FixedSingle' $form.StartPosition = "CenterScreen" $form.AutoSizeMode = 'GrowAndShrink' $form.Topmost = $True $form.AcceptButton = $okButton $form.CancelButton = $cancelButton $form.ShowInTaskbar = $true # Add all of the controls to the form. $form.Controls.Add($label) $form.Controls.Add($label2) $form.Controls.Add($textBox) $form.Controls.Add($okButton) $form.Controls.Add($cancelButton) $form.Controls.Add($textBox2) $form.Controls.Add($textBoxServerName) $form.Controls.Add($button2) # Initialize and show the form. $form.Add_Shown({$form.Activate()}) $form.ShowDialog() > $null $srv = $textBoxServerName.Text $local = $textbox2.Text $bases = $textBox.Text.Split("`n")|%{$_.trim()} $i=0 foreach ($s in $bases) { Write-Progress -Activity "Gerando DACPAC" -status "Gerando DACPAC para $s" -percentComplete ($i++ / $bases.count*100) $GoBigSon= (C:\"Program Files (x86)"\"Microsoft SQL Server"\110\DAC\bin\SqlPackage.exe /a:Extract /ssn:$srv /sdn:$s /tf:$local\$s$data.dacpac ) }
Como parece de praxe,,, tem uns pequenos bugs:
- Quando clicar no “…” para mapear o caminho, se não aparecer uma janela pop-up, movimenta a janela do app um pouco para o lado, ela ficou atrás da janela inicial,,, isso é um bug que acontece de vez em quando,,,
- se vc clicar diversas vezes no “…” ele vai ficar abrindo diversas vezes…
- ainda não estou tratando outros tipos de entrada no campo texto,,,, você deve colocar um banco abaixo do outro,,,
- e sim,,, ele fecha a janela quando você clica em OK,,,
Ele ficou até que bem simpático…
Com os campos preenchidos
E tem até barra de status… olha que chique…
Republicou isso em Alex Souza.