sql >> Database teknologi >  >> RDS >> Sqlserver

2 måder at se, om forældede funktioner stadig bliver brugt i en SQL Server-instans

Det er utroligt, hvor hurtigt nogle funktioner kan blive forældet i softwareverdenen.

Denne artikel præsenterer to metoder til at se, om forældede funktioner bruges i en SQL Server-instans.

Metode 1 – sys.dm_os_performance_counters

Måske den hurtigste måde at gøre det på er at bruge sys.dm_os_performance_counters system dynamisk styringsvisning. Blandt de mange ting, du kan gøre med denne visning, er at få en liste over forældede funktioner, sammen med hvor mange gange de er blevet brugt, siden SQL Server startede.

Her er et eksempel taget fra min artikel Hurtigste måde at finde forældede funktioner, der stadig bliver brugt 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 dette eksempel returnerer jeg kun de rækker, hvor object_name kolonne har værdien SQLServer:Deprecated Features , og cntr_value kolonnens værdi er større end nul.

Du kan fjerne cntr_value kolonne fra denne forespørgsel for at returnere alle forældede funktioner, inklusive dem, der ikke er blevet brugt.

Metode 2 – Brug udvidede hændelser

En anden måde at gøre det på er at bruge udvidede begivenheder. Dette er en mere omfattende metode, og du kan bruge den til at oprette en logfil, der indeholder alle forekomster af forældet funktionsbrug sammen med den anvendte SQL-sætning, der indeholder den forældede funktion, hvem kørte den, databasen den blev kørt imod osv. Nedenfor er et eksempel.

Opret begivenheden:

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 begivenheden:

ALTER EVENT SESSION [Deprecation Events] ON SERVER STATE = START;

Kør noget forældet kode:

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 (ved hjælp af lodret output):

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.

For en mere detaljeret diskussion om denne metode, se Brug af udvidede hændelser til at logge forældede funktioner, der bruges i en SQL Server-instans. Denne artikel indeholder det samme eksempel, men med lidt flere detaljer.


  1. Sådan grupperes efter måned fra Dato-feltet ved hjælp af sql

  2. Sådan ÆNDRES flere kolonner på én gang i SQL Server

  3. Design af en database til et rekrutteringssystem

  4. MySQL Error 1170 (42000):BLOB/TEXT-kolonne brugt i nøglespecifikation uden en nøglelængde