Database
 sql >> Base de Dados >  >> RDS >> Database

Analisar valores padrão de parâmetro usando o PowerShell – Parte 3


[ Parte 1 | Parte 2 | Parte 3]

Na parte 1 e na parte 2 desta série, apresentei ParamParser:um módulo do PowerShell que ajuda a analisar informações de parâmetros – incluindo valores padrão – de procedimentos armazenados e funções definidas pelo usuário, porque o SQL Server não fará isso por nós.

Nas primeiras iterações do código, eu simplesmente tinha um arquivo .ps1 que permitia colar um ou mais corpos de módulo em um $procedure embutido em código variável. Havia muita coisa faltando nessas primeiras versões, mas abordamos várias coisas até agora:
  • Agora é um módulo adequado – você pode executar Import-Module .\ParamParser.psm1 e, em seguida, chame o método Get-ParsedParams função ao longo de uma sessão (além dos outros benefícios que você obtém de um módulo). Esta não foi uma conversão trivial – parabéns novamente para Will White.
  • Suporte a funções definidas pelo usuário – Expliquei na parte 2 como nomes de funções são mais difíceis de analisar do que nomes de procedimentos; o código agora lida com isso corretamente.
  • Automatizando ScriptDom.dll – não temos permissão para redistribuir este arquivo de chave e, como você pode encontrar problemas se não o tiver (ou tiver uma versão desatualizada), será criado init.ps1 , que baixa e extrai automaticamente a versão mais recente (atualmente 150.4573.2) e a coloca na mesma pasta dos outros arquivos.
  • Fontes adicionais – você ainda pode passar um bloco de script bruto, se quiser, mas agora também pode usar várias instâncias e bancos de dados como fontes, fazer referência a um ou mais arquivos diretamente ou extrair todos os .sql arquivos de um ou mais diretórios. Vou mostrar alguns exemplos de sintaxe abaixo.
  • A saída indica a origem – já que você pode processar vários arquivos ou bancos de dados em uma chamada e pode ter vários objetos com o mesmo nome, incluindo a fonte ajuda a desambiguar. Não posso fazer muito se você tiver duas instâncias de CREATE PROCEDURE dbo.blat ... no mesmo arquivo ou script bruto, e a fonte nem é indicada se você usar -Script e passar em uma string.
  • Resultado aprimorado – você ainda pode despejar tudo no console, mas também pode usar Out-GridView para visualizar os resultados em um formato de grade (aqui está um exemplo chato do AdventureWorks2019) ou registrar as informações do parâmetro em um banco de dados para consumo em outro lugar.

Siga as instruções no leia-me para baixar e configurar. Depois de clonar o repositório, execute .\init.ps1 e, em seguida, Import-Module .\ParamParser.psm1 . Teste-o com um exemplo simples, como:
Get-ParsedParams -Script "CREATE PROCEDURE dbo.a @b int = 5 out AS PRINT 1;" -GridView

Saída (clique para ampliar):



Existem muitas outras combinações de parâmetros também. O cabeçalho de ajuda mostra uma boa parte da sintaxe possível (e obrigado novamente a Will por muita limpeza incrível aqui):
Get-ParsedParams -?

Resultados:
Get-ParsedParams [-Script] [[-GridView]] [[-Console]] [[-LogToDatabase]] [[-LogToDBAuthenticationMode] {SQL | Windows}] []

Get-ParsedParams [-File] [[-GridView]] [[-Console]] [[-LogToDatabase]] [[-LogToDBAuthenticationMode ] {SQL | Windows}] []

Get-ParsedParams [-Directory] [[-GridView]] [[-Console]] [[-LogToDatabase]] [[-LogToDBAuthenticationMode ] {SQL | Windows}] []

Get-ParsedParams [-ServerInstance] [-Database] [[-AuthenticationMode] {SQL | Windows}] [[-GridView]] [[-Console]] [[-LogToDatabase]] [[-LogToDBAuthenticationMode] {SQL | Windows}] []

Mais alguns exemplos


Para analisar todos os objetos em c:\temp\db.sql :
Get-ParsedParams -File "C:\temp\db.sql" -GridView

Para analisar todos os arquivos .sql em c:\temp\scripts\ (recursivo) e h:\sql\ (também recursiva):
Get-ParsedParams -Directory "C:\temp\scripts\", "H:\sql\" -GridView

Para analisar todos os objetos em msdb na instância nomeada local SQL2019 usando a autenticação do Windows:
Get-ParsedParams -ServerInstance ".\SQL2019" -Database "msdb" -GridView

Para analisar todos os objetos em msdb , floob e AdventureWorks2019 na instância nomeada local SQL2019 e ser solicitado a fornecer credenciais de autenticação SQL:
Get-ParsedParams -ServerInstance ".\SQL2019" -Database "msdb","floob","AdventureWorks" -AuthenticationMode "SQL" -GridView

Para analisar todos os objetos em msdb na instância nomeada local SQL2019 e passe as credenciais de autenticação SQL:
$password = ConvertTo-SecureString -AsPlainText -Force -String "Str0ngP@ssw0rd"
$credential = New-Object -TypeName "PSCredential" -ArgumentList "SQLAuthUsername", $password
Get-ParsedParams -ServerInstance ".\SQL2019" -Database "msdb" -AuthenticationMode "SQL" -SqlCredential $credential -GridView

Para analisar todos os arquivos .sql em c:\temp\scripts\ (recursivo) e coloque os resultados em uma tabela na instância nomeada local SQL2019 em um banco de dados, Utility , onde você já criou dbo.ParameterSetTVP , dbo.LogParameters , etc., usando a autenticação do Windows:
Get-ParsedParams -Directory "C:\temp\scripts" -LogToDatabase -LogToDBServerInstance ".\SQL2019" -LogToDBDatabase "Utility"

Para analisar todos os objetos em msdb na instância nomeada local SQL2019 e escreva para o Utility banco de dados na mesma instância, usando as mesmas credenciais de autenticação SQL:
$password = ConvertTo-SecureString -AsPlainText -Force -String "Str0ngP@ssw0rd"
$credential = New-Object -TypeName "PSCredential" -ArgumentList "SQLAuthUsername", $password
Get-ParsedParams -ServerInstance ".\SQL2019" -Database "msdb" -AuthenticationMode "SQL" -SqlCredential $credential -LogToDatabase ` 
                 -LogToDBServerInstance ".\SQL2019" -LogToDBDatabase "Utility" -LogToDBAuthenticationMode "SQL" -LogToDBSqlCredential $credential

Isso começa a ficar confuso, mas espero que você esteja automatizando isso e não digitando manualmente todas as vezes.

Próxima vez


Como sempre, há mais melhorias que podem ser feitas. Não gosto dos nomes dos parâmetros que criei, mas acho que há melhorias mais importantes, como tratamento de erros e extensibilidade que devem ser feitas. Alguma sugestão? Por favor, deixe-me saber ou, melhor ainda, contribua!

[ Parte 1 | Parte 2 | Parte 3]