Condividi tramite


Esecuzione di SQL Server PowerShell

Con SQL Server vengono installati Windows PowerShell e un set di snap-in di SQL Server che espongono le funzionalità di SQL Server in Windows PowerShell. È quindi possibile codificare gli script di Windows PowerShell che funzionano con gli oggetti di SQL Server. Gli script possono essere eseguiti nell'ambiente di Windows PowerShell, in SQL Server Management Studio e come processi di SQL Server Agent.

Installazione del supporto di SQL Server PowerShell

Il software necessario per l'esecuzione degli script di Windows PowerShell viene installato tramite il programma di installazione di SQL Server. A partire da SQL Server 2008, quando si selezionano i nodi Servizi di database o il software client, il programma di installazione installa i seguenti componenti di Windows PowerShell:

  • Windows PowerShell 1.0, se Windows PowerShell non è già presente nel computer.

  • Snap-in di SQL Server. Gli snap-in sono file DLL che implementano due tipi di supporto di Windows PowerShell per SQL Server:

    • Set di cmdlet di SQL Server. I cmdlet sono comandi che implementano un'azione specifica, ad esempio Invoke-Sqlcmd esegue uno script Transact-SQL o XQuery che può essere eseguito anche tramite l'utilità sqlcmd, mentre Invoke-PolicyEvaluation segnala se gli oggetti SQL Server sono conformi ai criteri di gestione basata su criteri.

    • Provider di SQL Server. Il provider consente di spostarsi nella gerarchia degli oggetti di SQL Server utilizzando un percorso simile a un percorso del file system. Ciascun oggetto è associato a una classe dei modelli SMO (SQL Server Management Objects). È possibile utilizzare i metodi e le proprietà della classe per eseguire azioni sugli oggetti. Utilizzando il comando cd su un oggetto di database in un percorso, è ad esempio possibile utilizzare i metodi e le proprietà della classe Microsoft.SqlServer.Management.SMO.Database per gestire il database.

  • Utilità sqlps, utilizzata per eseguire sessioni di Windows PowerShell che includono gli snap-in di SQL Server.

A partire da SQL Server 2008, SQL Server Management Studio supporta l'avvio delle sessioni di Windows PowerShell dall'albero di Esplora oggetti. Inoltre, a partire da SQL Server 2008, SQL Server Agent supporta i passaggi del processo di Windows PowerShell.

Se Windows PowerShell viene disinstallato al termine del programma di installazione, le caratteristiche di SQL Server per Windows PowerShell non potranno essere utilizzate. Windows PowerShell può essere disinstallato dagli utenti di Windows. La disinstallazione di Windows PowerShell potrebbe inoltre essere necessaria per eseguire alcuni aggiornamenti del sistema operativo Windows. Se Windows PowerShell è stato disinstallato e si desidera utilizzare le caratteristiche di SQL Server, è necessario effettuare una delle seguenti operazioni:

  • Scaricare e reinstallare manualmente Windows PowerShell 1.0 dall'Area download di Microsoft. Le istruzioni per il download sono disponibili sul sito Web di Windows Server 2003.

  • Se è in esecuzione Windows Server 2008, Windows PowerShell 1.0 è presente nel sistema operativo ma risulta disabilitato per impostazione predefinita. È possibile riabilitare Windows PowerShell da Windows Server 2008.

Versioni di SQL Server supportate

È necessario utilizzare i componenti client di SQL Server 2008 per eseguire Windows PowerShell. Windows PowerShell è in grado di eseguire connessioni a istanze di SQL Server 2000 o versioni successive. SP2 è la versione meno recente di SQL Server 2005 che è possibile utilizzare. SP4 è la versione meno recente di SQL Server 2000 che è possibile utilizzare. Quando Windows PowerShell esegue una connessione a SQL Server 2005 e SQL Server 2000, è limitato alle funzionalità disponibili in quelle versioni di SQL Server.

Utilizzo dell'utilità sqlps

sqlps è un'utilità che consente di creare un ambiente di Windows PowerShell, quindi di caricare e registrare gli snap-in di SQL Server. È possibile utilizzare sqlps per:

  • Eseguire in modo interattivo comandi di Windows PowerShell.

  • Eseguire file script di Windows PowerShell.

  • Eseguire cmdlet di SQL Server.

  • Utilizzare i percorsi del provider di SQL Server per spostarsi nella gerarchia degli oggetti di SQL Server.

Per impostazione predefinita, sqlps viene eseguito con i criteri di esecuzione degli script impostati su Restricted che impediscono l'esecuzione degli script di Windows PowerShell. È possibile utilizzare il cmdlet Set-ExecutionPolicy per abilitare l'esecuzione di script firmati o di qualsiasi script. Eseguire solo script da fonti attendibili e proteggere tutti i file di input e output utilizzando le autorizzazioni NTFS appropriate. Per ulteriori informazioni sull'abilitazione degli script di Windows PowerShell, vedere Running Windows PowerShell Scripts (informazioni in lingua inglese).

Per ulteriori informazioni, vedere Utilità sqlps.

Utilizzo di Windows PowerShell in SQL Server Management Studio

È possibile avviare sessioni di Windows PowerShell in SQL Server Management Studio facendo clic con il pulsante destro del mouse sugli oggetti in Esplora oggetti e scegliendo Avvia PowerShell. In SQL Server Management Studio viene quindi avviata una sessione di Windows PowerShell in cui sono stati caricati e registrati gli snap-in di PowerShell per SQL Server. Il percorso della sessione è preimpostato sulla posizione dell'oggetto su cui si è fatto clic con il pulsante destro del mouse in Esplora oggetti. Ad esempio, facendo clic con il pulsante destro del mouse sull'oggetto del database AdventureWorks2008R2 in Esplora oggetti e selezionando Avvia PowerShell, il percorso di PowerShell viene impostato come segue:

SQLSERVER:\SQL\MyComputer\MyInstance\Databases\AdventureWorks2008R2>

Utilizzo di Windows PowerShell nei passaggi del processo di SQL Server Agent

Sono disponibili molti tipi di passaggi del processo di SQL Server Agent. Ogni tipo è associato a un sottosistema che implementa un ambiente specifico, ad esempio un agente di replica o un ambiente del prompt dei comandi. Il sottosistema di SQL Server Agent per Windows PowerShell supporta i passaggi del processo che eseguono gli script di Windows PowerShell. È possibile codificare gli script di Windows PowerShell, quindi utilizzare SQL Server Agent per includere gli script nei processi eseguiti in base a orari pianificati o in risposta a eventi di SQL Server. Il sottosistema di SQL Server Agent per Windows PowerShell consente di caricare e registrare gli snap-in di SQL Server in modo che sia possibile eseguire gli script di Windows PowerShell.

Per ulteriori informazioni, vedere Sottosistemi di SQL Server Agent.

Nota di attenzioneAttenzione

Ciascun passaggio del processo di SQL Server Agent avvia un processo sqlps che utilizza circa 20 MB di memoria. L'esecuzione simultanea di numerosi passaggi del processo di Windows PowerShell può avere un impatto negativo sulle prestazioni.

Aggiunta di snap-in di SQL Server in Windows PowerShell

L'utilità sqlps è una minishell di Windows PowerShell. Alle minishell si applicano alcune restrizioni. Le minishell, ad esempio, sono codificate per il caricamento in uno o più snap-in di Windows PowerShell, ma gli utenti e gli script non possono aggiungere altri snap-in. Se è necessaria una funzionalità non supportata da una minishell, ad esempio l'utilizzo degli snap-in di SQL Server insieme a quelli di altri produttori, è possibile aggiungere gli snap-in di SQL Server direttamente in un ambiente di Windows PowerShell.

Incollare il codice seguente nel Blocco note e salvarlo come file di script con estensione ps1 nel computer, ad esempio in C:\Cartella\InitializeSQLProvider.ps1:

# 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 for Windows PowerShell is not installed."
}
else
{
    $item = Get-ItemProperty $sqlpsreg
    $sqlpsPath = [System.IO.Path]::GetDirectoryName($item.Path)
}


# Set mandatory variables for the SQL Server provider
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

È quindi possibile utilizzare lo script per avviare l'ambiente di Windows PowerShell in cui vengono caricati gli snap-in di SQL Server tramite il comando seguente:

PowerShell -NoExit -Command "C:\MyFolder\InitializeSQLProvider.ps1"

Il comando può essere eseguito da un prompt dei comandi, da un collegamento sul desktop o dalla finestra di dialogo Esegui disponibile tramite il menu Start. Per impostazione predefinita, Windows PowerShell viene eseguito in modalità limitata che non supporta l'esecuzione di script. Per ulteriori informazioni sull'abilitazione degli script di Windows PowerShell, vedere Running Windows PowerShell Scripts (informazioni in lingua inglese).

Caricamento di SQL Server Management Objects in Windows PowerShell

Il provider di SQL Server carica automaticamente gli assembly SQL Server Management Objects (SMO). Nei due casi seguenti potrebbe essere necessario caricare direttamente gli assembly SMO:

  • Se lo script fa riferimento a un oggetto SMO prima del primo comando che fa riferimento al provider o ai cmdlet dagli snap-in di SQL Server.

  • Se si desidera eseguire il porting del codice SMO da un altro linguaggio, ad esempio C# o VB.Net, che non utilizza il provider o i cmdlet.

Il codice seguente consente di caricare gli assembly SMO.

# Loads the SQL Server Management Objects (SMO)

$ErrorActionPreference = "Stop"

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

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


$assemblylist = 
"Microsoft.SqlServer.Management.Common",
"Microsoft.SqlServer.Smo",
"Microsoft.SqlServer.Dmf ",
"Microsoft.SqlServer.Instapi ",
"Microsoft.SqlServer.SqlWmiManagement ",
"Microsoft.SqlServer.ConnectionInfo ",
"Microsoft.SqlServer.SmoExtended ",
"Microsoft.SqlServer.SqlTDiagM ",
"Microsoft.SqlServer.SString ",
"Microsoft.SqlServer.Management.RegisteredServers ",
"Microsoft.SqlServer.Management.Sdk.Sfc ",
"Microsoft.SqlServer.SqlEnum ",
"Microsoft.SqlServer.RegSvrEnum ",
"Microsoft.SqlServer.WmiEnum ",
"Microsoft.SqlServer.ServiceBrokerEnum ",
"Microsoft.SqlServer.ConnectionInfoExtended ",
"Microsoft.SqlServer.Management.Collector ",
"Microsoft.SqlServer.Management.CollectorEnum",
"Microsoft.SqlServer.Management.Dac",
"Microsoft.SqlServer.Management.DacEnum",
"Microsoft.SqlServer.Management.Utility"


foreach ($asm in $assemblylist)
{
    $asm = [Reflection.Assembly]::LoadWithPartialName($asm)
}

Push-Location
cd $sqlpsPath
update-FormatData -prependpath SQLProvider.Format.ps1xml 
Pop-Location