Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

2 modi per verificare se le funzionalità deprecate vengono ancora utilizzate in un'istanza di SQL Server

È incredibile quanto velocemente alcune funzionalità possano diventare obsolete nel mondo del software.

Questo articolo presenta due metodi per verificare se le funzionalità deprecate vengono utilizzate in un'istanza di SQL Server.

Metodo 1 – sys.dm_os_performance_counters

Forse il modo più rapido per farlo è utilizzare sys.dm_os_performance_counters vista della gestione dinamica del sistema. Tra le molte cose che puoi fare con questa visualizzazione, c'è un elenco di funzionalità deprecate, insieme a quante volte sono state utilizzate dall'avvio di SQL Server.

Ecco un esempio tratto dal mio articolo Il modo più rapido per trovare funzionalità obsolete ancora utilizzate in un'istanza di 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;

Risultato:

+-----------------------------------+---------------+
| 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             |
+-----------------------------------+---------------+

In questo esempio, restituisco solo quelle righe in cui object_name la colonna ha un valore di SQLServer:Deprecated Features e il cntr_value il valore della colonna è maggiore di zero.

Puoi rimuovere il cntr_value colonna di questa query per restituire tutte le funzionalità obsolete, comprese quelle che non sono state utilizzate.

Metodo 2:utilizzare eventi estesi

Un altro modo per farlo è utilizzare gli eventi estesi. Questo è un metodo più completo ed è possibile utilizzarlo per creare un file di registro che contiene tutte le istanze di utilizzo delle funzionalità deprecate, insieme all'istruzione SQL utilizzata che contiene la funzionalità deprecata, chi l'ha eseguita, il database su cui è stata eseguita, ecc. . Di seguito è riportato un esempio.

Crea l'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
    );

Avvia l'evento:

ALTER EVENT SESSION [Deprecation Events] ON SERVER STATE = START;

Esegui del codice deprecato:

SELECT * FROM sys.sql_dependencies;

Leggi il 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);

Risultato (usando l'output verticale):

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.

Per una discussione più dettagliata su questo metodo, vedere Utilizzo di eventi estesi per registrare funzionalità obsolete utilizzate in un'istanza di SQL Server. Quell'articolo include lo stesso esempio, ma con un po' più di dettagli.