!! ASSUREZ-VOUS DE LIRE L'AVERTISSEMENT, EN GRAS, EN BAS !!
L'option de configuration du serveur de allow updates
a été rendu non fonctionnel à partir de SQL Server 2005. La documentation indique qu'il n'y a pas d'erreur, mais qu'il n'autorise en fait aucune mise à jour directe des tables du catalogue système.
La seule façon d'y parvenir maintenant, ÊTRE PLEINEMENT CONSCIENT QUE CECI EST DANGEREUX ET N'EST PAS RECOMMANDÉ , consiste à utiliser une connexion de console d'administration dédiée (DAC).
Vous aurez d'abord besoin du réel Nom de la table que vous souhaitez mettre à jour. Le nom que vous SELECT
from n'est qu'une vue de catalogue système, pas la vraie table. J'utilise généralement les éléments suivants :
EXEC sp_helptext N'sys.{some name here}';
Ensuite, procédez comme suit :
-
Redémarrez l'instance en mode mono-utilisateur avec
sudo systemctl stop mssql-server sudo -u mssql /opt/mssql/bin/sqlservr -m
Juste pour être clair :cette étape permet les mises à jour du catalogue système. La connexion au DAC lui-même pour effectuer d'autres opérations ne nécessite pas le mode mono-utilisateur.
-
Connectez-vous via une connexion dédiée à la console d'administration avec
sa
ou un autresysadmin
Connexion. Vous pouvez le faire dans une session interactive SQLCMD en exécutant ce qui suit dans une fenêtre d'invite de commande :sqlcmd -S admin:localhost -U sa
Si Linux SQLCMD ne le prend pas en charge pour une raison quelconque, vous pouvez activer les connexions DAC à distance, puis utiliser ultérieurement une machine Windows pour vérifier que le DAC fonctionne. Vous pouvez activer DAC sur Linux avec :
EXEC sp_configure 'remote admin connections', 1; RECONFIGURE;
-
Dans cette base de données, essayez quelque chose comme ceci :
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}
Il n'exécutera pas l'instruction tant que vous n'aurez pas inséré le
GO {enter}
.
DANGER ROBINSON !!
Veuillez être prudent lorsque vous modifiez directement les tables du catalogue système et ne vous sentez pas trop à l'aise avec l'idée de le faire. C'est quelque chose qui ne devrait être fait que s'il n'y a absolument aucun autre moyen de résoudre un problème (comme c'est le cas ici). Il y a probablement plusieurs raisons pour éviter de faire des modifications directes, mais les deux qui viennent initialement à l'esprit sont :
- Tout comme les modèles de données que nous créons, il existe probablement des règles et des flux de travail sur le fonctionnement des choses dont nous n'avons pas connaissance (par exemple, la dénormalisation, les règles "métier" régissant l'état des données dans diverses tables, etc.)
-
Il est fort probable que faire des modifications directes annule la responsabilité de Microsoft de vous aider si vous rencontrez des problèmes et que vous avez un contrat de support (je n'ai pas vu les termes du ou des accords de support, mais j'ai du mal à croire qu'un tel langage ne serait pas en là).
@Paul Randal a confirmé dans un commentaire :"la modification manuelle d'une table système définit irrévocablement un indicateur dans la page de démarrage de la base de données qui marque votre base de données comme ayant été modifiée de cette manière, et CSS pourrait décider de ne pas vous aider si vous rencontrez des problèmes par la suite avec cette base de données."
Réponse courte :vous ne le faites pas.
Réponse plus longue :notez que vous ne devriez jamais faire cela sur un système de production . Vous pouvez et allez probablement gâcher les choses assez mal, et MS vous dira de marteler du sable si vous les appelez pour demander de l'aide avec tous vos désordres non pris en charge / sans papiers.
Avec cela à l'écart, nous y voilà.
Tout d'abord, vous devrez mettre en place SQL Server en mode mono-utilisateur. Vous avez tagué la question "linux", et je ne sais pas si cela fonctionne exactement de la même manière, mais pour la version Windows, arrêtez simplement le service SQL Server, puis lancez-le depuis la ligne de commande avec le "-m" argument, par exemple :
cd "\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Binn"
sqlservr.exe -m
Une fois que cela est en cours d'exécution, vous devez vous connecter à la connexion d'administrateur dédié (DAC) pour l'instance. Vous pouvez utiliser n'importe quel outil que vous aimez, par ex. Management Studio ou sqlcmd, mais notez que vous ne pouvez pas connecter l'Explorateur d'objets dans Management Studio, car il s'exécute en mode mono-utilisateur. Dans les deux cas, indiquez le ADMIN:
préfixe du nom du serveur. Je pense que tu peux faire ADMIN:(local)
pour se connecter à une instance locale par défaut.
Après cela, vous pouvez à peu près modifier ce que vous voulez, mais vous devrez déterminer quelles sont les tables sous-jacentes réelles pour certaines vues du catalogue système. Par exemple, sys.database_principals
. Pour voir la définition de la vue, passez à la base de données "mssqlsystemresource" (normalement non visible) et utilisez sp_helptext
pour voir le code de toutes les vues/procédures/fonctions du système.
USE mssqlsystemresource
GO
EXEC sp_helptext 'sys.server_principals'
Vous remarquerez que l'une des tables référencées par cette vue est master.sys.sysxlgns
, ce qui est probablement un bon point de départ. Vous trouverez une colonne nommée pwdhash
dans ce tableau, qui semble stocker les mots de passe hachés.
Lorsque vous avez terminé de bricoler, accédez simplement à votre fenêtre de commande qui exécute SQL Server en mode mono-utilisateur et appuyez sur Ctrl-C pour l'arrêter.
Rappelez-vous, ne faites jamais cela sur un système de production, à moins que le support Microsoft ne vous ait donné des instructions spécifiques contraires . En dehors de cela, amusez-vous et assurez-vous d'avoir des sauvegardes pour quand vous détruisez l'instance !