¡Hola, chicos!

Un tema que no suelo ver mucho en el día a día es la preocupación de DBA's y desarrolladores por el uso de recursos marcados como “obsoletos” por Microsoft, es decir, están marcados para ser eliminados en alguna versión futura de SQL Server según la hoja de ruta de Microsoft.

Aunque podemos ver que algunas características han sido marcadas como obsoletas desde la versión 2000 y siguen presentes en la versión 2017, es muy peligroso mantener sistemas, rutinas y, sobre todo, crear nuevos desarrollos utilizando características que se pueden eliminar, “rompiendo” tu sistema y tomándote por sorpresa durante una actualización de versión.

La idea de esta publicación es demostrar cómo puede identificar funciones que están marcadas para desactivación y tomar los pasos adecuados para cambiar su código, de modo que se utilicen buenas prácticas de desarrollo estando siempre alineado con las últimas funciones del producto.

Para satisfacer esta demanda, utilizaré la función Eventos extendidos (XE) y los eventos "Anuncio de obsolescencia" y "Soporte final de obsolescencia":

  • Anuncio de desuso: Este evento se desencadena cuando se identifica una característica que fue anunciada como “obsoleta”, es decir, se desactivará en una versión futura de SQL Server, pero no lo estará en la próxima versión.
  • Soporte final de desuso: Este evento se activa cuando se identifica una característica que se anunció como "obsoleta" y se desactivará en la próxima versión de SQL Server. Estos son los casos más preocupantes a corto plazo, ya que estas características dejarán de funcionar tan pronto como actualice SQL Server.

Si has estado siguiendo mi blog por un tiempo, quizás recuerdes otras publicaciones que escribí sobre eventos extendidos:
SQL Server: cómo crear monitoreo de errores y excepciones en su base de datos usando Extended Events (XE)
SQL Server: cómo generar un historial de interbloqueos para analizar fallas en las rutinas

Para identificar qué recursos utiliza en su entorno, creemos una nueva sesión usando XE

Elegí no utilizar ninguna plantilla y elegí los 2 eventos ya mencionados, como se muestra en la impresión.

En esta pantalla puede elegir algunas columnas sobre las que le gustaría recopilar información.

En este paso de configuración se debe definir dónde se escribirá el archivo de resultados, si se escribirá como un archivo físico en disco y definir el tamaño máximo que alcanzará o usar el ring_buffer, para tener siempre la información más reciente (uso recomendado para grabación continua).

A continuación se muestra un resumen de la configuración que utilicé para crear este evento extendido.

A continuación se muestra el código fuente del script generado:

-- Apaga a sessão, caso ela já exista
IF ((SELECT COUNT(*) FROM sys.dm_xe_sessions WHERE [name] = 'Funções Deprecated') > 0) DROP EVENT SESSION [Funções Deprecated] ON SERVER 
GO

CREATE EVENT SESSION [Funções Deprecated] ON SERVER 
ADD EVENT sqlserver.deprecation_announcement(
  ACTION(package0.callstack,package0.collect_system_time,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_name,sqlserver.is_system,sqlserver.nt_username,sqlserver.server_instance_name,sqlserver.server_principal_name,sqlserver.server_principal_sid,sqlserver.session_id,sqlserver.session_nt_username,sqlserver.session_server_principal_name,sqlserver.sql_text,sqlserver.tsql_stack,sqlserver.username)),
ADD EVENT sqlserver.deprecation_final_support(
    ACTION(package0.callstack,package0.collect_system_time,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_name,sqlserver.is_system,sqlserver.nt_username,sqlserver.server_instance_name,sqlserver.server_principal_name,sqlserver.server_principal_sid,sqlserver.session_id,sqlserver.session_nt_username,sqlserver.session_server_principal_name,sqlserver.sql_text,sqlserver.tsql_stack,sqlserver.username))
ADD TARGET package0.event_file(SET filename=N'C:\Traces\Funções Deprecated.xel')
WITH (STARTUP_STATE=ON)
GO

-- Ativando a sessão (por padrão, ela é criada desativada)
ALTER EVENT SESSION [Funções Deprecated] ON SERVER STATE = START
GO

A continuación se muestran ejemplos utilizados para probar la función:

SELECT * FROM sys.sysdatabases
SELECT * FROM sys.syscolumns
SELECT @@remserver
DBCC SHOWCONTIG
sp_lock
SET FMTONLY ON
SET FMTONLY OFF
SELECT * FROM sys.traces

Y ahora usaré este script para recopilar los datos grabados:

DECLARE @TimeZone INT = DATEDIFF(HOUR, GETUTCDATE(), GETDATE())

IF (OBJECT_ID('tempdb..#Eventos') IS NOT NULL) DROP TABLE #Eventos
;WITH CTE AS (
    SELECT CONVERT(XML, event_data) AS event_data
    FROM sys.fn_xe_file_target_read_file(N'C:\Traces\Funções Deprecated*.xel', NULL, NULL, NULL)
)
SELECT
    DATEADD(HOUR, @TimeZone, CTE.event_data.value('(//event/@timestamp)[1]', 'datetime')) AS Dt_Evento,
    CTE.event_data
INTO
    #Eventos
FROM
    CTE


SELECT
    A.Dt_Evento,
    xed.event_data.value('(//event/@name)[1]', 'varchar(100)') AS [event_name],
    xed.event_data.value('(//data[@name="feature_id"]/value)[1]', 'varchar(100)') AS [feature_id],
    xed.event_data.value('(//data[@name="feature"]/value)[1]', 'varchar(100)') AS [feature],
    xed.event_data.value('(action[@name="session_id"]/value)[1]', 'int') AS [session_id],
    xed.event_data.value('(action[@name="database_name"]/value)[1]', 'varchar(100)') AS [database_name],
    xed.event_data.value('(action[@name="session_nt_username"]/value)[1]', 'varchar(100)') AS [session_nt_username],
    xed.event_data.value('(action[@name="client_hostname"]/value)[1]', 'varchar(100)') AS [client_hostname],
    xed.event_data.value('(action[@name="client_app_name"]/value)[1]', 'varchar(100)') AS [client_app_name],
    TRY_CAST(xed.event_data.value('(action[@name="sql_text"]/value)[1]', 'varchar(max)') AS XML) AS [sql_text],
    xed.event_data.value('(data[@name="message"]/value)[1]', 'varchar(max)') AS [message]
FROM
    #Eventos A
    CROSS APPLY A.event_data.nodes('//event') AS xed (event_data)

Viendo los resultados:

Si desea conocer todos los recursos que están marcados como obsoletos, accede a este artículo aquí y en caso de migración a una nueva versión de SQL Server, asegúrese de utilizar este consejo junto con el Asistente de migración de datos (DMA).

¡Eso es todo, amigos!

Espero que hayas disfrutado de esta publicación y nos vemos la próxima.
¡Gran abrazo!