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