Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

2 maneiras de ver se os recursos obsoletos ainda estão sendo usados ​​em uma instância do SQL Server


É 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.