Het is verbazingwekkend hoe snel sommige functies verouderd kunnen raken in de wereld van software.
Dit artikel presenteert twee methoden om te zien of verouderde functies worden gebruikt in een SQL Server-instantie.
Methode 1 – sys.dm_os_performance_counters
Misschien is de snelste manier om dit te doen de sys.dm_os_performance_counters
systeem dynamisch beheer bekijken. Een van de vele dingen die u met deze weergave kunt doen, is een lijst met verouderde functies krijgen, samen met hoe vaak ze zijn gebruikt sinds SQL Server is gestart.
Hier is een voorbeeld uit mijn artikel Snelste manier om verouderde functies te vinden die nog steeds worden gebruikt in een SQL Server-instantie:
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;
Resultaat:
+-----------------------------------+---------------+ | 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 dit voorbeeld retourneer ik alleen die rijen waar de object_name
kolom heeft een waarde van SQLServer:Deprecated Features
, en de cntr_value
de waarde van de kolom is groter dan nul.
Je zou de cntr_value
. kunnen verwijderen kolom van deze zoekopdracht om alle verouderde functies te retourneren, inclusief de functies die niet zijn gebruikt.
Methode 2 – Gebruik uitgebreide evenementen
Een andere manier om dit te doen, is door uitgebreide evenementen te gebruiken. Dit is een meer uitgebreide methode en u kunt het gebruiken om een logbestand te maken dat alle exemplaren van het gebruik van verouderde functies bevat, samen met de gebruikte SQL-instructie die de verouderde functie bevat, wie deze heeft uitgevoerd, de database waarop deze is uitgevoerd, enz. . Hieronder is een voorbeeld.
Maak het evenement:
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 );
Start het evenement:
ALTER EVENT SESSION [Deprecation Events] ON SERVER STATE = START;
Voer een verouderde code uit:
SELECT * FROM sys.sql_dependencies;
Lees het logboek:
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);
Resultaat (met verticale uitvoer):
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.
Zie Uitgebreide gebeurtenissen gebruiken om verouderde functies te registreren die worden gebruikt in een SQL Server-instantie voor een meer gedetailleerde bespreking van deze methode. Dat artikel bevat hetzelfde voorbeeld, maar met wat meer details.