GuilleSQL :: Microsoft SQL Server, SSIS, y más !!

SQL Server FAQ: ¿Es posible modificar los objetos del sistema en SQL Server 2000? ¿Es posible modificar los objetos del sistema en SQL Server 2005?

Volver a: [SQL Server FAQ :: Preguntas y Respuestas Frecuentes de SQL Server :: Manual SQL Server]


Este capítulo explica cómo poder modificar los datos de las tablas del sistema de SQL Server 2005 y cómo modificar por procedimientos almacenados del sistema en SQL Server 2005 (ojo: estas configuraciones no están soportadas ni son prácticas recomendables). Se habla del procedimiento almacenado de sistema sp_MS_marksystemobject, de la opción de configuración allow updates, de la base de datos MSSQLSystemResource, en que modo (trace flag) arrancar la instancia de SQL Servere 2005 para conseguir realizar los cambios del sistema deseados, etc.

En ocasiones resulta necesario modificar directamente los objetos del sistema de SQL Server, existiendo principalmente dos casuísticas: modificar las tablas del sistema para reflejar manualmente cierta configuración, y modificar los procedimientos almacenados del sistema para mejorar su rendimiento.

En SQL Server 2000 es posible utilizar el procedimiento almacenado del sistema sp_configure para activar la opción allow updates. De este modo, y tras ejecutar RECONFIGURE WITH OVERRIDE para que los cambios tomen efecto, será posible (por ejemplo) acceder a las tablas del sistema para modificar sus filas.

También es cierto, que modificar las tablas del sistema es algo que no suele ser necesario, y en ocasiones se hace innecesariamente. Por poner un ejemplo, en muchas ocasiones me he encontrado con gente que actualizaba manualmente la tabla del sistema sysxlogins o sysusers para corregir el problema de los usuarios huérfanos, cuando es posible realizar dicha corrección utilizando el procedimiento almacenado del sistema sp_change_users_login, lo cual es la práctica recomendada.

Del mismo modo, también es posible alterar los procedimientos almacenados del sistema, por ejemplo, si nos encontramos con algún procedimiento almacenado del sistema que pueda ofrecer un mal rendimiento bajo ciertas condiciones, y nos resulte de interés modificar su código fuente para mejorar su comportamiento.

También es posible crear un procedimiento almacenado, y seguidamente convertirlo en un procedimiento almacenado del sistema, utilizando el procedimiento del sistema no documentado sp_MS_marksystemobject. Es interesante recordar, que no existe un procedimiento almacenado que sea capaz de revertir este cambio, por lo cual, será necesario modificar directamente las tablas del sistema, con una consulta similar a la siguiente:

UPDATE sysobjects
SET status = 1610612737, base_schema_ver = 0
WHERE name = '{procedure name}

Ahora que ya hemos hablado de SQL Server 2000, llega el momento de hablar de SQL Server 2005.

En SQL Server 2005 no están permitidas las modificaciones directas del catálogo. Es decir, al habilitar la opción allow updates a través de sp_configure, al ejecutar RECONFIGURE se muestra el siguiente mensaje:

Msg 5808, Level 16, State 1, Line 1
Ad hoc update to system catalogs is not supported.

Sin embargo, no perdamos la esperanza, ya que no es del todo cierto. En SQL Server 2005 es posible realizar modificaciones directas sobre el catálogo del sistema, si se cumple las siguientes condiciones:

  • Habilitar las actualizaciones del catálogo del sistema, esto es, se habilita la opción allow updates a través del procedimiento almacenado del sistema sp_configure, y se ejecuta RECONFIGURE para que el cambio tome efecto.
  • Iniciar la instancia de SQL Server en modo usuario único (single-user mode). Esta tarea implica iniciar manualmente la instancia de SQL Server, esto es, ejecutar sqlservr.exe -m desde símbolo de comandos (previamente nos deberemos posicionar en el directorio correcto de la instancia, por ejemplo, D:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Binn).
  • Conectar con SQL Server a través de una conexión DAC (Dedicated Administrator Connection). Esto es posible a través de la utilidad sqlcmd.exe (ej: sqlcmd -A en caso de tratarse de la instancia por defecto y de autenticación integrada). En caso de tratarse de una instancia de SQL Express, hay que tener en cuenta que en SQL Express no están habilitadas las conexiones DAC. Para habilitar las conexiones DAC en SQL Express, es necesario iniciar la instancia de SQL Express con el trace flag -T7806, por lo cual, si queremos también iniciar la instancia en modo de usuario único (single user) deberemos utilizar los parámetros -T7806 y -m.

Ahora, SI podemos actualizar las tablas del catálogo del sistema en SQL Server 2005, incluso alterar algún procedimiento almacenado del sistema (u otros objetos del sistema). Sin embargo, aún no podemos alterar todos los objetos del sistema. Esto es debido a que en SQL Server 2005 existe una base de datos del sistema oculta, denominada MSSQLSystemResource, que juega un papel muy importante en SQL Server 2005. De hecho, si exploramos el contenido de los directorios en los que tenemos las bases de datos del sistema de nuestra instancia (principalmente la ubicación de MASTER), podremos encontrar de forma adicional los ficheros MSSQLSystemResource.mdf y MSSQLSystemResource.ldf (es decir, existe físicamente, aunque no podamos verla en sysdatabases). La base de datos MSSQLSystemResource es una base de datos de sólo lectura que contiene todos los objetos del sistema de SQL Server 2005. De este modo, podemos realizar lo siguiente:

  • Parar la instancia de SQL Server.
  • Realizar una copia de los ficheros MSSQLSystemResource.mdf y MSSQLSystemResource.ldf.
  • Arrancar la instancia de SQL Server.
  • Adjuntar la copia de los ficheros de MSSQLSystemResource a través del procedimiento almacenado del sistema sp_attach_db. Si intentamos realizar esta tarea con SQL Server Management Studio, podemos encontrarnos con el siguiente error: You cannot perform this operation for the resource database (Microsoft SQL Server, Error: 4616).
  • Modificar los objetos del sistema que necesitemos alterar desde la base de datos que acabamos de adjuntar.
  • Separar la base de datos recién adjuntada a través del procedimiento almacenado del sistema sp_detach_db.
  • Parar la instancia de SQL Server.
  • Sobrescribir los ficheros MSSQLSystemResource.mdf y MSSQLSystemResource.ldf con los correspondientes de la base de datos que acabamos de modificar.
  • Arrancar la instancia de SQL Server.

Por si surge la duda, he seguido estos pasos al pié de la letra, y he conseguido tanto alterar el contenido de tablas del sistema, como alterar procedimientos almacenados del sistema ocultos en MSSQLSystemResource, en ambos casos con éxito.

Me resultó curioso, que al alterar el contenido de una tabla del sistema (ejecutando una sentencia UPDATE directamente sobre ella), se muestre el siguiente mensaje:

Warning: System table ID 42 has been updated directly in database ID 1 and cache coherence may not have been maintained. SQL Server should be restarted.

El caso, es que funciona correctamente, resultando una puerta trasera excelente para determinadas tareas administrativas, eso sí, sólo en caso de emergencia y a poder ser consensuado con el personal de Soporte de Microsoft.

Por supuesto, en SQL Server 2005 también está disponible el procedimiento almacenado del sistema sp_MS_marksystemobject.

En cualquier caso, antes de acabar, recordar que NO está recomendado modificar directamente los objetos del sistema, teniendo en cuenta que esta acción puede implicar la pérdida del Soporte de producto por parte de Microsoft. En caso de encontrarlo necesario, consultar con el personal de Soporte de Microsoft, o bien, en caso de hacer este tipo de acciones se deberán realizar bajo el riesgo de cada uno.

Volver a: [SQL Server FAQ :: Preguntas y Respuestas Frecuentes de SQL Server :: Manual SQL Server]



Comentarios

diegosevilla - 01/02/2012 (UTC)
Has hablado sobre modificacion a objetos como tablas y SP del sistema de ser necesarios, pero si el caso es un poco diferente por ejemplo: tengo alrededor de 50 SP que usan un parametro @cod_parameter(5) y ahora es necesario subir su escala a (10). Es posible modificar los valores de la tabla "sysparameters" en su campo "max_length" y los 50 SP se actualizaran en su estructura, o existe otro mecanismo para realizar esta tarea?.

Saludos

Diego



Miembros de
Miembros de GITCA (Global IT Community Association)

Menu de Usuario
  Iniciar Sesión
  Registrarse
  Restablecer Contraseña
  Ventajas de Registrarse

Acerca de
  Contigo desde Oct 2007
  771 usuarios registrados
  86146 pageloads/mes
  Ranking Alexa 498160

Social Networks
Sigue a Portal GuilleSQL en Linkedin !!
Sigue a Portal GuilleSQL en Twitter !!



Archivo

Marzo de 2019 (1)
Octubre de 2018 (1)
Julio de 2018 (1)
Junio de 2018 (4)
Mayo de 2018 (5)
Abril de 2018 (3)
Marzo de 2018 (2)
Febrero de 2018 (7)
Enero de 2018 (1)
Diciembre de 2017 (15)
Noviembre de 2017 (7)
Junio de 2017 (3)
Mayo de 2017 (1)
Marzo de 2017 (3)
Enero de 2017 (4)
Junio de 2016 (1)
Mayo de 2016 (2)
Abril de 2016 (2)
Septiembre de 2015 (2)
Agosto de 2015 (2)
Junio de 2015 (10)
Mayo de 2015 (4)
Abril de 2015 (8)
Marzo de 2015 (11)
Octubre de 2014 (3)
Septiembre de 2014 (7)
Agosto de 2014 (5)
Julio de 2014 (2)
Mayo de 2014 (4)
Abril de 2014 (4)
Marzo de 2014 (4)
Febrero de 2014 (1)
Enero de 2014 (5)
Diciembre de 2013 (8)
Noviembre de 2013 (2)
Octubre de 2013 (7)
Septiembre de 2013 (6)
Agosto de 2013 (1)
Julio de 2013 (6)
Junio de 2013 (11)
Mayo de 2013 (7)
Abril de 2013 (6)
Febrero de 2013 (5)
Enero de 2013 (7)
Diciembre de 2012 (12)
Noviembre de 2012 (13)
Octubre de 2012 (5)
Septiembre de 2012 (3)
Agosto de 2012 (6)
Julio de 2012 (4)
Junio de 2012 (1)
Mayo de 2012 (2)
Abril de 2012 (7)
Marzo de 2012 (16)
Febrero de 2012 (9)
Enero de 2012 (5)
Diciembre de 2011 (10)
Noviembre de 2011 (10)
Octubre de 2011 (4)
Septiembre de 2011 (5)
Agosto de 2011 (2)
Julio de 2011 (2)
Junio de 2011 (4)
Mayo de 2011 (2)
Abril de 2011 (6)
Marzo de 2011 (4)
Febrero de 2011 (10)
Enero de 2011 (5)
Diciembre de 2010 (6)
Noviembre de 2010 (4)
Octubre de 2010 (8)
Septiembre de 2010 (4)
Agosto de 2010 (1)
Julio de 2010 (3)
Mayo de 2010 (5)
Abril de 2010 (6)
Marzo de 2010 (8)
Febrero de 2010 (3)
Enero de 2010 (1)
Diciembre de 2009 (9)
Noviembre de 2009 (14)
Octubre de 2009 (2)
Septiembre de 2009 (8)
Agosto de 2009 (2)
Julio de 2009 (10)
Junio de 2009 (9)
Mayo de 2009 (10)
Abril de 2009 (9)
Marzo de 2009 (3)
Febrero de 2009 (2)
Enero de 2009 (3)
Noviembre de 2008 (2)
Octubre de 2008 (2)
Septiembre de 2008 (2)
Agosto de 2008 (5)
Julio de 2008 (5)
Junio de 2008 (1)
Mayo de 2008 (3)
Abril de 2008 (2)
Marzo de 2008 (2)
Febrero de 2008 (2)
Enero de 2008 (5)
Noviembre de 2007 (2)
Octubre de 2007 (2)






Copyright © 2007 GuilleSQL, todos los derechos reservados.