Il est étonnant de voir à quelle vitesse certaines fonctionnalités peuvent devenir obsolètes dans le monde des logiciels.
Cet article présente deux méthodes pour voir si des fonctionnalités obsolètes sont utilisées dans une instance SQL Server.
Méthode 1 - sys.dm_os_performance_counters
Le moyen le plus rapide de le faire est peut-être d'utiliser le sys.dm_os_performance_counters
vue de gestion dynamique du système. Parmi les nombreuses choses que vous pouvez faire avec cette vue, vous pouvez obtenir une liste des fonctionnalités obsolètes, ainsi que le nombre de fois qu'elles ont été utilisées depuis le démarrage de SQL Server.
Voici un exemple tiré de mon article Le moyen le plus rapide de trouver des fonctionnalités obsolètes encore utilisées dans une instance 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;
Résultat :
+-----------------------------------+---------------+ | 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 | +-----------------------------------+---------------+
Dans cet exemple, je renvoie uniquement les lignes où le object_name
la colonne a une valeur de SQLServer:Deprecated Features
, et la cntr_value
la valeur de la colonne est supérieure à zéro.
Vous pouvez supprimer le cntr_value
colonne de cette requête pour renvoyer toutes les fonctionnalités obsolètes, y compris celles qui n'ont pas été utilisées.
Méthode 2 – Utiliser des événements étendus
Une autre façon de procéder consiste à utiliser des événements étendus. Il s'agit d'une méthode plus complète, et vous pouvez l'utiliser pour créer un fichier journal qui contient toutes les instances d'utilisation des fonctionnalités obsolètes, ainsi que l'instruction SQL utilisée qui contient la fonctionnalité obsolète, qui l'a exécutée, la base de données sur laquelle elle a été exécutée, etc. . Ci-dessous un exemple.
Créez l'événement :
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 );
Démarrer l'événement :
ALTER EVENT SESSION [Deprecation Events] ON SERVER STATE = START;
Exécutez du code obsolète :
SELECT * FROM sys.sql_dependencies;
Lire le journal :
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);
Résultat (en utilisant la sortie 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.
Pour une discussion plus détaillée sur cette méthode, consultez Utilisation d'événements étendus pour consigner les fonctionnalités obsolètes utilisées dans une instance SQL Server. Cet article inclut le même exemple, mais avec un peu plus de détails.