web-dev-qa-db-ja.com

SMO、Powershell、失敗したログイン

背景

  • 私の現在の組織では、元々 SQLサーバーを再作成するためのすべてのサーバーレベルオブジェクトのスクリプト 。に基づいて、Powershellスクリプトを実行するSQLエージェントジョブがあります。
    • このジョブは、災害復旧を行う必要がある場合に使用できる一連のスクリプトを記述します。
    • 私たちのバージョンは、チェックする必要のあるサーバーをリストする別のデータベースにクエリを送信します。
    • この仕事の前は、Powershellを使用していませんでしたが、他のスクリプト作成の経験(Pythonなど)を持っています。
  • また、ログインに失敗したときにDBAにメールを送信するために、SQL Serverエージェントを使用してすべてのサーバーをセットアップしています。
  • 私たちの開発サーバーの1つには、(私にとって)未知のビジネス目的のためにオフラインにされているいくつかのデータベースがあります。
  • SQLエージェントジョブを実行すると、その1つの開発サーバー上のオフラインデータベースに関して、常に失敗したログインアラートが生成されます。これらの誤ったアラートを防ぐために、オフラインのデータベースのチェックをスクリプトにスキップさせる方法があるかどうかを確認するように求められました。
  • アラートのソースをトレースして、以下の関数に戻りました。このビット、if($database.Status -eq 'Normal')はデータベースがオンラインであることを確認するためのものであると思いますが、機能しません。
  • 他のオンラインリーディングに基づいて、if($database.Status -eq 'Normal')if ($database.IsAccessible)に置き換えてみましたが、スクリプトの実行時にログイン失敗の警告メールがまだ届きました。
#Function to write out Database scripts
function ScriptOutDBObjects($serverObject, $objectType)
{
    foreach ($database in $srv.Databases)
    { 
        if($database.Status -eq 'Normal')
        {
            $objectPath = $scriptPath + $objectType +'\'
            if (!(Test-Path -Path $objectPath))
            {
                New-Item -ItemType Directory -Path $objectPath
            }
            $scriptingOptions.FileName = $objectPath + $database.Name.Replace(':','').Replace('\', '_') +'.sql'
            $database.Script($scriptingOptions)
        }
    }
}
  • ジョブはPowershellタイプを使用していますが、ローカルコンピューターでPowershell ISEからコードを実行してテストすると同じ結果が得られます。

質問

Microsoft.SqlServer.Management.Smo は常にデータベースを開こうとしますか?もしそうなら、それをしないようにするためにいくつかのフラグまたは私がそれを渡すことができる何かがありますか?

2
Manzabar

Powershell/SMOに関するほとんどすべての質問に対する答えは、SMOのオブジェクトモデルの使用を減らし、TSQLの使用を増やすことです。例えば

$dbs = Invoke-Sqlcmd "select name from sys.databases where state_desc = 'ONLINE'" 

foreach ($db in $dbs)
{
  $dbName = $db.Name
  #. . . 
}

dbatools を使用するのが最善の方法です-そのフリーでオープンソースであり、非常によくメンテナンスされ、多くの場所で使用されています-十分にテストされています同じように。

要旨を理解しているなら、あなたがしていることは- simplifying disaster recovery with dbatools

質問があれば、もう一度質問してください。上記は、DRシナリオでサーバーから構成全体または選択したものをスクリプト化するという目標の達成に役立ちます。

例えば

# This will write hashed passwords to disk
Export-DbaLogin -SqlInstance workstation\sql2016 -Path C:\temp\logins.sql | Invoke-Item
3
Kin Shah