Fala pessoal!
Um assunto que não costumo ver muito no dia a dia é a preocupação de DBA’s e desenvolvedores sobre o uso de recursos marcados como “deprecated” pela Microsoft, ou seja, estão marcados para serem removidos em alguma futura versão do SQL Server de acordo com o roadmap da Microsoft.
Embora possamos observar que alguns recursos estão desde a versão 2000 marcados como deprecated e ainda estão presentes na versão 2017, é muito perigoso manter sistemas, rotinas e principalmente, criar novos desenvolvimentos utilizando recursos que podem ser removidos, “quebrar” seu sistema e te pegar de surpresa durante alguma atualização de versão.
A ideia desse post é demonstrar como você pode identificar recursos que estão marcados para desativação e tomar as medidas adequadas para alterar seu código, de modo que sejam utilizadas as boas práticas de desenvolvimento ao estar sempre alinhados com as mais recentes funcionalidades do produto.
Para atender a essa demanda, vou utilizar o recurso de Extended Events (XE) e os eventos “Deprecation Announcement” e “Deprecation Final Support”:
- Deprecation Announcement: Esse evento é acionado quando é identificado um recurso que foi anunciado como “deprecated”, ou seja, será desativado em uma futura versão do SQL Server, mas não será na próxima versão.
- Deprecation Final Support: Esse evento é acionado quando é identificado um recurso que foi anunciado como “deprecated” e será SIM, desativado já na próxima versão do SQL Server. Esses são os casos mais preocupantes a curto prazo, pois esses recursos vão parar de funcionar assim que você atualizar o SQL Server
Se você já acompanha meu blog há algum tempo, deve lembrar de outros posts que já fiz sobre Extended Events:
– SQL Server – Como criar um monitoramento de erros e exceções no seu banco de dados utilizando Extended Events (XE)
– SQL Server – Como gerar um histórico de deadlocks para análise de falhas em rotinas
Para isso identificar quais são esses recursos que você utiliza no seu ambiente, vamos criar uma nova sessão utilizando XE
Escolhi não utilizar nenhum template e escolhi os 2 eventos já citados, conforme o print
Nesta tela você pode escolher algumas colunas que gostaria de coletar informações
Nesta etapa da configuração, você deve definir onde o arquivo de resultados será gravado, se será gravado como arquivo físico no disco e definindo o tamanho máximo que ele irá atingir ou utilizando o ring_buffer, para ter sempre as informações mais recentes (uso recomendado para gravação contínua).
Segue o resumo das configurações que utilizei para a criação desse Extended Event.
Segue abaixo, o código-fonte do script gerado:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
-- 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 |
Seguem exemplos utilizados para testar o recurso:
1 2 3 4 5 6 7 8 |
SELECT * FROM sys.sysdatabases SELECT * FROM sys.syscolumns SELECT @@remserver DBCC SHOWCONTIG sp_lock SET FMTONLY ON SET FMTONLY OFF SELECT * FROM sys.traces |
E agora, vou utilizar esse script para coletar os dados gravados:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
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) |
Caso vocês queiram conhecer todos os recursos que estão marcados como deprecated, acessem esse artigo aqui e em caso de migração para nova versão do SQL Server, não deixe de utilizar essa dica junto com o Data Migration Assistant (DMA).
É isso aí, pessoal!
Espero que tenham gostado desse post e até a próxima.
Forte abraço!