O PowerShell possui um módulo interessante para interagir com o SQL Server . Um dos recursos é a capacidade de navegar em objetos de banco de dados, como objetos do sistema de arquivos. Por exemplo:
get-childitem -Path "SQLSERVER:\SQL\MSI\DEFAULT\DATABASES"
No entanto, em vez de uma lista de objetos, recebo a seguinte mensagem de erro:
get-childitem : Cannot find drive. A drive with the name 'SQLSERVER' does not exist.
At line:1 char:1
+ get-childitem -Path "SQLSERVER:\SQL\"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (SQLSERVER:String) [Get-ChildItem], DriveNotFoundException
+ FullyQualifiedErrorId : DriveNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
Depois de passar algumas horas e adquirir alguns cabelos grisalhos, descobri acidentalmente que é possível fazê-lo funcionar se pelo menos uma vez fizer a seguinte ligação:
invoke-sqlcmd
Então get-childitem
vê o SQLSERVER
disco e me retorna uma lista de tabelas. Beleza :-)
Obviamente, chamar invoke-sqlcmd
muda algo no ambiente que permite get-childitem
interagir com SQLSERVER
. Porém, nem na documentação nem nos exemplos na Internet, não encontrei nada sobre isso, o que me faz pensar que o problema está no meu sistema. O que eu perdi? Eles simplesmente se esqueceram de mencioná-lo na documentação? Ou não é um bug, mas um recurso e invoke-sqlcmd
executa a autorização?
Eu usei a autorização do Windows em testes
SO: Windows 10 Enterprise e Windows Server 2019
Versão do SQL Server: 15.0.2000.5 edição do desenvolvedor
Acho que o que você está vendo é o carregamento automático do módulo que existe no PowerShell 3+. O
SQLSERVER
módulo não é carregado em sua sessão (portanto,PSDrive
não existe) até que você execute uma ou mais funções desse módulo.Você pode carregar explicitamente o módulo
import-module sqlserver
em sua sessão/script antes de usar oSQLServer
inversor e ele estará disponível desse ponto em diante.