別のリモート サーバーから DB サーバー上のデータベースにアクセスできない

別のリモート サーバーから DB サーバー上のデータベースにアクセスできない

SQL クエリを実行するスクリプトを実行しようとしています。DB サーバー自体で実行すると正常に動作しますが、同じスクリプトをリモート サーバーで実行しようとすると失敗します。次に、PowerShell ファイルを DB サーバーに保存し、リモート サーバーでその PowerShell ファイルを実行しようとしましたが、ファイルが存在しないというメッセージが表示されます。

 Invoke-Command -ComputerName "advtch-db1" -ScriptBlock {
 Push-Location C:\Scripts\SQL 
 ls -r
 } 

このコードの出力には、私が作成した新しい PowerShell ファイル以外のすべてが表示されます。

Invoke-Command -ComputerName advtch-db1 -ScriptBlock {
Invoke-Sqlcmd -ServerInstance "advtch-db1" -Query "
SELECT TOP (1000) [SettingID]
      ,[Name]
      ,[Value]
      ,[LastUpdated]
  FROM [advtch_TEST].[dbo].[Settings]
"
} 

DB サーバーの -ScriptBlock 内にあるコマンドを実行すると、正常に実行されます。しかし、リモート サーバーで実行しようとすると、次のエラーが発生します。

 Database 'advtch_TEST' cannot be opened because it is offline.
    + CategoryInfo          : InvalidOperation: (:) [Invoke-Sqlcmd], SqlPowerShellSqlExecutionException
    + FullyQualifiedErrorId : SqlError,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand
    + PSComputerName        : advtch-db1 

答え1

対話型セッションを使用してトラブルシューティングを試してください。

PS C:\> Enter-PSSession Enter-PSSession -ComputerName "advtch-db1"
[advtch-db1]: PS C:\WINDOWS\system32> Invoke-Sqlcmd -ServerInstance "advtch-db1" -Query "My query"

SQL モジュールがロードされていないか、この方法でより明確にできる他の問題がある可能性があります。参考までに、同じ目的で私が使用するコマンドを以下に示します。

$result = Invoke-Command -ComputerName 'MySQLServer.domain.com' {
    Invoke-Sqlcmd -ServerInstance '.\SQLEXPRESS'  -Database MyDB -Query "SELECT strDisplayName,field1,field2,field3 
FROM t_table
WHERE field1 IN (6,7,43,83,94,95,96)
ORDER BY strDisplayName"
} | select strDisplayName,field1,field2,field3 

以下の方法で接続してみるのもよいでしょうsqlcmd.exeローカルマシンから実行できますが、オブジェクトではなく文字列のみが返されます。レポートなどには十分です。

sqlcmd.exe -S myServer\instanceName

関連情報