sql >> データベース >  >> RDS >> Database

PowerShellを使用してパラメーターのデフォルト値を解析する–パート3

    [パート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] [[-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}] []

    さらにいくつかの例

    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]


    1. QUOTENAME関数を使用した動的ピボットテーブルの作成

    2. データベース内で配列を使用するのは悪い設計ですか?

    3. sql地理からdbgeographyへ?

    4. SQLServerで月の最初の日を取得する3つの方法