sql >> Database >  >> RDS >> Sqlserver

Uitgebreide gebeurtenissen gebruiken om verouderde functies vast te leggen die worden gebruikt in een SQL Server-instantie (T-SQL-voorbeeld)

Uitgebreide evenementen is een lichtgewicht prestatiebewakingssysteem waarmee gebruikers gegevens kunnen verzamelen die nodig zijn om problemen in SQL Server te bewaken en op te lossen.

Dit artikel laat zien hoe uitgebreide gebeurtenissen kunnen worden gebruikt om een ​​logboekbestand te maken dat alle verouderde functies bevat die nog worden gebruikt in een exemplaar van SQL Server. Het logboek registreert alle gebeurtenissen sinds de gebeurtenissessie is gestart.

Als u snel wilt weten hoe vaak een verouderde functie is gebruikt sinds het opstarten van SQL Server, raadpleegt u Snelste manier om verouderde functies te vinden die nog steeds worden gebruikt in een SQL Server-instantie.

Maar als je een meer gedetailleerd logboek nodig hebt met dingen als; de gebruikte SQL-instructie die de verouderde functie bevat, de database waartegen deze is uitgevoerd, de gebruiker die deze heeft uitgevoerd, het tijdstip waarop deze is uitgevoerd, enzovoort, lees verder.

Maak de uitgebreide gebeurtenissessie

De eerste stap is het maken van de uitgebreide evenementsessie. Hier specificeren we de bron van de gebeurtenissen, het doel van de gebeurtenissessie en de opties voor de gebeurtenissessie.

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
    );

In dit geval specificeer ik een doel van /var/opt/mssql/tmp/DeprecationEvents.xel . Dit betekent dat de gebeurtenisgegevens in dat bestand worden opgeslagen. U kunt elke bestandsnaam en elk pad opgeven.

In dit voorbeeld wordt een Linux-bestandspad gebruikt dat voorwaartse slashes gebruikt. Als u Windows gebruikt, moet u backslashes gebruiken. Bijvoorbeeld:C:\Temp\DeprecationEvents.xel .

Start de uitgebreide evenementsessie

Door de gebeurtenissessie te maken, wordt deze niet gestart. Gebruik ALTER EVENT SESSION om te stoppen en te starten. In dit geval willen we het starten:

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

Doe iets dat verouderd is

Nu we de uitgebreide evenementsessie zijn begonnen, laten we wat verouderde code uitvoeren:

SELECT * FROM sys.sql_dependencies;

Omdat sys.sql_dependencies verouderd is, voegt die code gegevens toe aan het XEL-bestand dat we eerder hebben gespecificeerd.

Bekijk het XEL-bestand

Nu we (vermoedelijk) gegevens aan ons XEL-bestand hebben toegevoegd, gaan we er eens naar kijken:

SELECT event_data 
FROM sys.fn_xe_file_target_read_file (
    '/var/opt/mssql/tmp/DeprecationEvents*.xel', 
    null, 
    null, 
    null
    );  

Resultaat:

<event name="deprecation_announcement" package="sqlserver" timestamp="2019-10-31T04:03:06.528Z"><data name="feature_id"><value>198</value></data><data name="feature"><value><![CDATA[sql_dependencies]]></value></data><data name="message"><value><![CDATA[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.]]></value></data><action name="username" package="sqlserver"><value><![CDATA[sa]]></value></action><action name="sql_text" package="sqlserver"><value><![CDATA[SELECT * FROM sys.sql_dependencies;]]></value></action><action name="database_name" package="sqlserver"><value><![CDATA[Test]]></value></action><action name="attach_activity_id_xfer" package="package0"><value>5566866F-8266-467A-9950-895310CF21E3-0</value></action><action name="attach_activity_id" package="package0"><value>07971CB0-F9CC-46C6-B885-5BA8A904B880-1</value></action>

In dit geval heb ik alleen event_data . geretourneerd , want daar staan ​​alle gebeurtenisgegevens.

Helaas is het voor ons mensen niet de gemakkelijkste om te lezen.

Wat als ik het formatteer?

<event name="deprecation_announcement" package="sqlserver" timestamp="2019-10-31T04:03:06.528Z">
   <data name="feature_id">
      <value>198</value>
   </data>
   <data name="feature">
      <value><![CDATA[sql_dependencies]]></value>
   </data>
   <data name="message">
      <value><![CDATA[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.]]></value>
   </data>
   <action name="username" package="sqlserver">
      <value><![CDATA[sa]]></value>
   </action>
   <action name="sql_text" package="sqlserver">
      <value><![CDATA[SELECT * FROM sys.sql_dependencies;]]></value>
   </action>
   <action name="database_name" package="sqlserver">
      <value><![CDATA[Test]]></value>
   </action>
   <action name="attach_activity_id_xfer" package="package0">
      <value>5566866F-8266-467A-9950-895310CF21E3-0</value>
   </action>
   <action name="attach_activity_id" package="package0">
      <value>07971CB0-F9CC-46C6-B885-5BA8A904B880-1</value>
   </action>
</event>

Het is iets gemakkelijker te lezen wanneer het is opgemaakt, maar we kunnen beter dan dat.

Het XEL-bestand ontleden

In dit voorbeeld parseer ik het XEL-bestand zodat ik de gegevens in een raster kan zien, net als elke andere databasequery.

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);

Resultaat (met verticale uitvoer):

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.

Ik gebruik hier verticale uitvoer om het lezen gemakkelijker te maken zonder horizontaal te hoeven scrollen. Dit betekent dat de kolomkoppen aan de linkerkant staan ​​en de gegevens aan de rechterkant. Als u dit uitvoert met een GUI zoals SSMS of Azure Data Studio, ziet u het waarschijnlijk in het gebruikelijke tabelrasterformaat (tenzij u anders hebt aangegeven).

Meerdere rijen voor een enkele verouderde functie?

Uw XEL-bestand kan soms meerdere vermeldingen krijgen voor een enkele gebeurtenis. U voert bijvoorbeeld een enkele verouderde opgeslagen procedure één keer uit, om te ontdekken dat er voor die ene instructie 10 of 11 rijen worden geretourneerd uit uw XEL-bestand.

Hier is een voorbeeld:

USE Music;
EXEC sp_depends @objname = 'Artists';

De sp_depends systeem opgeslagen procedure is verouderd, dus ik zou daar zeker een rij voor verwachten. Als ik dat nu uitvoer, verwacht ik in totaal 2 rijen:1 voor het vorige voorbeeld en 1 voor dit voorbeeld.

Maar het blijkt dat er nog 11 rijen aan mijn XEL-bestand zijn toegevoegd:

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)
ORDER BY [Timestamp] ASC;

Resultaat (met verticale uitvoer):

-[ RECORD 1 ]-------------------------
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.
-[ RECORD 2 ]-------------------------
timestamp     | 2019-10-31 04:15:13.9920000
username      | sa
database_name | Music
sql_text      | USE Music;
EXEC sp_depends @objname = 'Artists';
event_name    | deprecation_announcement
feature       | sp_depends
message       | sp_depends 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.
-[ RECORD 3 ]-------------------------
timestamp     | 2019-10-31 04:15:13.9940000
username      | sa
database_name | Music
sql_text      | USE Music;
EXEC sp_depends @objname = 'Artists';
event_name    | deprecation_final_support
feature       | String literals as column aliases
message       | The ability to use string literals as column aliases will be removed in a future version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that 
-[ RECORD 4 ]-------------------------
timestamp     | 2019-10-31 04:15:13.9950000
username      | sa
database_name | Music
sql_text      | USE Music;
EXEC sp_depends @objname = 'Artists';
event_name    | deprecation_final_support
feature       | String literals as column aliases
message       | The ability to use string literals as column aliases will be removed in a future version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that 
-[ RECORD 5 ]-------------------------
timestamp     | 2019-10-31 04:15:13.9950000
username      | sa
database_name | Music
sql_text      | USE Music;
EXEC sp_depends @objname = 'Artists';
event_name    | deprecation_final_support
feature       | String literals as column aliases
message       | The ability to use string literals as column aliases will be removed in a future version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that 
-[ RECORD 6 ]-------------------------
timestamp     | 2019-10-31 04:15:14.0020000
username      | sa
database_name | Music
sql_text      | USE Music;
EXEC sp_depends @objname = 'Artists';
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.
-[ RECORD 7 ]-------------------------
timestamp     | 2019-10-31 04:15:14.0100000
username      | sa
database_name | Music
sql_text      | USE Music;
EXEC sp_depends @objname = 'Artists';
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.
-[ RECORD 8 ]-------------------------
timestamp     | 2019-10-31 04:15:14.0100000
username      | sa
database_name | Music
sql_text      | USE Music;
EXEC sp_depends @objname = 'Artists';
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.
-[ RECORD 9 ]-------------------------
timestamp     | 2019-10-31 04:15:14.0120000
username      | sa
database_name | Music
sql_text      | USE Music;
EXEC sp_depends @objname = 'Artists';
event_name    | deprecation_final_support
feature       | sysdepends
message       | sysdepends will be removed in the next version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it.
-[ RECORD 10 ]-------------------------
timestamp     | 2019-10-31 04:15:14.0260000
username      | sa
database_name | Music
sql_text      | USE Music;
EXEC sp_depends @objname = 'Artists';
event_name    | deprecation_final_support
feature       | sysdepends
message       | sysdepends will be removed in the next version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it.
-[ RECORD 11 ]-------------------------
timestamp     | 2019-10-31 04:15:14.0760000
username      | sa
database_name | Music
sql_text      | USE Music;
EXEC sp_depends @objname = 'Artists';
event_name    | deprecation_final_support
feature       | sysdepends
message       | sysdepends will be removed in the next version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it.
-[ RECORD 12 ]-------------------------
timestamp     | 2019-10-31 04:15:14.0800000
username      | sa
database_name | Music
sql_text      | USE Music;
EXEC sp_depends @objname = 'Artists';
event_name    | deprecation_final_support
feature       | sysdepends
message       | sysdepends will be removed in the next version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it.
(12 rows affected)

Wat is hier aan de hand?

Dit gebeurt omdat de sp_depends door het systeem opgeslagen procedure zelf gebruikt verouderde functies.

Ik krijg niet alleen 1 rij voor het uitvoeren van sp_depends . Ik krijg ook 1 rij voor elke verouderde functie die door die opgeslagen procedure wordt gebruikt (of het nu in de opgeslagen procedure is of in een ander object waarnaar het verwijst). In dit geval krijg ik 10 extra rijen.

Ik heb even gekeken naar sp_depends 's definitie, en ik zag dat het verwijst naar (de verouderde) sysdepends op verschillende plaatsen, en die referenties (de verouderde) sql_dependencies bekijken . Ik zag ook dat het letterlijke tekenreeksen gebruikt als kolomaliassen, een praktijk die ook is gemarkeerd voor afschaffing. Dat ondersteunt allemaal wat ik in het XEL-bestand zie.

Meer details over elke verouderde functie

Zie Microsoft's artikel Verouderde Database Engine-functies in SQL Server 2017 voor aanbevelingen over hoe om te gaan met elk verouderd item. Die lijst is precies dezelfde als die voor SQL Server 2016.

Microsoft-documentatiereferentie

  • Snelstart:uitgebreide gebeurtenissen in SQL Server
  • CREER EVENEMENTSESSIE
  • ALTER EVENT SESSIE
  • sys.fn_xe_file_target_read_file
  • Eventgegevens lezen 101:hoe zit het met de XML?

  1. Welke effecten heeft het gebruik van een binaire sortering?

  2. Prestaties van tabelvariabelen in SQL Server

  3. PostgreSQL-planeet in Ansible Galaxy

  4. PostgreSQL samengestelde primaire sleutel