Ir al contenido principal

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

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 sistemapara mejorar su rendimiento.
En SQL Server 2000 es posible utilizar el procedimiento almacenado del sistema sp_configurepara 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 documentadosp_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 RECONFIGUREse 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ónallow 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.

Comentarios

Entradas populares de este blog

¿En qué puerto TCP escucha SQL Server 2005? ¿Cómo cambiar o configurar el puerto TCP de escucha de una Instancia de SQL Server 2005?

Una buena práctica inmediatamente después de instalar SQL Server 2005 es cambiar el Puerto TCP de escucha, por múltiples motivos: Seguridad, Configuración de reglas de acceso de Firewall, Aplicaciones cliente que requieren un puerto TCP estático para SQL Server, etc. En este Artículo se explica cómo averiguar en qué puerto TCP escucha SQL Server 2005, cómo cambiar el puerto TCP de escucha de SQL Server 2005, etc. Resulta de gran interés ser capaz de responder a la pregunta  ¿En qué puerto TCP escucha SQL Server?  Por defecto, una  Instancia por Defecto de SQL Server 2005  queda configurada durante la instalación para escuchar en el  puerto TCP-1433 , sin embargo,  las Instancias con Nombre  quedan configuradas durante el proceso de instalación para escuchar en  puertos TCP dinámicos , por lo tanto, cada vez que se inicie la Instancia puede que escuche en un puerto diferente. Esta situación puede resultar problemática, por un lado desde el punto de vista de la seguridad (el hecho d

¿Qué es el nivel de aislamiento (Isolation Level) de una Transacción? ¿Qué niveles de aislamiento ofrece SQL Server?

Esta capítulo explica qué es el nivel de aislamiento (isolation level) de una transacción, el comportamiento de SQL Server en operaciones de lectura o de escritura, se detallan los diferentes niveles de aislamiento basados en bloqueos (READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE) y los niveles de aislamiento basados en versionado de filas (READ COMMITTED SNAPSHOT, SNAPSHOT), se explican los males de la concurrencia (lecturas sucias, lecturas no repetibles, lecturas fantasma, y conflictos de actualización), como establecer el nivel de aislamiento deseado (SET TRANSACTION ISOLATION LEVEL y las opciones de base de datos READ_COMMITTED_SNAPSHOT y ALLOW_SNAPSHOT_ISOLATION), cómo conecer el tiempo máximo de bloqueo (@@LOCK_TIMEOUT) y como establecer el tiempo máximo de bloqueo (SET LOCK_TIMEOUT), etc. El nivel de aislamiento de una transacción (transaction isolation level)  define el grado en que se aísla una transacción de las modificaciones de recursos o datos rea

Aumentar y Reducir la TempDB en SQL Server?

Una buena práctica después de instalar SQL Server (y que interesa revisar periódicamente) es tener bien dimensionada la base de datos TEMPDB, es decir que el  tamaño inicial de TEMPDB  sea suficiente, y en consecuencia no sea necesario que TEMPDB crezca ni tampoco reducir TEMPDB (SHRINK). Esta artículo explica brevemente  para qué sirve TEMPDB , explica camo cambiar el tamaño inicial de TEMPDB (aumentar o reducir),  cómo reducir TEMPDB , cuántos ficheros son recomendables para TEMPDB, etc. ¿Para qué sirve TEMPDB?  La base de datos TEMPDB es un elemento de gran importancia en una Instancia de SQL Server, ya que  TEMPDB es la encargada de almacenar tanto los objetos temporales  (tablas temporales, procedimientos almacenados temporales, etc.),  como los resultados intermedios  que pueda necesitar crear el motor de base de datos, por ejemplo durante la ejecución de consultas que utilizan las cláusulas GROUP BY, ORDER BY, DISTINCT, etc. (es decir, las tablas temporales o WorkTables que