web-dev-qa-db-fra.com

Comment modifiez-vous directement les catalogues système dans SQL Server 2017?

Remarque: Je comprends les risques liés aux risques et la possibilité de détruire un système de production en faisant cela. Je suis intéressé à le faire quand même.

Chaque fois que j'essaie de jouer avec des catalogues système, je reçois ces erreurs étranges,

UPDATE sys.sql_logins
SET password_hash = PWDENCRYPT('pass')
WHERE name = 'sa';

Erreur produite,

MSG 259 [...] Les mises à jour ad hoc aux catalogues système ne sont pas autorisées.

J'ai essayé des moyens numérisés de prendre les roues de formation,

sp_configure 'allow updates',`
go
reconfigure
go

Mais je ne peux pas comprendre la bonne option ...

Il dit même dans cette réponse :

ce n'est plus possible au moins pas sans sauter à travers une tonne de cerceaux supplémentaires au-delà d'un sp_configure Option - Ce n'est pas quelque chose que vous voulez jamais faire sur un système de production), et que tout le catalogue système est maintenant exposé via des vues en lecture seule comme Sys.Objects.

Eh bien, et si je veux sauter à travers ces cerceaux. Comment puis-je le faire?

6
Evan Carroll

!!   BE SURE TO READ THE WARNING, IN BOLD, AT THE BOTTOM   !!

L'option de configuration du serveur de allow updates A été rendue non fonctionnelle à partir de SQL Server 2005. La documentation indique qu'elle n'étère pas, mais ne permet aucune mises à jour directe aux tables de catalogue système.

Le seul moyen d'y parvenir maintenant, étant pleinement conscient que cela IS dangereux et IS [~ # ~ # ~] Recommandé , est d'utiliser une connexion A Console d'administration dédiée (DAC) .

Tout d'abord, vous aurez besoin du réel Nom de la table que vous souhaitez mettre à jour. Le nom que vous SELECT à partir d'une vue de catalogue système, pas la vraie table. J'utilise habituellement ce qui suit:

EXEC sp_helptext N'sys.{some name here}';

Ensuite, procédez comme suit:

  1. 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 consiste à permettre les mises à jour du catalogue système. Connexion au DAC lui-même pour faire d'autres opérations ne nécessite pas de mode mono-utilisateur.

  2. Connectez-vous via une connexion de console d'administration dédiée avec sa ou d'autres sysadmin 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 le Linux SQLCMD ne le prend pas en charge pour une raison quelconque, vous pouvez activer les connexions DAC distantes, puis utilisez une machine Windows pour creuser ce DAC fonctionne. Vous pouvez activer le DAC sur Linux:

    EXEC sp_configure 'remote admin connections', 1;  
    RECONFIGURE;  
    
  3. Dans cette DB, essayez quelque chose comme ce qui suit:

    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 la déclaration avant de mettre dans le GO {enter}.

Danger sera robinson !!

S'il vous plaît soyez prudent lors de la modification directe des tables de catalogue du système et n'êtes pas trop à l'aise avec l'idée de le faire. C'est quelque chose qui devrait être fait seulement S'il n'y a absolument aucun autre moyen de résoudre un problème (tel que le cas ici). Il y a probablement plusieurs raisons Pour éviter de faire des modifications directes, mais les deux qui se viennent à l'esprit initialement sont:

  • Tout comme les modèles de données que nous créons, de règles et de flux de travail probablement pour la manière dont les choses fonctionnent que nous ignorons (par exemple la dénormalisation, les règles de "entreprise" régissant l'état des données sur divers tables, etc.)
  • Assez probablement faire des modifications directes vides de la responsabilité de Microsoft de vous aider si vous rencontrez des problèmes et que vous avez un contrat d'appui (je n'ai pas vu les termes de l'accord (s) de soutien, mais j'ai du mal à croire que cette langue ne serait pas dans là).

    @ paul randal confirmé dans un commentaire: "Modification manuelle d'une table système définit irrévocablement un drapeau de la page de démarrage de la base de données qui marque votre base de données comme étant modifiée de cette manière et CSS peut décider de ne pas vous aider si vous avez par la suite des problèmes avec cette base de données. "

10
Solomon Rutzky

Réponse courte: vous ne le faites pas.

Réponse plus longue: Notez que vous devriez Jamais cela sur un système de production. Vous pouvez et probablement gâcher les choses plutôt mauvaises, et MS vous dira de vous dire de sable si vous les appelez à l'aide de l'aide de tous vos messages non supportés/sans papiers.

Avec ça hors du passage, voilà, nous allons.

Premièrement, vous devrez apporter SQL Server en mode mono-utilisateur. Vous avez marqué 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 la lancer à partir de 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 s'exécutent, vous devez vous connecter à la connexion dédiée à l'administrateur (DAC) pour l'instance. Vous pouvez utiliser n'importe quel outil que vous aimez, par ex. Gestion Studio ou SQLCMD, mais Notez que vous ne pouvez pas connecter l'Explorateur d'objets dans Management Studio, car il fonctionne en mode mono-utilisateur. Dans les deux cas, spécifiez le préfixe ADMIN: Pour le nom du serveur. Je pense que vous pouvez faire ADMIN:(local) pour vous connecter à une instance par défaut locale.

Après cela, vous pouvez probablement changer ce que vous voulez, mais vous devrez déterminer quelles sont les tables sous-jacentes réelles pour certaines vues de catalogue de systèmes. Par exemple, sys.database_principals. Pour voir la définition de vue, passez à la base de données "MSSQLSystemResource" (non visible de MSSQLSystemResource (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 une des tables que cette vue Références est master.sys.sysxlgns, Ce qui est probablement un bon endroit pour commencer. Vous trouverez une colonne nommée pwdhash dans ce tableau, qui semble stocker les mots de passe hachés.

Lorsque vous avez terminé Tinkering, allez simplement à votre fenêtre de commande qui exécute SQL Server en mode mono-utilisateur et appuyez sur Ctrl-C pour la fermer.

Rappelez-vous, Ne faites pas cela à un système de production, à moins que Microsoft Support vous ait donné des instructions spécifiques autrement. Outre cela, amusez-vous et assurez-vous que vous avez des sauvegardes lorsque vous détruisez l'instance!

4
db2