!! LESEN SIE UNBEDINGT DIE FETT GEDRUCKTE WARNUNG UNTEN !!
Die Serverkonfigurationsoption von allow updates
wurde ab SQL Server 2005 nicht mehr funktionsfähig gemacht. Die Dokumentation gibt an, dass es keinen Fehler verursacht, aber keine direkten Aktualisierungen von Systemkatalogtabellen zulässt.
Der einzige Weg, dies jetzt zu erreichen, ist SICH VOLLSTÄNDIG BEWUSST ZU SEIN, DASS DIES GEFÄHRLICH IST UND NICHT EMPFOHLEN , besteht darin, eine DAC-Verbindung (Dedicated Admin Console) zu verwenden.
Zuerst benötigen Sie das tatsächliche Tabellenname, den Sie aktualisieren möchten. Der Name, den Sie SELECT
from ist nur eine Systemkatalogansicht, nicht die eigentliche Tabelle. Normalerweise verwende ich Folgendes:
EXEC sp_helptext N'sys.{some name here}';
Gehen Sie dann wie folgt vor:
-
Starten Sie die Instanz im Single-User-Modus mit
neusudo systemctl stop mssql-server sudo -u mssql /opt/mssql/bin/sqlservr -m
Nur um es klar zu sagen:Dieser Schritt dient dazu, Systemkatalogaktualisierungen zu ermöglichen. Die Verbindung mit dem DAC selbst für andere Vorgänge erfordert keinen Einzelbenutzermodus.
-
Stellen Sie eine Verbindung über eine dedizierte Admin-Konsolenverbindung mit
sa
her oder ein anderersysadmin
Anmeldung. Sie können dies in einer interaktiven SQLCMD-Sitzung tun, indem Sie Folgendes in einem Eingabeaufforderungsfenster ausführen:sqlcmd -S admin:localhost -U sa
Wenn Linux SQLCMD dies aus irgendeinem Grund nicht unterstützt, können Sie Remote-DAC-Verbindungen aktivieren und später einen Windows-Computer verwenden, um herauszufinden, ob DAC funktioniert. Sie können DAC unter Linux aktivieren mit,:
EXEC sp_configure 'remote admin connections', 1; RECONFIGURE;
-
Versuchen Sie in dieser DB etwa Folgendes:
UPDATE sys.{whatever_name_you_found} {enter} SET [some_column] = {some_value} {enter} WHERE [some_other_column] = {the_better_be_correct_or_else_ID}; {enter} GO {enter}
Die Anweisung wird erst ausgeführt, wenn Sie
GO {enter}
eingeben .
GEFAHR WIRD ROBINSON!!
Bitte seien Sie vorsichtig, wenn Sie Systemkatalogtabellen direkt bearbeiten, und fühlen Sie sich nicht zu wohl mit der Idee, dies zu tun. Dies ist etwas, was nur getan werden sollte wenn es absolut keine andere Möglichkeit gibt, ein Problem zu beheben (wie hier der Fall). Es gibt wahrscheinlich mehrere Gründe, direkte Bearbeitungen zu vermeiden, aber die beiden, die zuerst in den Sinn kommen, sind:
- Ähnlich wie bei den Datenmodellen, die wir erstellen, gibt es wahrscheinlich Regeln und Arbeitsabläufe für die Funktionsweise von Dingen, die wir nicht kennen (z. B. Denormalisierung, "Geschäftsregeln", die den Status von Daten in verschiedenen Tabellen regeln usw.)
-
Sehr wahrscheinlich führt das direkte Bearbeiten dazu, dass Microsoft nicht mehr verpflichtet ist, Ihnen zu helfen, wenn Sie auf Probleme stoßen und einen Supportvertrag haben (ich habe die Bedingungen der Supportvereinbarung(en) nicht gesehen, aber es fällt mir schwer zu glauben, dass eine solche Sprache nicht enthalten wäre dort).
@Paul Randal bestätigte in einem Kommentar:„Das manuelle Bearbeiten einer Systemtabelle setzt unwiderruflich ein Flag in der Boot-Seite der Datenbank, das Ihre Datenbank als auf diese Weise bearbeitet markiert, und CSS könnte entscheiden, Ihnen nicht zu helfen, wenn Sie später Probleme haben mit dieser Datenbank."
Kurze Antwort:Tust du nicht.
Längere Antwort:Beachten Sie, dass Sie dies niemals auf einem Produktionssystem tun sollten . Sie können und werden die Dinge wahrscheinlich ziemlich durcheinander bringen, und MS wird Ihnen sagen, dass Sie Sand zerstampfen sollen, wenn Sie sie anrufen und um Hilfe bitten, mit all Ihrem nicht unterstützten/undokumentierten Herumspielen.
Wenn das aus dem Weg ist, los geht's.
Zuerst müssen Sie SQL Server im Einzelbenutzermodus starten. Sie haben die Frage „Linux“ markiert, und ich weiß nicht, ob dies genau so funktioniert, aber für die Windows-Version stoppen Sie einfach den SQL Server-Dienst und starten Sie ihn dann über die Befehlszeile mit „-m“. Argument, z. B.:
cd "\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Binn"
sqlservr.exe -m
Sobald dies ausgeführt wird, müssen Sie sich mit der dedizierten Administratorverbindung (DAC) für die Instanz verbinden. Sie können jedes beliebige Tool verwenden, z. Management Studio oder sqlcmd, aber beachten Sie, dass Sie den Objekt-Explorer nicht in Management Studio verbinden können, da er im Einzelbenutzermodus ausgeführt wird. Geben Sie in beiden Fällen ADMIN:
an Präfix für den Servernamen. Ich denke, Sie können ADMIN:(local)
machen um sich mit einer lokalen Standardinstanz zu verbinden.
Danach können Sie so ziemlich alles ändern, was Sie möchten, aber Sie müssen herausfinden, was die tatsächlichen zugrunde liegenden Tabellen für bestimmte Systemkatalogansichten sind. Beispiel:sys.database_principals
. Um die Ansichtsdefinition anzuzeigen, wechseln Sie zur Datenbank „mssqlsystemresource“ (normalerweise nicht sichtbar) und verwenden Sie sp_helptext
um den Code für Systemansichten/-prozeduren/-funktionen anzuzeigen.
USE mssqlsystemresource
GO
EXEC sp_helptext 'sys.server_principals'
Sie werden feststellen, dass eine der Tabellen, auf die diese Ansicht verweist, master.sys.sysxlgns
ist , was wahrscheinlich ein guter Anfang ist. Sie finden eine Spalte namens pwdhash
in dieser Tabelle, die die gehashten Passwörter zu speichern scheint.
Wenn Sie mit dem Basteln fertig sind, gehen Sie einfach zu Ihrem Befehlsfenster, in dem SQL Server im Einzelbenutzermodus ausgeführt wird, und drücken Sie Strg-C, um es zu beenden.
Denken Sie daran, tun Sie dies niemals auf einem Produktionssystem, es sei denn, der Microsoft-Support hat Ihnen ausdrückliche Anweisungen gegeben . Ansonsten viel Spaß und stellen Sie sicher, dass Sie Backups haben, wenn Sie die Instanz zerstören!