[ Część 1 | Część 2 | Część 3 ]
W części 1 i 2 tej serii przedstawiłem ParamParser:moduł PowerShell, który pomaga analizować informacje o parametrach – w tym wartości domyślne – z procedur składowanych i funkcji zdefiniowanych przez użytkownika, ponieważ SQL Server nie zrobi tego za nas.
W pierwszych kilku iteracjach kodu po prostu miałem plik .ps1, który umożliwiał wklejenie jednego lub więcej ciał modułu do zakodowanej na stałe $procedure
zmienny. Wiele brakowało we wczesnych wersjach, ale do tej pory zajęliśmy się kilkoma rzeczami:
- To teraz odpowiedni moduł – możesz uruchomić
Import-Module .\ParamParser.psm1
a następnie wywołajGet-ParsedParams
funkcjonować przez całą sesję (oprócz innych korzyści, jakie daje moduł). To nie była trywialna konwersja – znowu chwała dla Willa White'a. - Obsługa funkcji zdefiniowanych przez użytkownika – wyjaśniłem w części 2, że nazwy funkcji są trudniejsze do przeanalizowania niż nazwy procedur; kod teraz obsługuje to poprawnie.
- Automatyzacja ScriptDom.dll – nie możemy rozpowszechniać tego pliku klucza, a ponieważ możesz napotkać problemy, jeśli go nie masz (lub masz nieaktualną wersję), utworzył
init.ps1
, który automatycznie pobiera i rozpakowuje najnowszą wersję (obecnie 150.4573.2) i umieszcza ją w tym samym folderze co inne pliki. - Dodatkowe źródła – nadal możesz przekazać surowy blok skryptu, jeśli chcesz, ale teraz możesz również używać wielu instancji i baz danych jako źródeł, odwoływać się bezpośrednio do jednego lub więcej plików lub ściągnąć cały
.sql
pliki z jednego lub więcej katalogów. Poniżej pokażę przykładową składnię. - Wyjście wskazuje źródło – ponieważ możesz przetwarzać wiele plików lub baz danych w jednym wywołaniu i możesz mieć wiele obiektów o tej samej nazwie, w tym źródło pomaga ujednoznacznieć. Nie mogę wiele zrobić, jeśli masz dwie instancje
CREATE PROCEDURE dbo.blat ...
w tym samym pliku lub surowym skrypcie, a źródło nie jest nawet wskazane, jeśli używasz-Script
i przekazać w ciągu. - Poprawione wyjście – nadal możesz zrzucić wszystko do konsoli, ale możesz też użyć
Out-GridView
aby wyświetlić wyniki w formacie siatki (tutaj jest nudny przykład z AdventureWorks2019) lub zarejestrować informacje o parametrach w bazie danych do wykorzystania w innym miejscu.
Postępuj zgodnie z instrukcjami w pliku readme, aby pobrać i skonfigurować. Po sklonowaniu repozytorium uruchom .\init.ps1
a następnie Import-Module .\ParamParser.psm1
. Przetestuj to na prostym przykładzie, takim jak:
Get-ParsedParams -Script "CREATE PROCEDURE dbo.a @b int = 5 out AS PRINT 1;" -GridView
Wyjście (kliknij, aby powiększyć):
Istnieje jednak wiele innych kombinacji parametrów. Nagłówek pomocy pokazuje sporą część możliwej składni (i jeszcze raz dziękuję Willowi za wiele niesamowitych porządków tutaj):
Get-ParsedParams -?
Wyniki:
Get-ParsedParams [-Script]Get-ParsedParams [-File]
Get-ParsedParams [-Directory]
Get-ParsedParams [-ServerInstance]
Kilka dodatkowych przykładów
Aby przeanalizować wszystkie obiekty w c:\temp\db.sql
:
Get-ParsedParams -File "C:\temp\db.sql" -GridView
Aby przeanalizować wszystkie pliki .sql w c:\temp\scripts\
(rekurencyjne) i h:\sql\
(również rekurencyjne):
Get-ParsedParams -Directory "C:\temp\scripts\", "H:\sql\" -GridView
Aby przeanalizować wszystkie obiekty w msdb
w lokalnej nazwanej instancji SQL2019
przy użyciu uwierzytelniania Windows:
Get-ParsedParams -ServerInstance ".\SQL2019" -Database "msdb" -GridView
Aby przeanalizować wszystkie obiekty w msdb
, floob
i AdventureWorks2019
w lokalnej nazwanej instancji SQL2019
i otrzymaj monit o poświadczenia uwierzytelnienia SQL:
Get-ParsedParams -ServerInstance ".\SQL2019" -Database "msdb","floob","AdventureWorks" -AuthenticationMode "SQL" -GridView
Aby przeanalizować wszystkie obiekty w msdb
w lokalnej nazwanej instancji SQL2019
i przekaż dane uwierzytelniające SQL Authentication:
$password = ConvertTo-SecureString -AsPlainText -Force -String "Str0ngP@ssw0rd" $credential = New-Object -TypeName "PSCredential" -ArgumentList "SQLAuthUsername", $password Get-ParsedParams -ServerInstance ".\SQL2019" -Database "msdb" -AuthenticationMode "SQL" -SqlCredential $credential -GridView
Aby przeanalizować wszystkie pliki .sql w c:\temp\scripts\
(rekurencyjne) i umieść wyniki w tabeli w lokalnej nazwanej instancji SQL2019
w bazie danych, Utility
, gdzie już utworzyłeś dbo.ParameterSetTVP
, dbo.LogParameters
itp. przy użyciu uwierzytelniania systemu Windows:
Get-ParsedParams -Directory "C:\temp\scripts" -LogToDatabase -LogToDBServerInstance ".\SQL2019" -LogToDBDatabase "Utility"
Aby przeanalizować wszystkie obiekty w msdb
w lokalnej nazwanej instancji SQL2019
i napisz do Utility
baza danych w tej samej instancji, przy użyciu tych samych danych uwierzytelniających SQL:
$password = ConvertTo-SecureString -AsPlainText -Force -String "Str0ngP@ssw0rd" $credential = New-Object -TypeName "PSCredential" -ArgumentList "SQLAuthUsername", $password Get-ParsedParams -ServerInstance ".\SQL2019" -Database "msdb" -AuthenticationMode "SQL" -SqlCredential $credential -LogToDatabase ` -LogToDBServerInstance ".\SQL2019" -LogToDBDatabase "Utility" -LogToDBAuthenticationMode "SQL" -LogToDBSqlCredential $credential
Zaczyna się robić bałagan, ale miejmy nadzieję, że automatyzujesz to, a nie piszesz ręcznie za każdym razem.
Następnym razem
Jak zawsze można wprowadzić więcej ulepszeń. Nie podobają mi się nazwy parametrów, które wymyśliłem, ale myślę, że są ważniejsze ulepszenia, takie jak obsługa błędów i rozszerzalność, które należy wprowadzić. Jakieś sugestie? Daj mi znać lub jeszcze lepiej wesprzyj się!
[ Część 1 | Część 2 | Część 3 ]