[パート1|パート2|パート3]
このシリーズのパート1とパート2では、パラメーター情報の解析に役立つPowerShellモジュールであるParamParserを紹介しました–デフォルト値を含む–ストアドプロシージャとユーザー定義関数から。SQLServerはそれを実行しないためです。
コードの最初の数回の反復では、ハードコードされた$procedure
に1つ以上のモジュール本体を貼り付けることができる.ps1ファイルがありました。 変数。これらの初期のバージョンには多くの欠落がありましたが、これまでにいくつかの問題に対処してきました:
- これで適切なモジュールになりました –
Import-Module .\ParamParser.psm1
を実行できます 次に、Get-ParsedParams
を呼び出します セッション全体で機能します(モジュールから得られる他の利点に加えて)。これは些細な変換ではありませんでした–再びウィルホワイトへの称賛。 - ユーザー定義関数のサポート –パート2で、関数名がプロシージャ名よりも解析が難しいことを説明しました。コードはこれを適切に処理するようになりました。
- ScriptDom.dllの自動化 –このキーファイルを再配布することは許可されていません。また、このキーファイルがない場合(または古いバージョンがある場合)に問題が発生する可能性があるため、
init.ps1
が作成されます。 、最新バージョン(現在は150.4573.2)を自動的にダウンロードして抽出し、他のファイルと同じフォルダーに配置します。 - 追加のソース –必要に応じて、生のスクリプトブロックを渡すこともできますが、複数のインスタンスとデータベースをソースとして使用したり、1つ以上のファイルを直接参照したり、すべての
.sql
をプルしたりすることもできます。 1つ以上のディレクトリからのファイル。以下に構文例をいくつか示します。 - 出力はソースを示します – 1回の呼び出しで複数のファイルまたはデータベースを処理でき、ソースを含めて同じ名前の複数のオブジェクトがある場合は、明確にするのに役立ちます。
CREATE PROCEDURE dbo.blat ...
のインスタンスが2つある場合、私は多くのことを行うことができません。 同じファイルまたは生のスクリプト内にあり、-Script
を使用した場合でも、ソースは示されません。 文字列を渡します。 - 出力の改善 –引き続きすべてをコンソールにダンプできますが、
Out-GridView
を使用することもできます 結果をグリッド形式で表示するか(AdventureWorks2019の退屈な例です)、他の場所で使用するためにパラメータ情報をデータベースに記録します。
readmeの指示に従って、ダウンロードして設定します。リポジトリのクローンを作成したら、.\init.ps1
を実行します。 次に、Import-Module .\ParamParser.psm1
。次のような簡単な例でテストします。
Get-ParsedParams -Script "CREATE PROCEDURE dbo.a @b int = 5 out AS PRINT 1;" -GridView
出力(クリックして拡大):
ただし、他にも多くのパラメーターの組み合わせがあります。ヘルプヘッダーには、可能な構文のかなりの部分が示されています(そして、ここで多くのすばらしいクリーンアップを行ってくれたWillに再度感謝します):
Get-ParsedParams -?
結果:
Get-ParsedParams [-Script]Get-ParsedParams [-File]
Get-ParsedParams [-Directory]
Get-ParsedParams [-ServerInstance]
さらにいくつかの例
c:\temp\db.sql
内のすべてのオブジェクトを解析します :
Get-ParsedParams -File "C:\temp\db.sql" -GridView
c:\temp\scripts\
内のすべての.sqlファイルを解析するには (再帰的)およびh:\sql\
(再帰的でもあります):
Get-ParsedParams -Directory "C:\temp\scripts\", "H:\sql\" -GridView
msdb
内のすべてのオブジェクトを解析します ローカルの名前付きインスタンスSQL2019
Windows認証の使用:
Get-ParsedParams -ServerInstance ".\SQL2019" -Database "msdb" -GridView
msdb
内のすべてのオブジェクトを解析します 、floob
、およびAdventureWorks2019
ローカルの名前付きインスタンスSQL2019
SQL認証のクレデンシャルの入力を求められます:
Get-ParsedParams -ServerInstance ".\SQL2019" -Database "msdb","floob","AdventureWorks" -AuthenticationMode "SQL" -GridView
msdb
内のすべてのオブジェクトを解析します ローカルの名前付きインスタンスSQL2019
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
c:\temp\scripts\
内のすべての.sqlファイルを解析するには (再帰的)、結果をローカルの名前付きインスタンスSQL2019
のテーブルに配置します データベースでは、Utility
、すでにdbo.ParameterSetTVP
を作成している場合 、dbo.LogParameters
、など、Windows認証を使用:
Get-ParsedParams -Directory "C:\temp\scripts" -LogToDatabase -LogToDBServerInstance ".\SQL2019" -LogToDBDatabase "Utility"
msdb
内のすべてのオブジェクトを解析します ローカルの名前付きインスタンスSQL2019
Utility
に書き込みます 同じインスタンス上のデータベース、同じ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
それは厄介になり始めますが、うまくいけば、これを自動化し、毎回手で入力するのではありません。
次回
いつものように、行うことができるより多くの改善があります。思いついたパラメータ名は気に入らないのですが、エラー処理や拡張性など、もっと重要な改善点があると思います。助言がありますか?私に知らせてください、またはもっと良いことに、貢献してください!
[パート1|パート2|パート3]