web-dev-qa-db-ja.com

PowerShellでデータベースまたはそのオブジェクトを取得できません

サーバーと開発用PCの両方にPowershellをインストールしました。私の開発マシンには、PowerShellの最新バージョンがインストールされているか、SQL Server 'sqlps'のコンポーネントの一部がインストールされているようです。私の現在の問題は、次のように開発マシンで行うようにデータベースを一覧表示できないことです。

_PS SQLSERVER:\> ls SQLSERVER:\\SQL\server\instance\Databases\
_

そして私は以下を得ます:

_Get-ChildItem : No se encuentra la ruta de acceso 'SQLSERVER:\SQL\serverr2\serverr2\Databases' porque no existe.
En línea: 1 Carácter: 4
+ dir <<<<  SQLSERVER:\SQL\server\instance\Databases
    + CategoryInfo          : ObjectNotFound: (SQLSERVER:\SQL\server\instance\Databases:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
_

明らかに、ストアドプロシージャ、ビューなどの子アイテムを取得する方法はありません。

ただし、インストールされているインスタンスを一覧表示することも、データベースを次のように一覧表示することでこの問題を回避することもできます。

_DIR SQLSERVER:\\SQL\serverr2 | SELECT Databases -ExpandProperty Databases | SELECT Name,Owner,Urn
_

ただし、ストアドプロシージャ、ビュー、関数などの別のオブジェクトを取得する必要があります。

これは、Get-Hostコマンドレットによって提供される情報です

_Name             : ConsoleHost
Version          : 2.0
InstanceId       : c1976472-19c0-439e-a4f6-debe59a18616
UI               : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture   : es-MX
CurrentUICulture : es-ES
PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
IsRunspacePushed : False
Runspace         : System.Management.Automation.Runspaces.LocalRunspace
_

sQL Serverの@@ versionはMicrosoft SQL Server 2008 (SP1) - 10.0.2531.0 (X64)です

編集:サーバーの_$PSVersionTable.PSVersion_によると、PowerShell 2.0をインストールしました。また、_Import-Module sqlps_を実行できないこともわかりましたが、何らかの理由により、既に説明したように(現在の問題は明らかに)dirを実行できます。

6
Mr_LinDowsMac

私はserverfaultで答えを見つけました:

https://serverfault.com/questions/355014/sql-server-powershell-cannot-find-path-error

PowerShellでスナップインを適切にロードするには、スクリプトを実行する必要があります。

#
# Add the SQL Server provider.
#

$ErrorActionPreference = "Stop"

$sqlpsreg="HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.SqlServer.Management.PowerShell.sqlps"

if (Get-ChildItem $sqlpsreg -ErrorAction "SilentlyContinue")
{
    throw "SQL Server Provider is not installed."
}
else
{
    $item = Get-ItemProperty $sqlpsreg
    $sqlpsPath = [System.IO.Path]::GetDirectoryName($item.Path)
}


#
# Set mandatory variables for the SQL Server rovider
#
Set-Variable -scope Global -name SqlServerMaximumChildItems -Value 0
Set-Variable -scope Global -name SqlServerConnectionTimeout -Value 30
Set-Variable -scope Global -name SqlServerIncludeSystemObjects -Value $false
Set-Variable -scope Global -name SqlServerMaximumTabCompletion -Value 1000

#
# Load the snapins, type data, format data
#
Push-Location
cd $sqlpsPath
Add-PSSnapin SqlServerCmdletSnapin100
Add-PSSnapin SqlServerProviderSnapin100
Update-TypeData -PrependPath SQLProvider.Types.ps1xml 
update-FormatData -prependpath SQLProvider.Format.ps1xml 
Pop-Location

ロードされると、そのデータベースインスタンス内のすべてのオブジェクトを一覧表示できます

4
Mr_LinDowsMac

あなたの質問のいくつかは私を混乱させるようなものなので、いくつかの明確な質問をします。一部のメッセージでサーバー名とインスタンス名を非表示にしようとしたが、他の場所では非表示にしていないようです。

PowerShellエラーメッセージから、 'serverr2'という名前のサーバーと 'serverr2'のインスタンス名の後に移動していたことがわかります。私の最初の考えは、インスタンス名が間違っていることです。インスタンス名はserverr2ですか?

Get-ChildItem : No se encuentra la ruta de acceso 'SQLSERVER:\SQL\serverr2\serverr2\Databases' porque no existe.
En línea: 1 Carácter: 4
+ dir <<<<  SQLSERVER:\SQL\server\instance\Databases
    + CategoryInfo          : ObjectNotFound: (SQLSERVER:\SQL\server\instance\Databases:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

サーバーにCDを挿入すると、Get-ChildItemを実行して正しいインスタンス名を取得できるはずです。たとえば、私のマシンには、INST1とINST2の2つのインスタンスがあります。

C:\Users\BIGRED-7> import-module sqlps
SQLSERVER:\>
SQLSERVER:\> cd SQL\BIGRED-7-PC
SQLSERVER:\SQL\BIGRED-7-PC> ls

Instance Name
-------------
INST1
INST2

SQLSERVER:\SQL\BIGRED-7-PC>

次のコードブロックは、データベースを含むサーバー上のすべてのインスタンスのすべてのプロパティを列挙するため機能します。これが機能するという事実は、サーバー名が正しいことを教えてくれます。

DIR SQLSERVER:\\SQL\serverr2 | SELECT Databases -ExpandProperty Databases | SELECT Name,Owner,Urn
1
cjsommer