1. Wstęp

Poniżej opisany jest opcjonalny wariant utrzymania katalogów template SQL Server Management Studio 22.5 przy użyciu mechanizmu symlink albo junction w systemie Windows.

Jest to kontynuacja artykułu: Porządkowanie Template Explorer w SQL Server Management Studio 22.5

Rozwiązanie może być zastosowane jako rozszerzenie podstawowej procedury porządkowania Template Explorer.

Wariant z linkami katalogów pozwala przechowywać własne template bezpośrednio w repozytorium Git, a następnie udostępniać je w katalogach używanych przez SSMS.

Dzięki temu katalogi takie jak Maintenance albo _User mogą wskazywać bezpośrednio na katalogi znajdujące się w repozytorium.


2. Założenie rozwiązania

Standardowo SSMS używa dwóch lokalizacji template:

  1. katalogu instalacyjnego SSMS,
  2. katalogu użytkownika w profilu Windows.

Katalog instalacyjny SSMS:

C:\Program Files\Microsoft SQL Server Management Studio 22\Release\Common7\IDE\SqlWorkbenchProjectItems\Sql

Katalog template użytkownika:

C:\Users\UserName\AppData\Roaming\Microsoft\SQL Server Management Studio\22.0\Templates\Sql

W wariancie opcjonalnym można pozostawić podstawową strukturę katalogów, ale wybrane katalogi podpiąć jako linki do repozytorium Git.

Przykład repozytorium:

D:\DBA\Git\SSMS-Templates
├── README.md
├── Maintenance
└── User

Przykładowe mapowanie:

C:\Program Files\Microsoft SQL Server Management Studio 22\Release\Common7\IDE\SqlWorkbenchProjectItems\Sql\Maintenance
    -> D:\DBA\Git\SSMS-Templates\Maintenance

oraz opcjonalnie:

C:\Users\UserName\AppData\Roaming\Microsoft\SQL Server Management Studio\22.0\Templates\Sql\_User
    -> D:\DBA\Git\SSMS-Templates\User


3. Rekomendowany zakres użycia linków

Nie zaleca się zastępowania całego katalogu Sql linkiem do repozytorium.

Nie zaleca się struktury:

Sql -> D:\DBA\Git\SSMS-Templates

Bezpieczniejszym rozwiązaniem jest podpięcie tylko wybranych katalogów własnych.

Rekomendowana struktura:

Sql
├── Default
├── Maintenance  -> junction do repozytorium Git
└── _User        -> junction do repozytorium Git albo zwykły katalog lokalny

Katalog Default powinien pozostać zwykłym katalogiem, ponieważ zawiera domyślne template SSMS dostarczone przez instalator.

Katalogi Maintenance i _User mogą być powiązane z repozytorium, ponieważ zawierają template własne.


W Windows można użyć kilku mechanizmów linkowania katalogów. Dla tego scenariusza praktyczne znaczenie mają głównie dwa warianty:

  1. directory symbolic link,
  2. junction.

Directory symbolic link tworzy się poleceniem:

mklink /D "link" "target"

Przykład:

mklink /D "C:\Program Files\Microsoft SQL Server Management Studio 22\Release\Common7\IDE\SqlWorkbenchProjectItems\Sql\Maintenance" "D:\DBA\Git\SSMS-Templates\Maintenance"

Zalety:

  • jest to klasyczny link symboliczny,
  • jednoznacznie wskazuje na katalog docelowy,
  • może wskazywać również na niektóre lokalizacje sieciowe.

Wady:

  • może wymagać uruchomienia konsoli jako administrator,
  • może wymagać włączonego Developer Mode w Windows,
  • niektóre starsze aplikacje mogą gorzej obsługiwać symbolic links niż junction.

4.2. Junction

Junction tworzy się poleceniem:

mklink /J "link" "target"

Przykład:

mklink /J "C:\Program Files\Microsoft SQL Server Management Studio 22\Release\Common7\IDE\SqlWorkbenchProjectItems\Sql\Maintenance" "D:\DBA\Git\SSMS-Templates\Maintenance"

Zalety:

  • bardzo dobrze działa dla lokalnych katalogów NTFS,
  • zwykle jest lepiej tolerowany przez starsze aplikacje,
  • dobrze sprawdza się przy podpinaniu katalogów aplikacji do lokalnego repozytorium,
  • w tym scenariuszu jest zwykle najbezpieczniejszym wyborem.

Wady:

  • działa dla katalogów lokalnych,
  • nie jest tak uniwersalny jak klasyczny symbolic link.

Dla katalogów template SSMS zalecane jest użycie junction, czyli mklink /J.


5. Proponowany model z repozytorium Git

Repozytorium Git może mieć następującą strukturę:

D:\DBA\Git\SSMS-Templates
├── README.md
├── Maintenance
│   ├── Backup
│   ├── DBCC
│   ├── Indexes
│   ├── Statistics
│   ├── Jobs
│   ├── Sessions
│   ├── Blocking
│   └── Permissions
└── User
    ├── Test
    ├── Temp
    └── Personal

Katalog Maintenance przechowuje wspólne template administracyjne DBA.

Katalog User przechowuje prywatne lub robocze template użytkownika, jeżeli zdecydowano się je wersjonować.

Nie należy przechowywać w repozytorium danych wrażliwych, haseł, loginów, nazw klientów, connection stringów ani danych produkcyjnych.


6. Wariant rekomendowany

Najbardziej praktyczny wariant zakłada użycie junction dla katalogu Maintenance oraz opcjonalnie dla katalogu _User.

Katalog instalacyjny SSMS:

C:\Program Files\Microsoft SQL Server Management Studio 22\Release\Common7\IDE\SqlWorkbenchProjectItems\Sql
├── Default
└── Maintenance  -> D:\DBA\Git\SSMS-Templates\Maintenance

Katalog użytkownika SSMS:

C:\Users\UserName\AppData\Roaming\Microsoft\SQL Server Management Studio\22.0\Templates\Sql
├── Default
├── Maintenance
└── _User        -> D:\DBA\Git\SSMS-Templates\User

W tym wariancie:

  • Default pozostaje zwykłym katalogiem,
  • Maintenance w katalogu instalacyjnym wskazuje na repozytorium Git,
  • _User może wskazywać na repozytorium Git albo pozostać zwykłym katalogiem lokalnym,
  • po aktualizacji SSMS należy sprawdzić, czy link w katalogu instalacyjnym nadal istnieje.

7. Wariant z natychmiastową synchronizacją Maintenance

Jeżeli zmiany w Maintenance mają być natychmiast widoczne w Template Explorer, można podpiąć Maintenance również w katalogu użytkownika.

Katalog użytkownika:

C:\Users\UserName\AppData\Roaming\Microsoft\SQL Server Management Studio\22.0\Templates\Sql
├── Default
├── Maintenance  -> D:\DBA\Git\SSMS-Templates\Maintenance
└── _User        -> D:\DBA\Git\SSMS-Templates\User

Ten wariant jest wygodny, ponieważ zmiany wykonane w repozytorium są od razu widoczne w katalogu użytkownika SSMS.

Należy jednak pamiętać, że edycja template z poziomu SSMS będzie bezpośrednio zmieniać pliki w repozytorium Git.

Po każdej zmianie warto wykonać:

cd /d D:\DBA\Git\SSMS-Templates
git status


8. Procedura wdrożenia

8.1. Zamknięcie SSMS

Przed rozpoczęciem zmian należy zamknąć wszystkie uruchomione instancje SQL Server Management Studio.


8.2. Utworzenie katalogu repozytorium

Przykład:

mkdir D:\DBA\Git\SSMS-Templates
cd /d D:\DBA\Git\SSMS-Templates
git init

Następnie należy utworzyć katalogi:

mkdir Maintenance
mkdir User


8.3. Skopiowanie istniejących template do repozytorium

Przykład dla katalogu Maintenance:

robocopy "C:\Program Files\Microsoft SQL Server Management Studio 22\Release\Common7\IDE\SqlWorkbenchProjectItems\Sql\Maintenance" "D:\DBA\Git\SSMS-Templates\Maintenance" /E

Przykład dla katalogu _User:

robocopy "C:\Users\UserName\AppData\Roaming\Microsoft\SQL Server Management Studio\22.0\Templates\Sql\_User" "D:\DBA\Git\SSMS-Templates\User" /E

Przed usunięciem katalogów źródłowych należy sprawdzić, czy dane zostały poprawnie skopiowane.


8.4. Usunięcie dotychczasowych katalogów w lokalizacjach SSMS

Po wykonaniu kopii do repozytorium można usunąć stare katalogi, które mają zostać zastąpione przez junction.

Usunięcie katalogu Maintenance z katalogu instalacyjnego:

rmdir /S /Q "C:\Program Files\Microsoft SQL Server Management Studio 22\Release\Common7\IDE\SqlWorkbenchProjectItems\Sql\Maintenance"

Opcjonalne usunięcie katalogu _User z profilu użytkownika:

rmdir /S /Q "C:\Users\UserName\AppData\Roaming\Microsoft\SQL Server Management Studio\22.0\Templates\Sql\_User"

Należy upewnić się, że dane znajdują się już w repozytorium Git.


8.5. Utworzenie junction dla Maintenance

Polecenie należy uruchomić w konsoli CMD z uprawnieniami administratora, ponieważ lokalizacja docelowa znajduje się w Program Files.

mklink /J "C:\Program Files\Microsoft SQL Server Management Studio 22\Release\Common7\IDE\SqlWorkbenchProjectItems\Sql\Maintenance" "D:\DBA\Git\SSMS-Templates\Maintenance"


8.6. Utworzenie junction dla _User

Opcjonalnie można podpiąć katalog _User do repozytorium:

mklink /J "C:\Users\UserName\AppData\Roaming\Microsoft\SQL Server Management Studio\22.0\Templates\Sql\_User" "D:\DBA\Git\SSMS-Templates\User"

Ten krok jest opcjonalny.

Jeżeli template użytkownika mają pozostać prywatne i lokalne, katalog _User można zostawić jako zwykły katalog w profilu użytkownika.


8.7. Opcjonalne utworzenie junction dla Maintenance w katalogu użytkownika

Jeżeli katalog Maintenance ma być widoczny bezpośrednio z repozytorium również w profilu użytkownika, można utworzyć dodatkową junction:

mklink /J "C:\Users\UserName\AppData\Roaming\Microsoft\SQL Server Management Studio\22.0\Templates\Sql\Maintenance" "D:\DBA\Git\SSMS-Templates\Maintenance"

Ten wariant pozwala uniknąć sytuacji, w której SSMS korzysta z wcześniej skopiowanej wersji katalogu Maintenance w profilu użytkownika.


8.8. Sprawdzenie utworzonych linków

Sprawdzenie katalogu instalacyjnego:

dir "C:\Program Files\Microsoft SQL Server Management Studio 22\Release\Common7\IDE\SqlWorkbenchProjectItems\Sql"

Oczekiwany wynik powinien zawierać wpis podobny do:

<JUNCTION>     Maintenance [D:\DBA\Git\SSMS-Templates\Maintenance]

Sprawdzenie katalogu użytkownika:

dir "C:\Users\UserName\AppData\Roaming\Microsoft\SQL Server Management Studio\22.0\Templates\Sql"

Oczekiwany wynik dla _User:

<JUNCTION>     _User [D:\DBA\Git\SSMS-Templates\User]


8.9. Uruchomienie SSMS

Po utworzeniu linków należy uruchomić SSMS i otworzyć Template Explorer:

View -> Template Explorer

albo:

Ctrl + Alt + T

Należy sprawdzić, czy katalogi Maintenance oraz _User są widoczne i czy zawierają oczekiwane template.


9. Kontrola po aktualizacji SSMS

Katalog instalacyjny SSMS jest zarządzany przez instalator.

Oznacza to, że podczas:

  • aktualizacji SSMS,
  • naprawy instalacji SSMS,
  • reinstalacji SSMS,
  • instalacji kolejnej wersji SSMS,

katalog:

C:\Program Files\Microsoft SQL Server Management Studio 22\Release\Common7\IDE\SqlWorkbenchProjectItems\Sql

może zostać nadpisany, przywrócony do stanu domyślnego albo odtworzony od nowa.

W takiej sytuacji junction:

Maintenance -> D:\DBA\Git\SSMS-Templates\Maintenance

może zostać usunięta.

Po każdej aktualizacji SSMS należy sprawdzić, czy katalog Maintenance nadal jest linkiem do repozytorium.

Polecenie kontrolne:

dir "C:\Program Files\Microsoft SQL Server Management Studio 22\Release\Common7\IDE\SqlWorkbenchProjectItems\Sql"

Jeżeli link został usunięty, należy odtworzyć go poleceniem:

mklink /J "C:\Program Files\Microsoft SQL Server Management Studio 22\Release\Common7\IDE\SqlWorkbenchProjectItems\Sql\Maintenance" "D:\DBA\Git\SSMS-Templates\Maintenance"


10. Zasady bezpieczeństwa

10.1. Nie linkować katalogu Default

Katalog Default powinien pozostać zwykłym katalogiem.

Zawiera on domyślne template SSMS, które mogą zmieniać się między wersjami SSMS.

Linkowanie katalogu Default do repozytorium może utrudnić aktualizacje oraz porównanie zmian po instalacji nowej wersji SSMS.


10.2. Nie linkować całego katalogu Sql

Nie zaleca się zastępowania całego katalogu:

C:\Program Files\Microsoft SQL Server Management Studio 22\Release\Common7\IDE\SqlWorkbenchProjectItems\Sql

linkiem do repozytorium.

Bezpieczniej jest linkować tylko wybrane katalogi własne, takie jak:

Maintenance
_User


10.3. Zachować ostrożność przy usuwaniu linków

Usunięcie junction poleceniem:

rmdir "ścieżka_do_junction"

powinno usunąć sam punkt połączenia, a nie katalog docelowy.

Nie należy jednak usuwać zawartości katalogu widocznego przez junction bez świadomości, że operacja dotyczy realnych plików w repozytorium Git.

Przykład: usunięcie pliku z katalogu:

C:\Users\UserName\AppData\Roaming\Microsoft\SQL Server Management Studio\22.0\Templates\Sql\_User

może faktycznie usunąć plik z:

D:\DBA\Git\SSMS-Templates\User


10.4. Kontrolować zmiany w Git

Jeżeli katalogi template są podpięte do repozytorium, każda edycja wykonana z poziomu SSMS może zmienić pliki w repozytorium.

Po zmianach należy kontrolować stan repozytorium:

cd /d D:\DBA\Git\SSMS-Templates
git status

Przykładowy zapis zmian:

git add .
git commit -m "Update SSMS maintenance templates"


10.5. Nie przechowywać sekretów w repozytorium

W template nie należy przechowywać:

  • haseł,
  • loginów,
  • tokenów,
  • kluczy API,
  • connection stringów,
  • danych osobowych,
  • danych klientów,
  • nazw środowisk produkcyjnych, jeżeli nie powinny być wersjonowane,
  • danych produkcyjnych.

Template powinny być uniwersalne, parametryzowane i bezpieczne do przechowywania w repozytorium.


11. Zalecany wariant końcowy

Najbardziej zalecany wariant to użycie junction dla katalogu Maintenance w katalogu instalacyjnym SSMS oraz opcjonalnie dla katalogu _User w profilu użytkownika.

Polecenie dla Maintenance:

mklink /J "C:\Program Files\Microsoft SQL Server Management Studio 22\Release\Common7\IDE\SqlWorkbenchProjectItems\Sql\Maintenance" "D:\DBA\Git\SSMS-Templates\Maintenance"

Polecenie dla _User:

mklink /J "C:\Users\UserName\AppData\Roaming\Microsoft\SQL Server Management Studio\22.0\Templates\Sql\_User" "D:\DBA\Git\SSMS-Templates\User"

Opcjonalnie, dla natychmiastowej synchronizacji Maintenance w profilu użytkownika:

mklink /J "C:\Users\UserName\AppData\Roaming\Microsoft\SQL Server Management Studio\22.0\Templates\Sql\Maintenance" "D:\DBA\Git\SSMS-Templates\Maintenance"


12. Podsumowanie

Użycie junction albo symlink dla katalogów template SSMS jest dobrym rozwiązaniem opcjonalnym, jeżeli template mają być utrzymywane w repozytorium Git.

Najbezpieczniejsze podejście to:

  • nie linkować całego katalogu Sql,
  • nie linkować katalogu Default,
  • linkować wyłącznie katalogi własne, takie jak Maintenance i opcjonalnie _User,
  • preferować mklink /J zamiast mklink /D dla lokalnych katalogów NTFS,
  • po każdej aktualizacji SSMS sprawdzać, czy junction nadal istnieje,
  • regularnie kontrolować zmiany w repozytorium Git.

Wariant z linkami powinien być traktowany jako element opcjonalny.

Podstawowa dokumentacja porządkowania Template Explorer pozostaje poprawna bez użycia symlink/junction. Mechanizm linków jest dodatkowym usprawnieniem dla środowisk, w których template mają być wersjonowane i łatwo odtwarzane z repozytorium.


Dariusz Brejnak

Od prawie trzydziestu lat jest pasjonatem informatyki, a zwłaszcza dziedzin dotyczących baz danych, hurtowni danych oraz ogólnie rozumianej tematyki BI. Jego druga pasja to fotografia http://dariuszbrejnak.pl