É incrível a rapidez com que alguns recursos podem se tornar obsoletos no mundo do software.
Este artigo apresenta dois métodos para ver se os recursos preteridos estão sendo usados em uma instância do SQL Server.
Método 1 – sys.dm_os_performance_counters
Talvez a maneira mais rápida de fazer isso seja usar os
sys.dm_os_performance_counters
visão de gerenciamento dinâmico do sistema. Entre as muitas coisas que você pode fazer com essa exibição, é obter uma lista de recursos obsoletos, juntamente com quantas vezes eles foram usados desde o início do SQL Server. Aqui está um exemplo retirado do meu artigo A maneira mais rápida de encontrar recursos obsoletos ainda sendo usados em uma instância do SQL Server:
SELECT RTRIM(instance_name) 'Feature', cntr_value 'Usage Count' FROM sys.dm_os_performance_counters WHERE object_name = 'SQLServer:Deprecated Features' AND cntr_value > 0;
Resultado:
+-----------------------------------+---------------+ | Feature | Usage Count | |-----------------------------------+---------------| | String literals as column aliases | 1 | | TIMESTAMP | 1 | | numbered_procedures | 1 | | sysdatabases | 3 | | sp_db_vardecimal_storage_format | 1 | | XP_API | 2 | +-----------------------------------+---------------+
Neste exemplo, retorno apenas as linhas em que o
object_name
coluna tem um valor de SQLServer:Deprecated Features
, e o cntr_value
o valor da coluna é maior que zero. Você pode remover o
cntr_value
coluna desta consulta para retornar todos os recursos obsoletos, incluindo aqueles que não foram usados. Método 2 – Use eventos estendidos
Outra maneira de fazer isso é usar eventos estendidos. Este é um método mais abrangente e você pode usá-lo para criar um arquivo de log que contém todas as instâncias de uso do recurso obsoleto, juntamente com a instrução SQL usada que contém o recurso obsoleto, quem o executou, o banco de dados em que foi executado etc. . Abaixo está um exemplo.
Crie o evento:
CREATE EVENT SESSION [Deprecation Events] ON SERVER ADD EVENT sqlserver.deprecation_announcement( ACTION( sqlserver.database_name, sqlserver.sql_text, sqlserver.username ) ), ADD EVENT sqlserver.deprecation_final_support( ACTION( sqlserver.database_name, sqlserver.sql_text, sqlserver.username ) ) ADD TARGET package0.event_file( SET filename=N'/var/opt/mssql/tmp/DeprecationEvents.xel' ) WITH ( TRACK_CAUSALITY = ON );
Inicie o evento:
ALTER EVENT SESSION [Deprecation Events] ON SERVER STATE = START;
Execute algum código obsoleto:
SELECT * FROM sys.sql_dependencies;
Leia o registro:
SELECT EventXml.value('(@timestamp)[1]', 'datetime2') AS [timestamp], EventXml.value('(action[@name="username"]/value)[1]', 'nvarchar(256)') AS username, EventXml.value('(action[@name="database_name"]/value)[1]', 'nvarchar(128)') AS database_name, EventXml.value('(action[@name="sql_text"]/value)[1]', 'varchar(4000)') AS sql_text, EventXml.value('(@name)[1]', 'varchar(50)') AS event_name, EventXml.value('(data[@name="feature"]/value)[1]', 'varchar(255)') AS feature, EventXml.value('(data[@name="message"]/value)[1]', 'varchar(max)') AS message FROM (SELECT CAST(event_data AS XML) AS XmlEventData FROM sys.fn_xe_file_target_read_file ( '/var/opt/mssql/tmp/DeprecationEvents*.xel', null, null, null )) AS EventTable CROSS APPLY EventTable.XmlEventData.nodes('event') AS q(EventXml);
Resultado (usando saída vertical):
timestamp | 2019-10-31 04:03:06.5280000 username | sa database_name | Test sql_text | SELECT * FROM sys.sql_dependencies; event_name | deprecation_announcement feature | sql_dependencies message | sql_dependencies will be removed in a future version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it.
Para obter uma discussão mais detalhada sobre esse método, consulte Usando eventos estendidos para registrar recursos obsoletos sendo usados em uma instância do SQL Server. Esse artigo inclui o mesmo exemplo, mas com um pouco mais de detalhes.