背景
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)
}
}
}
質問
Microsoft.SqlServer.Management.Smo は常にデータベースを開こうとしますか?もしそうなら、それをしないようにするためにいくつかのフラグまたは私がそれを渡すことができる何かがありますか?
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