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.