!! ¡¡ASEGÚRESE DE LEER LA ADVERTENCIA, EN NEGRITA, EN LA PARTE INFERIOR!!
La opción de configuración del servidor de allow updates
dejó de funcionar a partir de SQL Server 2005. La documentación indica que no genera errores, pero en realidad no permitirá ninguna actualización directa de las tablas del catálogo del sistema.
La única forma de lograrlo ahora es SER TOTALMENTE CONSCIENTE DE QUE ESTO ES PELIGROSO Y NO RECOMENDADO , es usar una conexión de consola de administración dedicada (DAC).
Primero necesitará el real Nombre de la tabla que desea actualizar. El nombre que SELECT
from es solo una vista del catálogo del sistema, no la tabla real. Usualmente uso lo siguiente:
EXEC sp_helptext N'sys.{some name here}';
Luego, haz lo siguiente:
-
Reinicie la instancia en modo de usuario único con
sudo systemctl stop mssql-server sudo -u mssql /opt/mssql/bin/sqlservr -m
Para que quede claro:este paso es para permitir las actualizaciones del catálogo del sistema. Conectarse al propio DAC para realizar otras operaciones no requiere el modo de usuario único.
-
Conéctese a través de la conexión de la consola de administración dedicada con
sa
o algún otrosysadmin
Acceso. Puede hacer esto en una sesión interactiva de SQLCMD ejecutando lo siguiente en una ventana del símbolo del sistema:sqlcmd -S admin:localhost -U sa
Si el SQLCMD de Linux no es compatible con esto por alguna razón, puede habilitar conexiones DAC remotas y luego usar una máquina con Windows para averiguar si DAC está funcionando. Puede habilitar DAC en Linux con:
EXEC sp_configure 'remote admin connections', 1; RECONFIGURE;
-
En esa base de datos, intente algo como lo siguiente:
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}
No ejecutará la declaración hasta que ingrese el
GO {enter}
.
¡¡PELIGRO SERÁ ROBINSON!!
Tenga cuidado al editar directamente las tablas del catálogo del sistema y no se sienta demasiado cómodo con la idea de hacerlo. Esto es algo que debe hacerse solo si no hay absolutamente ninguna otra forma de solucionar un problema (como el caso aquí). Probablemente hay varias razones para evitar hacer ediciones directas, pero las dos que inicialmente vienen a la mente son:
- Al igual que los modelos de datos que creamos, es probable que existan reglas y flujos de trabajo sobre cómo funcionan las cosas que desconocemos (por ejemplo, desnormalización, reglas "comerciales" que rigen el estado de los datos en varias tablas, etc.)
-
Es muy probable que hacer ediciones directas anule la responsabilidad de Microsoft de ayudarlo si tiene problemas y tiene un contrato de soporte (no he visto los términos de los acuerdos de soporte, pero me cuesta creer que ese lenguaje no esté en allí).
@Paul Randal confirmó en un comentario:"la edición manual de una tabla del sistema establece de manera irrevocable una marca en la página de inicio de la base de datos que marca su base de datos como si hubiera sido editada de esta manera, y CSS podría decidir no ayudarlo si posteriormente tiene problemas con esa base de datos."
Respuesta corta:no.
Respuesta más larga:tenga en cuenta que nunca debe hacer esto en un sistema de producción . Puede arruinar las cosas y es probable que lo haga bastante mal, y MS le pedirá que golpee la arena si los llama para pedir ayuda con todos sus problemas sin soporte/indocumentados.
Con eso fuera del camino, aquí vamos.
Primero, deberá abrir SQL Server en modo de usuario único. Ha etiquetado la pregunta como "linux", y no sé si esto funciona exactamente de la misma manera, pero para la versión de Windows, simplemente detenga el servicio de SQL Server, luego inícielo desde la línea de comando con "-m". argumento, por ejemplo:
cd "\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Binn"
sqlservr.exe -m
Una vez que se está ejecutando, debe conectarse a la conexión de administrador dedicado (DAC) para la instancia. Puede usar cualquier herramienta que desee, p. Management Studio o sqlcmd, pero tenga en cuenta que no puede conectar el Explorador de objetos en Management Studio, ya que se ejecuta en modo de usuario único. En cualquier caso, especifique el ADMIN:
prefijo para el nombre del servidor. Creo que puedes hacer ADMIN:(local)
para conectarse a una instancia predeterminada local.
Después de eso, puede cambiar prácticamente lo que quiera, pero tendrá que averiguar cuáles son las tablas subyacentes reales para ciertas vistas del catálogo del sistema. Por ejemplo, sys.database_principals
. Para ver la definición de la vista, cambie a la base de datos "mssqlsystemresource" (normalmente no visible) y use sp_helptext
para ver el código de cualquier vista/procedimiento/función del sistema.
USE mssqlsystemresource
GO
EXEC sp_helptext 'sys.server_principals'
Notará que una de las tablas a las que hace referencia esta vista es master.sys.sysxlgns
, que es probablemente un buen lugar para comenzar. Encontrarás una columna llamada pwdhash
en esta tabla, que parece almacenar las contraseñas cifradas.
Cuando haya terminado de jugar, simplemente vaya a la ventana de comandos que ejecuta SQL Server en modo de usuario único y presione Ctrl-C para cerrarlo.
Recuerde, no le haga esto a un sistema de producción, nunca, a menos que el soporte de Microsoft le haya dado instrucciones específicas de lo contrario . Aparte de eso, ¡diviértete y asegúrate de tener copias de seguridad para cuando destruyas la instancia!