2016-11-10

Wprawdzie konferencja PASS Summit 2016 już się zakończyła i trwają już zapisy na PASS Summit 2017, to jednak jeśli chcesz zobaczyć o czym mówiło się na konferencji, masz do dyspozycji PASS TV:
http://www.sqlpass.org/summit/2016/PASStv.aspx
Konferencja trwa 3 dni i jednocześnie odbywa się około 8 sesji. Wszystkie sesje są nagrywane i można je kupić na PASS Summit-owym pendrive. PASS TV prezentuje kilka wybranych sesji całkiem za darmo.
2016-11-06
Oczywiście po to jest baza danych aby przechowywać w niej rekordy. Oto jak można dodawać, wyświetlać, modyfikować i usuwać rekordy:
Dodawanie rekordów
Zaczynamy od zwykłego polecenia SQL – INSERT. Treść tego polecenia umieszczamy w zmiennej tekstowej. Następnie jak zwykle tworzymy obiekt serwera i bazy danych. Obiekt bazy danych posiada metodę ExecuteNonQuery, która takie polecenie INSERT wykona na serwerze zwracając tylko informację, czy polecenie się udało czy nie.
$sql = "INSERT INTO Test2 VALUES ('First'),('Second'),('Third')"
$SqlServer = New-Object Microsoft.SqlServer.Management.SMO.Server 'SQL01'
$db = $SqlServer.Databases["tempdb"]
$db.ExecuteNonQuery($sql)
Wyświetlanie rekordów – SELECT
Aby sprawdzić zawartość tabeli rozpocznij od stworzenia odpowiedniego polecenia SELECT. Mając je (i mając obiekt serwera i bazy, które zostały już utworzone w poprzednim przykładzie), można skorzystać z metody ExecuteWithResults, które przesyła zapytanie na serwer i zwraca wynik. Wynik ten to tzw. DataSet. DataSet składa się z tabel. Ponieważ nasze zapytanie zwraca tylko jedną tabelę, to wynik znajduje się w zerowej tabeli zwróconego wyniku (numeracja w PowerShell zaczyna się od zera) Czytaj dalej »
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 »
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 »
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 »
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()

Ś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 »
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:
Czytaj dalej »