Få databaseegenskaper ved hjelp av PowerShell i SQL Server 2008

Windows PowerShell-funksjonalitet er innebygd i SQL Server 2008. PowerShell kan påberopes fra SQL Server Management Studio, slik at du enkelt kan dra nytte av SQL Server-funksjonaliteten.

PowerShell er flott å bruke på SQL Server-forekomster, men den virkelige kraften utnyttes når du bruker den til å administrere alle servere i nettverket. For denne opplæringen skal jeg skrive et PowerShell-skript som går gjennom en liste over SQL Server-forekomster som jeg henter fra en tekstfil; for hver database på den forekomsten, vil jeg kjøre et SQL Script for å sende ut egenskapene for den gitte databasen. Jeg skal også se på hvordan man påkaller SQL Server Management Objects i eksempelet og demonstrerer hvor enkelt Invoke-SQL cmdlet er å bruke i PowerShell.

Merk: Hvis du er på en datamaskin som ikke har PowerShell installert, kan du laste ned PowerShell-miljøet.

Serverlisten

PowerShell gjør det enkelt å lese data fra en tekstfil og sløyfe gjennom innholdet. For serverlisten vår oppretter vi en ny tekstfil i Notisblokk (eller ønsket tekstredigeringsprogram) og skriver SQL Server-forekomster i listen. For mitt eksempel vil jeg ta med to databaseforekomster: Wilma og Wilma \ R2Eval ( figur A ). Figur A

Lagre denne tekstfilen på C: \ -stasjonen. Vi ringer det om noen minutter.

SQL-filen

Nå skal jeg skrive et SQL-skript som vil kalle funksjonen DATABASEPROPERTY og flere av dens egenskaper; dette skriptet vil bli kalt av PowerShell-skriptet. Innholdet i denne filen er nedenfor:

DEKLARE @db SYSNAME

SET @db = DB_NAME ()

VELG @db AS DatabaseName, 'IsAnsiNullDefault' AS DBProperty, DATABASEPROPERTY (@db, 'IsAnsiNullDefault') AS Verdi

UNION ALL

VELG @db AS databasenavn, 'IsAnsiNullsEnabled', DATABASEPROPERTY (@db, 'IsAnsiNullsEnabled')

UNION ALL

VELG @db AS databasenavn, 'IsAnsiWarningsEnabled', DATABASEPROPERTY (@db, 'IsAnsiWarningsEnabled')

UNION ALL

VELG @db AS databasenavn, 'IsAutoClose', DATABASEPROPERTY (@db, 'IsAutoClose')

UNION ALL

VELG @db AS databasens navn, 'IsAutoCreateStatistics', DATABASEPROPERTY (@db, 'IsAutoCreateStatistics')

UNION ALL

VELG @db AS databasenavn, 'IsAutoShrink', DATABASEPROPERTY (@db, 'IsAutoShrink')

UNION ALL

VELG @db AS databasenavn, 'IsAutoUpdateStatistics', DATABASEPROPERTY (@db, 'IsAutoUpdateStatistics')

UNION ALL

VELG @db AS databasenavn, 'IsBulkCopy', DATABASEPROPERTY (@db, 'IsBulkCopy')

UNION ALL

VELG @db AS databasens navn, 'IsCloseCursorsOnCommitEnabled', DATABASEPROPERTY (@db, 'IsCloseCursorsOnCommitEnabled')

UNION ALL

VELG @db AS databasenavn, 'IsDboOnly', DATABASEPROPERTY (@db, 'IsDboOnly')

UNION ALL

VELG @db AS databasenavn, 'IsDetached', DATABASEPROPERTY (@db, 'IsDetached')

UNION ALL

VELG @db AS databasenavn, 'IsEmergencyMode', DATABASEPROPERTY (@db, 'IsEmergencyMode')

UNION ALL

VELG @db AS databasenavn, 'IsFulltextEnabled', DATABASEPROPERTY (@db, 'IsFulltextEnabled')

UNION ALL

VELG @db AS databasenavn, 'IsInLoad', DATABASEPROPERTY (@db, 'IsInLoad')

UNION ALL

VELG @db AS databasenavn, 'IsInRecovery', DATABASEPROPERTY (@db, 'IsInRecovery')

UNION ALL

VELG @db AS databasenavn, 'IsInStandBy', DATABASEPROPERTY (@db, 'IsInStandBy')

UNION ALL

VELG @db AS DatabaseName, 'IsLocalCursorsDefault', DATABASEPROPERTY (@db, 'IsLocalCursorsDefault')

UNION ALL

VELG @db AS databasenavn, 'IsNotRecovered', DATABASEPROPERTY (@db, 'IsNotRecovered')

UNION ALL

VELG @db AS databasenavn, 'IsNullConcat', DATABASEPROPERTY (@db, 'IsNullConcat')

UNION ALL

VELG @db AS databasenavn, 'IsOffline', DATABASEPROPERTY (@db, 'IsOffline')

UNION ALL

VELG @db AS DatabaseName, 'IsParameterizationForced', DATABASEPROPERTY (@db, 'IsParameterizationForced')

UNION ALL

VELG @db AS databasenavn, 'IsQuotedIdentifiersEnabled', DATABASEPROPERTY (@db, 'IsQuotedIdentifiersEnabled')

UNION ALL

VELG @db AS databasenavn, 'IsReadOnly', DATABASEPROPERTY (@db, 'IsReadOnly')

UNION ALL

VELG @db AS databasenavn, 'IsRecursiveTriggersEnabled', DATABASEPROPERTY (@db, 'IsRecursiveTriggersEnabled')

UNION ALL

VELG @db AS databasenavn, 'IsShutDown', DATABASEPROPERTY (@db, 'IsShutDown')

UNION ALL

VELG @db AS databasenavn, 'IsSingleUser', DATABASEPROPERTY (@db, 'IsSingleUser')

UNION ALL

VELG @db AS databasenavn, 'IsSuspect', DATABASEPROPERTY (@db, 'IsSuspect')

UNION ALL

VELG @db AS databasenavn, 'IsTruncLog', DATABASEPROPERTY (@db, 'IsTruncLog')

UNION ALL

VELG @db AS databasenavn, 'versjon', DATABASEPROPERTY (@db, 'versjon')

Kopier skriptet over til Notisblokk og lagre skriptet som DatabasePropertiesSQLScript.txt på C: \ -stasjonen.

PowerShell-skript

La oss nå definere PowerShell-skriptet. I dette skriptet må jeg påkalle et SQL Server Management Objects (SMO) -objekt slik at jeg kan gå gjennom databasene i våre SQL Server-forekomster. I den første linjen i skriptet laster jeg inn SMO-enheten slik at jeg kan bruke objektene.

På den andre linjen laster jeg innholdet i InstanceList.txt-filen til et objekt som heter $ -servere. Når jeg har lastet objektet på serverlisten, kan jeg gå gjennom disse serverne ved å bruke en foreach-loop.

I neste linje oppretter jeg et nytt SMO-serverobjekt og tilordner det til $ sqlserver-objektet. Legg merke til at jeg overfører navnet på serveren til denne funksjonskallet; Jeg gjør dette slik at jeg kan fortelle SMO hvilket forekomstnavn jeg vil at objektet mitt på $ sqlserver skal representere. Når SMO-serverobjektet er definert, eksponerer det et Databases-objekt, som er en oppregning av databasene som er til stede i SQL Server-forekomsten. Jeg kan dra nytte av databasene-egenskapen til å gå gjennom hver av disse databasene på forekomsten.

Når jeg går gjennom hver database, kaller jeg en SQL Server-spesifikk PowerShell-cmdlet som heter invoke-sqlcmd . Denne kommandoen lar deg kjøre en SQL Server-kommando mot en spesifikk SQL Server-forekomst og database; den lar deg også kjøre et SQL-script fra en fil. Det er her SQL-skriptet som inneholder DATABASEPROPERTY-anropene spiller inn. Jeg er nå i stand til å passere server- og databasenavn dynamisk i denne kommandoen og kalle SQL-skriptet for hver database som vi går gjennom.

System.Reflection.Ass Assembly :: LoadWithPriorName ("Microsoft.SqlServer.SMO") | Out-Null

$ servere = get-content c: \ InstanceList.txt

foreach ($ server i $ servere)

{

$ sqlserver = new-object "Microsoft.SqlServer.Management.Smo.Server" $ server

foreach ($ db i $ sqlserver.Databases)

{

påkalle-sqlcmd -inputfile c: \ DatabasePropertiesSQLScript.txt -database $ db.name -ServerInstance $ sqlserver.name-IgnoreProviderContext

}

}

Kopier skriptet over og lim inn i en tekstredigerer. Lagre denne filen på C: \ -stasjonen under navnet PSLooperScript.ps1.

Nå som alle skriptene våre er definert, må vi kjøre dem. Følg disse trinnene for å kjøre skriptene:

  1. Åpne SQL Server Management Studio 2008.
  2. Høyreklikk på en serverforekomst og velg Start PowerShell. Dette åpner et kommandotypevindu der du kan angi PowerShell-kommandoer. Siden vi har definert PowerShell-skriptene i en fil, er alt vi trenger å gjøre å kalle filen fra grensesnittet.
  3. I PowerShell-ledeteksten skriver du inn plasseringen til PowerShell-skriptet du nettopp lagret, og trykker på Enter.

C: \ PSLooperScript.ps1

Hvis alt fungerer som det skal, vil du se en lang liste over databaser og deres egenskaper i PowerShell-vinduet.

Sammendrag

I denne opplæringen brukte vi PowerShell og SMO til å gå gjennom en liste over SQL Server-forekomster fra en tekstfil. Vi gikk deretter gjennom hver database på SQL Server-forekomsten og kjørte et SQL Server-skript som leverte egenskapene for den gitte databasen.

Dette enkle eksemplet viser hvor kraftig det kan være å bruke PowerShell med SQL Server. Dette skriptet kan enkelt bygges på for å skrive skript for å administrere SQL-serverne dine, samle inn forekomstrelatert informasjon og håndtere sikkerhet eller policyer i dine SQL Server 2008-forekomster.

TechRepublics nyhetsbrev om servere og lagring, levert mandag og onsdag, tilbyr tips som hjelper deg å administrere og optimalisere datasenteret.

© Copyright 2021 | pepebotifarra.com