Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

2 Möglichkeiten, um festzustellen, ob veraltete Funktionen noch in einer SQL Server-Instanz verwendet werden

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.