PowerShell i SQL Server współpracują przez moduł SqlServer, udostępniający polecenia do zapytań i zarządzania.
Moduł SqlServer jako warstwa komunikacji z silnikiem
PowerShell może współpracować z Microsoft SQL Server za pośrednictwem modułu SqlServer. Moduł zawiera polecenia cmdlet przeznaczone między innymi do wykonywania zapytań T-SQL, uruchamiania skryptów, odczytywania obiektów serwera oraz zarządzania wybranymi elementami środowiska SQL Server. Nie jest to osobny silnik bazodanowy. PowerShell pełni rolę powłoki i języka automatyzacji, natomiast SQL Server nadal wykonuje zapytania, egzekwuje uprawnienia i zarządza danymi.
Jednym z podstawowych poleceń jest Invoke-Sqlcmd. Pozwala ono przekazać do wskazanej instancji SQL Server pojedyncze zapytanie albo zawartość pliku z poleceniami T-SQL. Wynik jest zwracany do PowerShell jako obiekty, dzięki czemu może być dalej filtrowany, zapisywany do pliku CSV lub wykorzystany w warunkach skryptu. W praktyce oznacza to możliwość połączenia operacji administracyjnych systemu Windows z kontrolowanymi odczytami i działaniami wykonywanymi przez SQL Server.
Połączenie, uwierzytelnianie i wybór instancji
Przy wykonywaniu polecenia trzeba określić, z którym serwerem SQL Server ma zostać nawiązane połączenie. Służy do tego parametr ServerInstance, przyjmujący nazwę komputera, nazwę instancji nazwanej albo odpowiedni zapis instancji wraz z portem. Parametr Database wskazuje bazę, w której ma zostać wykonane zapytanie. Pominięcie tej wartości może mieć znaczenie, ponieważ zapytanie zostanie uruchomione w bazie domyślnej przypisanej do użytego połączenia.
Moduł SqlServer obsługuje uwierzytelnianie systemu Windows oraz uwierzytelnianie SQL Server, zależnie od konfiguracji instancji i użytych parametrów. Przy połączeniu z użyciem konta SQL Server można przekazać poświadczenia jako obiekt PSCredential, zamiast umieszczać hasło bezpośrednio w tekście skryptu. Sam fakt poprawnego uwierzytelnienia nie gwarantuje wykonania zapytania: konto musi jeszcze posiadać odpowiednie uprawnienia do bazy, schematu, tabeli lub konkretnej operacji.
Wyniki zapytań i automatyzacja czynności
Invoke-Sqlcmd może zwracać wiersze wynikowe jako obiekty PowerShell. Pozwala to używać typowych operatorów, takich jak Where-Object do filtrowania, Select-Object do wyboru kolumn oraz Export-Csv do zapisania danych w pliku. Taki przepływ jest przydatny podczas powtarzalnych kontroli, na przykład sprawdzania obecności określonych rekordów, porównywania wyników kilku zapytań albo generowania raportu technicznego.
Skrypt powinien rozdzielać polecenia PowerShell od poleceń T-SQL. Instrukcje przekazywane do SQL Server muszą być poprawne dla tego silnika i jego konfiguracji, a składnia PowerShell odpowiada za przygotowanie parametrów, obsługę wyniku i reakcję na błąd. Warto jawnie włączać obsługę błędów oraz sprawdzać kod wykonania, ponieważ komunikat o nawiązaniu połączenia nie oznacza jeszcze, że cała operacja zakończyła się poprawnie. Przy zapytaniach modyfikujących dane należy dodatkowo kontrolować zakres operacji, warunki WHERE i ewentualną transakcję po stronie SQL Server.
Rozpoznawanie problemów na styku PowerShell i SQL Server
Problemy z działaniem integracji mogą wynikać z kilku różnych warstw. Pierwszą jest dostępność instancji SQL Server oraz poprawność nazwy serwera i instancji. Kolejna dotyczy protokołu połączenia, portu, zapory sieciowej i konfiguracji samego SQL Server. Jeżeli połączenie zostaje odrzucone przed wykonaniem zapytania, trzeba odróżnić błąd sieciowy od błędu uwierzytelniania. Dopiero po potwierdzeniu połączenia ma sens analizowanie składni T-SQL, nazwy bazy i uprawnień.
Podczas diagnostyki należy sprawdzić, czy moduł jest zainstalowany i załadowany w używanej sesji PowerShell, a także czy polecenie korzysta z właściwej wersji modułu. Pomocne są polecenia Get-Module -ListAvailable -Name SqlServer oraz Get-Command Invoke-Sqlcmd. Następnie można wykonać kontrolne zapytanie do konkretnej instancji i osobno zweryfikować dostęp do wskazanej bazy. Takie rozdzielenie etapów ułatwia ustalenie, czy przyczyną jest brak modułu, błędny adres, nieprawidłowe poświadczenia, brak uprawnień, niedostępność bazy czy błąd w samym zapytaniu.