Det är häpnadsväckande hur snabbt vissa funktioner kan utfasas i mjukvaruvärlden.
Den här artikeln presenterar två metoder för att se om föråldrade funktioner används i en SQL Server-instans.
Metod 1 – sys.dm_os_performance_counters
Det kanske snabbaste sättet att göra det är att använda sys.dm_os_performance_counters
system dynamisk förvaltningsvy. Bland de många saker du kan göra med den här vyn är att få en lista över föråldrade funktioner, tillsammans med hur många gånger de har använts sedan SQL Server startade.
Här är ett exempel från min artikel Snabbaste sättet att hitta föråldrade funktioner som fortfarande används i en SQL Server-instans:
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;
Resultat:
+-----------------------------------+---------------+ | 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 | +-----------------------------------+---------------+
I det här exemplet returnerar jag bara de rader där object_name
kolumnen har värdet SQLServer:Deprecated Features
, och cntr_value
kolumns värde är större än noll.
Du kan ta bort cntr_value
kolumnen från den här frågan för att returnera alla föråldrade funktioner, inklusive de som inte har använts.
Metod 2 – Använd utökade händelser
Ett annat sätt att göra det är att använda utökade evenemang. Detta är en mer omfattande metod, och du kan använda den för att skapa en loggfil som innehåller alla instanser av föråldrad funktionsanvändning, tillsammans med den använda SQL-satsen som innehåller den föråldrade funktionen, vem som körde den, databasen den kördes mot, etc. Nedan är ett exempel.
Skapa händelsen:
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 );
Starta eventet:
ALTER EVENT SESSION [Deprecation Events] ON SERVER STATE = START;
Kör någon föråldrad kod:
SELECT * FROM sys.sql_dependencies;
Läs loggen:
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);
Resultat (med vertikal utdata):
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.
För en mer detaljerad diskussion om denna metod, se Använda utökade händelser för att logga föråldrade funktioner som används i en SQL Server-instans. Den artikeln innehåller samma exempel, men med lite mer detaljer.