Sinn und Zweck

Die MsSqlSystemResource-Datenbank ist eigentlich eine alte Idee. Auch Sybase führte schon vor etlichen Jahren eine System-Datenbank ein, die den Quellcode aller System-Proceduren (bei MS sind es auch die System-Views) enthält, dort hieß sie "SybSystemProcs". Damit wird der Code von den Daten in der Master-Datenbank getrennt. Das ist beim Patchen oder bei Installation eines Servicepacks nützlich. Jetzt kann Microsoft einfach hergehen und bei jedem Update einfach die komplette Datenbank austauschen. Umgekehrt kann man leichter auf einen vorherigen Versionsstand zurücksetzen. Hotfixes sind damit "deinstallierbar"…
Dazu muss der Dienst gestoppt werden, sie kopieren einfach nur die neuen Dateien hin.

Das wurde nötig, weil bei diesen Updates immer wieder Abbrüche beim Einspielen der neuen Skripten in die Master-Datenbank auftraten. Außerdem dauert das Einspielen der Skripte wesentlich länger als einfach die Dateien auszutauschen. Dadurch wurde der Update robuster und schneller. Leider benötigt der Hotfix damit deutlich mehr Platz…

Die inneren Werte

Neben den spärlichen Informationen in den Books-Online zum SQL-Server-2005 zur "Ressourcendatenbank", gibt es eine weitere Möglichkeit, wie man sich selber an die Erforschung machen kann.

Die Dateien der Mssqlsystemresource-Datenbank liegen unter "'C:\Programme\Microsoft SQL Server\MSSQL.n\MSSQL\Data\mssqlsystemresource.mdf/ldf'", wobei das "n" von der Installation abhängt. Die erste Instanz des SQL-Servers legt sich nach 1, die nächste nach 2 usw. Dabei zählen allerdings nicht nur SQL-Server, sondern auch die Analysis-Services usw. Wenn man die Dateien hat, dann ist eigentlich schon alles geritzt.

Die Idee ist nicht wirklich umwerfend und auch leider schon im Blog von Mladen Prajdic beschrieben: Man muss einfach nur die MDF/LDF unter anderem Namen anhängen und schon sieht man alles…

Vorgehen:

Dienst stoppen, Dateien kopieren, z.B. in mssqlsystemresource_.mdf/ldf im gleichen Verzeichnis, Dienst starten.

Jetzt kann man die DB einfach anhängen und sich selber zum Besitzer machen. (Da ich mich generell mit SA anmelde wird er im Beispiel verwendet, obwohl das in dem Fall unnötig ist.)

exec sp_attach_db 'mssqlsystemresource2'
, 'C:\Programme\Microsoft SQL Server\MSSQL.1\MSSQL\Data\mssqlsystemresource_.mdf'
, 'C:\Programme\Microsoft SQL Server\MSSQL.1\MSSQL\Data\mssqlsystemresource_.ldf'

EXEC mssqlsystemresource2..sp_changedbowner @loginame = N'sa'

Freundlicherweise wurden die Views und Procedures nicht mit "ENCRYPTION" angelegt. Daher kann man nun alle Definitionen in aller Ruhe ansehen und sogar verändern. Ganz wie früher in der guten alten Zeit… 😉

select
name as object_name,
type as object_type,
object_definition(object_id) as object_definition
from sys.system_objects

Und die echten Tabellen?

Wenn man die Views und Procedures aufmerksam studiert, dann sieht man, dass immer wieder seltsame Tabellennamen auftauchen, z.B. sys.objects$. Das sind die echten Systemtabellen an die man als Normalsterblicher nicht mehr herankommt…