Es ist erstaunlich, wie schnell einige Funktionen in der Welt der Software veraltet sein können.
Dieser Artikel stellt zwei Methoden vor, um festzustellen, ob veraltete Funktionen in einer SQL Server-Instanz verwendet werden.
Methode 1 – sys.dm_os_performance_counters
Der vielleicht schnellste Weg, dies zu tun, ist die Verwendung von sys.dm_os_performance_counters
systemdynamische Verwaltungsansicht. Zu den vielen Dingen, die Sie mit dieser Ansicht machen können, gehört eine Liste der veralteten Funktionen zusammen mit der Angabe, wie oft sie seit dem Start von SQL Server verwendet wurden.
Hier ist ein Beispiel aus meinem Artikel Quickest Way to Find Deprecated Features Still Being Used in a SQL Server Instance:
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;
Ergebnis:
+-----------------------------------+---------------+ | 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 diesem Beispiel gebe ich nur die Zeilen zurück, in denen object_name
Spalte hat den Wert SQLServer:Deprecated Features
, und der cntr_value
Der Wert der Spalte ist größer als Null.
Sie könnten den cntr_value
entfernen Spalte aus dieser Abfrage, um alle veralteten Funktionen zurückzugeben, einschließlich derer, die nicht verwendet wurden.
Methode 2 – Verwenden Sie erweiterte Ereignisse
Eine andere Möglichkeit besteht darin, erweiterte Ereignisse zu verwenden. Dies ist eine umfassendere Methode, und Sie können sie verwenden, um eine Protokolldatei zu erstellen, die alle Instanzen der Verwendung veralteter Funktionen enthält, zusammen mit der verwendeten SQL-Anweisung, die die veraltete Funktion enthält, wer sie ausgeführt hat, die Datenbank, für die sie ausgeführt wurde usw . Unten ist ein Beispiel.
Erstellen Sie das Ereignis:
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 );
Veranstaltung starten:
ALTER EVENT SESSION [Deprecation Events] ON SERVER STATE = START;
Führen Sie veralteten Code aus:
SELECT * FROM sys.sql_dependencies;
Lesen Sie das Protokoll:
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);
Ergebnis (bei vertikaler Ausgabe):
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.
Eine ausführlichere Erläuterung dieser Methode finden Sie unter Verwenden von erweiterten Ereignissen zum Protokollieren veralteter Funktionen, die in einer SQL Server-Instanz verwendet werden. Dieser Artikel enthält dasselbe Beispiel, jedoch mit etwas mehr Details.