SQL Server 2005 posiada funkcjonalnie wydzielony obszar, w którym przechowywane są informacje dotyczące samej instancji i jej wszystkich baz. Obszarem tym jest katalog systemowy (system catalog). Informacje przechowywane w katalogu systemowym udostępniane są użytkownikowi na kilka sposobów. W najnowszej wersji SQL Server służą do tego przede wszystkim widoki DMV (Dynamic Management Views) i funkcje DMF (Dynamic Management Functions), które dostarczają informacji na temat różnego typu obiektów w poszczególnych bazach danych, a także szereg innych informacji m.in. statystycznych. Katalog systemowy występuje oczywiście również w poprzednich wersjach SQL Server, różnice co do jego struktury w porównaniu z aktualną wersją są jednak dość duże.
Informacje zawarte w katalogu systemowym
nie powinny być modyfikowane przez użytkownika przy użyciu operacji DML (UPDATE, INSERT, DELETE). To kategoryczne stwierdzenie wielokrotnie artykułowane przez Microsoft ma istotnie głębokie uzasadnienie. Miałem już jednak nieprzyjemność uczestniczyć w różnych awaryjnych sytuacjach, w których pozytywne rozwiązanie problemu nie byłoby możliwe bez drastycznych działań na tabelach (widokach) systemowych. W
bardzo ograniczonym zakresie działania tego typu są więc dopuszczalne. Wychodzę z założenia, że gdyby twórcy MSSQL rzeczywiście chcieli zabronić takich operacji, nie byłyby one technicznie możliwe. Tymczasem możliwe są - i to zarówno w wersji SQL Server 2000, jak i SQL Server 2005.
Co więc należy zrobić, aby wykonać przykładowo UPDATE na jakiejś tabeli systemowej (widoku)?
Wersja SQL Server 2000
Wystarczy uaktywnić odpowiednią opcję konfiguracyjną:
EXEC sp_configure 'allow updates', 1
RECONFIGURE WITH OVERRIDE
i już mamy możliwość wykonywania operacji DML na katalogu systemowym. Należy pamiętać, że po rozwiązaniu problemu trzeba przywrócić opcję
allow updates do stanu disabled. Osiągniemy to wykonując powyższy kod z wartością 0 zamiast 1.
Wersja SQL Server 2005
W przypadku wersji SQL Server 2005 sytuacja jest znacznie bardziej skomplikowana. Po pierwsze należy wystartować instancję w trybie pojedynczego użytkownika (single-user mode). Musimy więc zatrzymać daną instancję (jeżeli w danym momencie działa), a następnie uruchomić ją przy pomocy następującego polecenia wydanego z linii komend (cmd):
cd c:\Program Files\Microsoft SQL Server 2005\MSSQL.1\MSSQL\Binn\
sqlservr.exe -m
przy czym dokładna ścieżka zależy oczywiście od miejsca zainstalowania MSSQLa. W przypadku nazwanej instancji polecenie wygląda tak:
sqlservr.exe -m -s nazwa_instancji
Okno linii poleceń należy zostawić otwarte, a po zakończeniu działań należy wyjść z procesu w nim uruchomionego (kombinacja klawiszy CTRL-C), co będzie równoznaczne z zatrzymaniem usługi SQL Server.
Aby mieć możliwość dokonywania zmian w katalogu systemowym, należy zalogować się poprzez DAC do instancji odpalonej w trybie single-user zgodnie z powyższymi wytycznymi. DAC (Dedicated Administrator Connection) to specjalne połączenie diagnostyczno-administracyjne, które może być wykonane z sqlcmd lub Management Studio zasadniczo jako połączenie lokalne (klient powinien być uruchomiony bezpośrednio na serwerze, choć zdalny DAC jest również możliwy). Połączenie przez DAC osiągamy przez dodanie do nazwy serwera prefixu "ADMIN:". Aby połączyć się do instancji
druga na serwerze
sql2005 należy jako Server name (Management Studio) podać:
ADMIN:sql2005\druga
Oczywiście w przypadku instancji domyślnej po frazie "ADMIN:" podajemy wyłącznie nazwę serwera. Trzeba też pamiętać, że do połączenia przez DAC do nazwanej instancji przez podanie jej nazwy wymagane jest działanie usługi SQL Server Browser.
Po zalogowaniu się przez DAC do określonej instancji należy w kontekście dowolnej bazy dokonać rekonfiguracji opcji
allow updates:
EXEC sp_configure 'allow updates', 1;
RECONFIGURE WITH OVERRIDE;
(odbywa się to w analogiczny sposób jak w SQL Server 2000).
Po wykonaniu powyższych czynności możemy dokonywać operacji DML w katalogu systemowym. Jeszcze raz podkreślam, że należy przy tym zachować szczególną ostrożność, a w sytuacji działania na serwerze produkcyjnym (sic!), niech ktoś patrzy nam na ręce.
Więcej informacji:
MSDN: How to: Start an Instance of SQL Server
SQL Server 2005 Books Online (BOL): Using a Dedicated Administrator Connection