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.