PowerShell i SQL 19 – tworzenie tabeli i indeksów

2016-11-06

Jak zwykle do dyspozycji masz dwie metody (nie licząc innych pośredich… ale to normalne w powerhhell że jedną rzecz można zrobić na wiele sposobów.

Metoda sqlps:

Ta metoda jest moim zdaniem bardzo prosta. Wystarczy znać SQL i otworzyć sobie furtkę ze świata Powershell do świata SQL. Zaczynamy od zaimportowania modułu sqlps, następnie odszukujemy bazę, w której ma być utworzona tabela (tutaj tempdb). Potem budujemy napis, który tak na prawdę jest poleceniem SQL, które tworzy tabelę. Potem pozostaje wywołanie polecenia ExecuteNonQuery tzn. wykonaj na serwerze SQL ale wyniki właściwie nie są dla mnie interesujące… no bo rzeczywiście – wynikiem utworzenia tabeli jest albo informacja, że się udało albo komunikat o błędzie. Aby się przekonać, że tabela została rzeczywiście utworzona, ostatnim krokiem jest wyświetlenie listy tabel znajdujących się w bazie. Tu może cię czekać niespodzianka, bo może zabraknąć informacji o utworzeniu tabeli… W takim przypadku wywołaj najpierw metodę refresh na rzecz kolekcji Tables. No i jeszcze jedna drobna uwaga.

Można też było skorzystać z polecenia Invoke-Sqlcmd. W tym przypadku można by opuścić tworzenie zmiennej $db, oraz wywoływanie polecenia ExecuteNonQuery – byłoby więc w sumie jeszcze prościej – o ile tylko znasz SQL… Czytaj dalej »

PowerShell i SQL 18 – ładowanie bibliotek SMO

2016-11-06

To będzie krótki wpis…

Jeśli planujesz wykorzystywać SMO , to swój skrypt zawsze musisz rozpocząć od załadowania odpowiednich bibliotek .NET. Pamiętanie nazw tych bibliotek jest… uciążliwe, więc jeśli już decydujesz się używać SMO to prawdopodobnie swoje skrypty rozpoczniesz od kilku instrukcji LoadAssembly np.:

[Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO")
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO")
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended")
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo")
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoEnum")

Ale można prościej. Pod adresem https://github.com/rbellamy/WindowsPowerShell/blob/master/Scripts/pssql-smo.ps1 znajduje się skrypt, który ładowanie bibliotek wykona za ciebie i na dodatek zrobi to w inteligentny sposób, kontrolując między innymi błędy do których mogło po drodze dojść. W swoim skrypcie wystarczy tylko dodać instrukcję wywołującą ten skrypt (w bieżącej powłoce PowerShell więc z kropką na początku): Czytaj dalej »

Powershell i SQL 17 – to samo na 2 sposoby

2016-11-06

Backup z SMO

[Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO")
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO")
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended")
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo")
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoEnum")
$SqlServer = New-Object Microsoft.SqlServer.Management.Smo.Server 'localhost'
$backup = New-Object Microsoft.SQLServer.Management.Smo.Backup
$backup.Database = "master"
$backup.Devices.AddDevice('c:\temp\master.bak',[Microsoft.SqlServer.Management.Smo.DeviceType]::File)
$backup.Action = [Microsoft.SqlServer.Management.Smo.BackupActionType]::Database
$backup.SqlBackup($SqlServer)

Backup z cmdlet Backup-SqlDatabase

Dalej zakładam, że odpowiedznie biblioteki są już załadowane
Import-Module sqlps
Backup-SqlDatabase -ServerInstance localhost -Database "master" `
-BackupAction Database -BackupFile c:\temp\master.bak

Czytaj dalej »

Powershell i SQL 16 – wykrywanie instancji w sieci

2016-11-05

Teraz pora na funkcję, która nie należy do SMO ale do .NET! Funkcja ta ma najczęściej za zadanie pomóc użytkownikowi odnaleźć SQL  server znajdujący się gdzieś w sieci, kiedy użytkownik nie zna jego nazwy, ale raczej wolałby wybrać serwer z listy dostępnych w danej chwili instancji SQL.

Ta funkcja to:

([System.Data.Sql.SqlDataSourceEnumerator]::Instance).GetDataSources()

EnumerateSQLInstances

Świetnie! Mając taką informację jesteśmy o krok od skryptu, który spróbuje wykryć serwery SQL dostępne w sieci i odpytać je o szczegóły wersji, która jest tam zainstalowana: Czytaj dalej »

Powershell i SQL 15 – trochę teorii o SMO

2016-11-05

SMO (SQL Management Object) to biblioteki .NET pozwalające na pracę z SQL server. Ponieważ PowerShell świetnie integruje się z .NET, to jednym ze sposobów pracy z SQL jest właśnie SMO. Mając do dyspozycji również SQL Provider administratorzy zapewne chętniej wybiorą pracę z modułem SQLPS, jednak dla programistów SMO może być dość ciekawe…

Na stronie https://msdn.microsoft.com/en-us/library/ms162209.aspx znajduje się diagram pozwalający zorientować się, w strukturze obiektów opisujących SQL. Na diagramiemożna zobaczyć elementy w kolorze pomarańczowym (są to kolekcje obiektów) oraz niebieskie (są to opisy klas/obiektów). W poniższym screenshot widać że na serwerze znajduje się kolekcja DatabaseCollection. Obiekty znajdujące się w tej kolekcji to obiekty typu Database. Obiekt Database jest z kolei zbudowany z następnych właściwości, a te czasami są następnymi kolekcjami:

smo-diagram Czytaj dalej »

Powershell i SQL 14 – Tworzenie bazy danych z wykorzystaniem SMO

2016-11-05

Ponieważ SMO jest warstwą wykorzystywaną także przez SQL Server Management Studio, to praktycznie wszystkie rzeczy jakie można zrobić korzystając z SSMS można też wykonać korzystając z SMO.

Poniższy przykład ilustruje jak utworzyć bazę danych zmieniając jej ustawienia domyślne.  Zaczynamy od załadowania SMO i podłączenia się do określonej instancji SQL

 [Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO")
$SqlServer = New-Object Microsoft.SqlServer.Management.Smo.Server localhost

Oto jeden z najważniejszych momentów. Tworzymy obiekt bazy. Właściwie kolejną instrukcją mogłoby być $db.Create(), ale wtedy baza przyjęłą by wszystkie wartości domyślne

 $db = New-Object Microsoft.SqlServer.management.Smo.Database($sqlserver,’MyTest’)
 Teraz tworzymy obiekt ‘FileGroup’. Ten obiekt należy dołączyć do kolekcji FileGroups bazy danych
 $fileGroup =  New-Object Microsoft.SqlServer.Management.Smo.Filegroup($db,’PRIMARY’)
$db.FileGroups.Add($fileGroup)

Czytaj dalej »

Powershell i SQL 13 – Invoke-SqlCmd

2016-11-05

Polecenia dostępne w  module pssql pozwalają na administracji High Avaialbility, Azure, zarzadzanie backupami oraz na wykonywanie ogólnych zadań związanych po prostu z SQL. Na początku właśnie te dwie ostatnie grupy są najbardziej interesujące.

Chyba najbardziej uniwersalnym poleceniem jest Invoke-Sqlcmd. Polecenie pozwala uruchamiać zarówno polecenia przekazywane jako tekst ale również może uruchamiać skrypty znajdujące się w pliku. Polecenia mogą być uruchamiane na dowolnej instancji SQL ponieważ mamy do dyspozycji parametr ServerInstance. W poniższym przykładzie wyświetlone zostaną loginy SQL wraz z informacją czy mają włączoną opcję dotyczące zgodności z polityką haseł oraz opcję wygasania hasła:

IC-01 Czytaj dalej »