クロスプラットフォームに対応した PowerShell である、PowerShell Core 6.0 に一部対応した SQL Server 用のモジュール (SqlServer) の提供が開始されました。
SQL Server 向けの PowerShell については、SSMS 17.0 以降は、PowerShell ギャラリーからインストールを行う方法に代わっています。
SQL Server PowerShell モジュールのインストール
最新版の SQL Server PowerShell モジュールである version 21.0.17240 から、PowerShell 6 Support が含まれるようになりました。
最新バージョンのアップデートが以下になります。
Updates:
* Added Get-SqlBackupHistory cmdlet
* Ported PS Provider to .NET Core for PowerShell 6 support
* Ported a subset of cmdlets to .NET Core for PowerShell 6 support
* Powershell 6 support on macOS and Linux in Preview.
* To use SqlServer provider on macOS and Linux mount it using a new PSDrive.
Examples in documentation.
* Removed restriction of 64-bit OS for this module. Note: Invoke-Sqlcmd
cmdlet is the only cmdlet not supported on 32-bit OS.
この対応により、macOS / Linux で PowerShell を実行する際に、SQL Server 用のモジュールが使用できるようになります。
SQL Server モジュールで使用可能なコマンドレットについては SqlServer で公開されているのですが、この、すべてのコマンドレットが、使用可能になっているかというと、現状はそこまでは達しておらず、サブセットとして、一部のコマンドレットが利用可能となっています。
21.0.17240 で使用可能なコマンドレットは次の 60 個程度となっています。
Decode-SqlName | New-SqlBackupEncryptionOption |
Encode-SqlName | New-SqlCertificateStoreColumnMasterKeySettings |
SQLSERVER: | New-SqlCngColumnMasterKeySettings |
Add-SqlAvailabilityDatabase | New-SqlColumnMasterKey |
Add-SqlAvailabilityGroupListenerStaticIp | New-SqlColumnMasterKeySettings |
Add-SqlColumnEncryptionKeyValue | New-SqlCredential |
Add-SqlLogin | New-SqlCspColumnMasterKeySettings |
Backup-SqlDatabase | New-SqlHADREndpoint |
ConvertFrom-EncodedSqlName | Read-SqlTableData |
ConvertTo-EncodedSqlName | Read-SqlViewData |
Convert-UrnToPath | Remove-SqlAvailabilityDatabase |
Get-SqlAgent | Remove-SqlAvailabilityGroup |
Get-SqlAgentJob | Remove-SqlAvailabilityReplica |
Get-SqlAgentJobHistory | Remove-SqlColumnEncryptionKey |
Get-SqlAgentJobSchedule | Remove-SqlColumnEncryptionKeyValue |
Get-SqlAgentJobStep | Remove-SqlColumnMasterKey |
Get-SqlAgentSchedule | Remove-SqlCredential |
Get-SqlBackupHistory | Remove-SqlLogin |
Get-SqlColumnEncryptionKey | Resume-SqlAvailabilityDatabase |
Get-SqlColumnMasterKey | Revoke-SqlAvailabilityGroupCreateAnyDatabase |
Get-SqlCredential | Set-SqlAvailabilityGroup |
Get-SqlDatabase | Set-SqlAvailabilityGroupListener |
Get-SqlErrorLog | Set-SqlAvailabilityReplica |
Get-SqlLogin | Set-SqlAvailabilityReplicaRoleToSecondary |
Get-SqlSmartAdmin | Set-SqlCredential |
Grant-SqlAvailabilityGroupCreateAnyDatabase | Set-SqlErrorLog |
Join-SqlAvailabilityGroup | Set-SqlHADREndpoint |
New-SqlAvailabilityGroup | Set-SqlSmartAdmin |
New-SqlAvailabilityGroupListener | Suspend-SqlAvailabilityDatabase |
New-SqlAvailabilityReplica | Switch-SqlAvailabilityGroup |
New-SqlAzureKeyVaultColumnMasterKeySettings | Write-SqlTableData |
利用可能なコマンドレットには、「Invoke-SqlCmd」が含まれていないのが残念ですね。
Fedoraでも再現するんですけど、SqlServer.psm1 で定義されている読み込むDLLが一部存在していないっぽいですよね。Test-Pathしているので、全部は存在しない前提かもしれないんですが、必要なDLLが入っていない可能性もあり @kazuakix
— たなか?? (@tanaka_733) April 11, 2018
で教えていただき、調べてみたのですが、Windows の場合は「C:\Program Files\PowerShell\Modules」、Linux の場合は「/usr/local/share/powershell/Modules」あたりに、SQL Server モジュールがインストールされており、その中の「SqlServer.psm1」に、次のような記載があります。
if (($PSVersionTable.Keys -contains "PSEdition") -and ($PSVersionTable.PSEdition -ne 'Desktop')) { # .Net Core DLLs are under the 'coreclr' folder $binaryModuleRoot = Join-Path -Path $PSModuleRoot -ChildPath 'coreclr' }
PowerShell Core の場合、「C:\Program Files\PowerShell\Modules\SqlServer\21.0.17240\coreclr」のモジュールがロードされることになりますが、現状は次の DLL のみが含まれている形になります。
サブセットなので、Full 版と比較して DLL の数が少ないですね。
Invoke-SqlCmd については「Microsoft.SqlServer.Management.PSSnapins.dll」の「GetScriptCommand」の実装に含まれているかと思いますが、CoreCLR 版の PSSnapins.dll には、GetScriptCommand の実装が含まれていないようで、同名の DLL は含まれていても、使用可能なコマンドレットに差が出ているようです。
Core 版でも PSDrive として、SQL Server を使用することもできるようになっており、使用方法については、コメントで解説されていました。
Linux 版でも動いてちょっと面白いですね。
$cred = Get-Credential
New-PSDrive "SQL" -PSProvider SqlServer -Root "SQLSERVER:\SQL\machine\instance" -Credential $cred -Scope Private
cd SQL:
After this you can use the provider as usual.
PowerShell Core 版の SQL Server モジュールもコマンドレットが追加され、今、Windows で実行していることと同等のことができるようになると、Windows -> Linux になった際の運用スクリプトの共通化が、PowerShell で対応できるようになりますので、Windows エンジニアのスキルが活かせてよいなと。