2016-11-18
Obsługę błędów można realizować w powershell korzystając z intrukcji try/catch/finally. Często do obsługi błędu wystarczy konstrukcja:
try
{
GWMI Win32_bios -ComputerName 'blablacomp'-ea Stop
}
catch
{
echo "general exception"
}
Ale zdarza się, że z jakiegoś powodu w bloku try znajduje się kilka instrukcji, które mogły spowodować błąd i w zależności od tego jaki błąd został napotkany będzie należało wykonać inną czynność w bloku catch.
Oto przykład takiej konstrukcji:
try
{
del c:\temp\blablabla.txt -ea stop
GWMI Win32_bios -ComputerName 'blablacomp'-ea Stop
}
catch [System.Runtime.InteropServices.COMException]
{
echo "com exception"
}
catch [System.Management.Automation.ItemNotFoundException]
{
echo "file not found exception"
}
catch
{
echo "general exception"
}
Tym razem, jeśli dojdzie do błędu, to w zależności od tego jaki to błąd, zostanie uruchomiona inna sekcja catch. Nazwy w nawiasach kwadratowych są nazwami typów różncyh rodzajów wyjątków zgłaszanych przez uruchamiane w bloku try polecenia. Jeśli doszło by do niewymienionego tutaj błedu to wykonany zostanie standardowy blok catch Czytaj dalej »
2016-11-16
Hmm… A required privilege is not held by the client… Jak ci czegoś brakuje, to powiedz co to jest! Niestety Integration Services Deployment Wizard nie chciał powiedieć co go boli…
Skoro brakuje jakiegoś prawa (Local Settings >> Local Policies >> User Rights Assigment) to naprawa SQL powinna pomóc. Ponieważ serwer był testowy, to naprawa była możliwa. Po naprawie serwera (Panel sterowania >> Programy i funkcje >> SQL Server > Repair), ale bez restartu deployment się udał. Super! Ale co jest przyczyną?
Sprawdziłem ponownie jakie prawa miało przypisane konto SQL Server po naprawie. Potem uruchomilem ponownie SQL serwer i IS Deployment Wizard przestał działać. Sprawdziłem więc znowu jakie prawa miało konto SQL server i… kilka ubyło! Podejrzani to:
„Replace a process level token”,”NT SERVICE\MSSQLSERVER”,”SeAssignPrimaryTokenPrivilege”
„Adjust memory quotas for a process”,”NT SERVICE\MSSQLSERVER”,”SeIncreaseQuotaPrivilege”
„Bypass traverse checking”,”NT SERVICE\MSSQLSERVER”,”SeChangeNotifyPrivilege”
W tym przypadku prawa są definiowane na pozioie zasad grupy, więc w kolejnym kroku była potrzebna pomoc chłopaków z AD.
Rzeczywiście te prawa są wymienione na liście wymaganych przez SQL (https://msdn.microsoft.com/en-us/library/ms143504(v=sql.110).aspx#Windows), więc nie powinno być problemu z ich uzyskaniem. Czytaj dalej »
2016-11-14
Co 500+ może mieć wspólnego z IT? Ano moe mieć…
Podobno faceci znają kolory biały, czarny, ładny i … brzydki. A ile jest kolorów podstawowych zdaniem kobiet? Chyba właśnie tytułowe 500+. Na dodatek te 500+ kolorów ma swoje nazwy!
Zajrzyj tutaj: http://cloford.com/resources/colours/500col.htm
A wszystko to odkryłem przy okazji zabawy z ISE i ustawiania kolorków tła. Np poniższa komenda zmienia kolor panelu skryptu np na palegoldenrod, który wygląda o tak:

A czy Ty lubisz kolor palegoldenrod?
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 »