2015-06-30
Jeśli miałeś kiedyś do wykonania migrację bazy danych, to wiesz ile przy prostym zadaniu może cię czekać problemów. Wystarczy, że wersja silnika bazy danych w miejscu docelowym jest niższa niż w źródłowym i wszelkie próby skopiowania całej bazy danych są z góry skazane na niepowodzenie. A co jeśli klient zechce zeskryptować tylko niektóre elementy bazy danych? Okazuje się, że powershell i SQL mogą pomóc w tym zadaniu.
Zaczynamy od utworzenia obiektu wskazującego na wybraną instancję SQL. Robimy to tak samo jak w poprzednich przykładach:
$SqlServer = New-Object Microsoft.SqlServer.Management.Smo.Server localhost
Jedna instrukcja, a już mamy obiekt serwera SQL. Na tym serwerze można się odwołać do baz danych:
$db = $SqlServer.Databases["AdventureWorks2014"]
Za chwilę przyda nam się obiekt bazy danych, który jak widać powyżej odpowiada za bazę AdventureWorks2014. Tymczasem wróćmy do naszego zadania. Mamy stworzyć skrypt tworzący obiekty bazy danych. Do dyspozycji dostajesz klasę Microsoft.SqlServer.Management.Smo.Server. Dokładny opis tej klasy znajdziesz na stronach MSDN. Tak, te strony są dedykowane programistom, ale powershell korzystający z .NET to już nie byle co, tylko prawdziwe programowanie. Jak zwykle, aby otrzymać obiekt tego typu, musisz wywołać konstruktor przekazując do niego nazwę instancji – tutaj localhost:
$scriptor = New-Object Microsoft.SqlServer.Management.Smo.Scripter $SqlServer
Czytaj dalej »
2015-06-29
W tym artykule spróbuję pokazać sposób na przejście przez każdą bazę danych i wykonanie pewnej czynności na każdej bazie danych, jednak postaram się powstrzymywać od stosowania czystego SQL. Zadanie polegające na wykonaniu szeregu czynności dla każdej bazy są dość częste w pracy administratora. Może np. ze względu na audyt trzeba zaraportować użytkowników z każdej bazy, a może chcesz sprawdzić czy każda baza ma swój backup, a może na serwerze szukasz bazy, w której występuje określona tabela czy procedura. W każdym z tych przypadków może się przydać poniższy kawałek kodu.
Skorzystamy z SMO, na początku należy więc załadować SMO:
[Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO")
Niektórzy wynik powyższego polecenia przesyłają potokiem do Out-Null, dzięki czemu ekran nie będzie zaśmiecony komunikatem o załadowanej bibliotece. Warto z tego skorzystać zwłaszcza, jeżeli tworzony kod ma być wykorzystywany jako funkcja. Z punktu widzenia użytkownika funkcji te komunikaty to „niezrozumiały bełkot”.
Kolejny krok, który będzie się powtarzał również w następnych artykułach, więc warto go zapamiętać, to utworzenie obiektu odpowiadającego za instancję, na której chcesz pracować. U nas będzie to domyślna instancja na lokalnym komputerze. Tworzenie obiektu dokładniej pokazałem w części nr 1:
$SqlServer = New-Object -TypeName Microsoft.SqlServer.Management.SMO.Server -ArgumentList "localhost"
alternatywnie było można to zapisać tak:
$SqlServer = New-Object Microsoft.SqlServer.Management.SMO.Server "localhost"
lub tak: Czytaj dalej »
2015-06-29
Problem:
Microsoft wypuszcza aktualizacje w drugi wtorek miesiąca. Aktualizacje są instalowane na serwerach w pierwszym, drugim, trzecim i kolejnych tygodniach po publikacji. Jak przeliczyć datę instalacji na numer tygodnia?
Oto propozycja, która przynajmniej częściowo rozwiązuje ten problem:
DECLARE @SecondTuesday AS DATETIME = '2015-06-10'
DECLARE @InstallDate AS DATETIME = '2015-06-19'
SELECT
CASE
WHEN @InstallDate BETWEEN @SecondTuesday AND DATEADD(d,7,@SecondTuesday) THEN 1
WHEN @InstallDate BETWEEN DATEADD(d,7,@SecondTuesday) AND DATEADD(d,14,@SecondTuesday) THEN 2
WHEN @InstallDate BETWEEN DATEADD(d,14,@SecondTuesday) AND DATEADD(d,21,@SecondTuesday) THEN 3
WHEN @InstallDate BETWEEN DATEADD(d,21,@SecondTuesday) AND DATEADD(d,29,@SecondTuesday) THEN 4
ELSE 5
END AS WeekNumber
2015-06-28
Jedną z największych zalet Powershell jest to, że można w nim wykorzystywać wszelkie klasy/metody z .Net Framework. To fantastyczne patrząc na to z punktu widzenia pracy z SQL, bo właściwie w .NET istnieje zbiór metod pozwalający na pracę z SQL. Przyjrzyjmy się na przykład wywołaniu procedury składowanej sp_helpdb wykonywanej z poziomu powershell.
Zacznijmy od tego, że wcale nie trzeba ładować żadnych dodatkowych bibliotek (porównaj z artykułem „Co to jest SMO„). Tworząc obiekt, wywołujesz po prostu konstruktor danej klasy. Tutaj tworzymy obiekt klasy SqlConnection i wypełniamy jego właściwość ConnectionString, co określa gdzie będziemy się łączyć.
$SqlConnection = New-Object -TypeName System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server=localhost;Database=AdventureWorks2014;Integrated Security=True"
Teraz pora na określenie, jakie polecenie ma być uruchomione. Tworzymy obiekt SqlCommand i określamy właściwości CommandText (nazwa procedury do uruchomienia), Connection (wskazujące na wcześniej utworzony obiekt SqlConnection) i CommandTimeout.
$SqlCommand = New-Object -TypeName System.Data.SqlClient.SqlCommand
$SqlCommand.CommandText = "sp_helpdb"
$SqlCommand.Connection = $SqlConnection
$SqlCommand.CommandTimeout = 0
Czytaj dalej »
2015-06-28
Od tego miesiąca (czerwiec 2015) egzaminy Microsoft można zdawać z domu. Wcześniej taka możliwość już istniała, ale tylko w innych krajach, a od czerwca również w Polsce. Egzaminy mają pewne specyficzne wymagania, ale nie ma się czemu dziwić:

- Pokój musi być zamknięty, nikt nie może do niego wchodzić w czasie egzaminu
- Nie możesz mieć plakatów, książek i innych materiałów, które mogły by być ściągą (przed egzaminem jesteś proszony o sfilmowanie pomieszczenia)
- Dowód tożsamości skanujesz przed egzaminem
- Nie można niczego jeść, pić ani przerywać egzaminu
- Przed egzaminem… wywracasz kieszenie na lewo i podwijasz długie rękawy 🙂
No cóż – zawsze można nadal korzystać z ośrodków egzaminacyjnych. Szczegóły pod adresem: https://www.microsoft.com/learning/pl-pl/online-proctored-exams.aspx
2015-05-28
SQL Server Management Objects (SMO) – pozwalają na tworzenie własnych aplikacji, które będą zarządzać serwerem SQL. Tutaj skupiamy się na tworzeniu skryptów powershell, które będą sięgać do SQL Server, aby konfigurować lub odczytywać konfigurację serwera SQL, ale możliwe jest również wykorzystywanie tych samych metod w C# lub Visual Basic.
Klasy obecne w modelu SMO dzielimy na:
- Instance classes – klasy mocno związane z konkretną instancją SQL, a dalej idąc z bazami danych, a dalej z tabelami, indeksami triggerami itd. Pozwalają na tworzenie obiektów odpowiadających obiektom występującym w SQL.
- Utility classes – klasy nie związane bezpośrednio z żadnym obiektem na serwerze SQL, ale pozwalające na wykonanie pewnych specyficznych czynności jak np. transfer danych, skryptowanie obiektów, czy backup i restore.
SMO instaluje się na systemie, gdy podczas instalacji wybierzesz Client Tools SDK. Jeśli chcesz zainstalować tylko SMO, bez instalowania SQL Server wybierz Shared Management Objects z SQL Server feature pack. (Szczegóły https://msdn.microsoft.com/en-us/library/ms162169.aspx). Czytaj dalej »
2015-05-27
Problem: Zapytanie zwraca informacje o komputerach i dyskach w kolejnych wierszach. Chcemy, aby nazwy dysków powędrowały do kolumn.
Rozwiązanie:
Załóżmy, że struktura tabeli wygląda następująco:
CREATE TABLE #disks
(machineid int,
letter CHAR(2),
size int,
label char(16),
comment char(20))
INSERT #disks VALUES(1,'c:',100,'system','backup'), (1,'d:',200,'data','backup')
Żeby litery dysków pojawiły się w kolumnach użyj tabeli przestawnej:
SELECT machineid, [c:],[d:] FROM
(SELECT machineid, letter,label FROM #disks) x
PIVOT
(MIN(label) FOR letter in ([c:],[d:])) p
Czytaj dalej »