Codice di destinazione del buffer circolare per gli eventi estesi nel database SQLRing Buffer target code for extended events in SQL Database

Si desidera un esempio di codice completo per il modo più semplice e rapido per acquisire e segnalare informazioni per un evento esteso durante un test.You want a complete code sample for the easiest quick way to capture and report information for an extended event during a test. La destinazione più semplice per i dati degli eventi estesi è la destinazione del buffer circolare.The easiest target for extended event data is the Ring Buffer target.

In questo argomento viene presentato un esempio di codice Transact-SQL che:This topic presents a Transact-SQL code sample that:

  1. Crea una tabella con i dati a scopo dimostrativo.Creates a table with data to demonstrate with.
  2. Crea una sessione per un evento esteso esistente, ovvero sqlserver.sql_statement_starting.Creates a session for an existing extended event, namely sqlserver.sql_statement_starting.

    • L'evento è limitato a istruzioni SQL che contengono una determinata stringa di aggiornamento: statement LIKE '%UPDATE tabEmployee%'.The event is limited to SQL statements that contain a particular Update string: statement LIKE '%UPDATE tabEmployee%'.
    • Sceglie di inviare l'output dell'evento a una destinazione di tipo buffer circolare, ovvero package0.ring_buffer.Chooses to send the output of the event to a target of type Ring Buffer, namely package0.ring_buffer.
  3. Avvia la sessione dell'evento.Starts the event session.
  4. Esegue un paio di semplici istruzioni SQL UPDATE.Issues a couple of simple SQL UPDATE statements.
  5. Esegue un'istruzione SQL SELECT per recuperare l'output dell'evento dal buffer circolare.Issues a SQL SELECT statement to retrieve event output from the Ring Buffer.

    • sys.dm_xe_database_session_targets e altre viste a gestione dinamica (DMV) sono unite.sys.dm_xe_database_session_targets and other dynamic management views (DMVs) are joined.
  6. Arresta la sessione dell'evento.Stops the event session.
  7. Elimina la destinazione del buffer circolare, per rilasciare le relative risorse.Drops the Ring Buffer target, to release its resources.
  8. Elimina la sessione dell'evento e la tabella dimostrativa.Drops the event session and the demo table.

PrerequisitiPrerequisites

Esempio di codiceCode sample

Con alcune lievi modifiche, è possibile eseguire il seguente esempio di codice di buffer circolare nel database SQL di Azure o in Microsoft SQL Server.With very minor modification, the following Ring Buffer code sample can be run on either Azure SQL Database or Microsoft SQL Server. La differenza è la presenza del nodo '_database' nel nome di alcune viste a gestione dinamica (DMV) nella clausola FROM nel passaggio 5.The difference is the presence of the node '_database' in the name of some dynamic management views (DMVs), used in the FROM clause in Step 5. ad esempio:For example:

  • sys.dm_xe_database_session_targetssys.dm_xe_database_session_targets
  • sys.dm_xe_session_targetssys.dm_xe_session_targets

 

GO
----  Transact-SQL.
---- Step set 1.

SET NOCOUNT ON;
GO


IF EXISTS
    (SELECT * FROM sys.objects
        WHERE type = 'U' and name = 'tabEmployee')
BEGIN
    DROP TABLE tabEmployee;
END
GO


CREATE TABLE tabEmployee
(
    EmployeeGuid         uniqueIdentifier   not null  default newid()  primary key,
    EmployeeId           int                not null  identity(1,1),
    EmployeeKudosCount   int                not null  default 0,
    EmployeeDescr        nvarchar(256)          null
);
GO


INSERT INTO tabEmployee ( EmployeeDescr )
    VALUES ( 'Jane Doe' );
GO

---- Step set 2.


IF EXISTS
    (SELECT * from sys.database_event_sessions
        WHERE name = 'eventsession_gm_azuresqldb51')
BEGIN
    DROP EVENT SESSION eventsession_gm_azuresqldb51
        ON DATABASE;
END
GO


CREATE
    EVENT SESSION eventsession_gm_azuresqldb51
    ON DATABASE
    ADD EVENT
        sqlserver.sql_statement_starting
            (
            ACTION (sqlserver.sql_text)
            WHERE statement LIKE '%UPDATE tabEmployee%'
            )
    ADD TARGET
        package0.ring_buffer
            (SET
                max_memory = 500   -- Units of KB.
            );
GO

---- Step set 3.


ALTER EVENT SESSION eventsession_gm_azuresqldb51
    ON DATABASE
    STATE = START;
GO

---- Step set 4.


SELECT 'BEFORE_Updates', EmployeeKudosCount, * FROM tabEmployee;

UPDATE tabEmployee
    SET EmployeeKudosCount = EmployeeKudosCount + 102;

UPDATE tabEmployee
    SET EmployeeKudosCount = EmployeeKudosCount + 1015;

SELECT 'AFTER__Updates', EmployeeKudosCount, * FROM tabEmployee;
GO

---- Step set 5.


SELECT
    se.name                      AS [session-name],
    ev.event_name,
    ac.action_name,
    st.target_name,
    se.session_source,
    st.target_data,
    CAST(st.target_data AS XML)  AS [target_data_XML]
FROM
               sys.dm_xe_database_session_event_actions  AS ac

    INNER JOIN sys.dm_xe_database_session_events         AS ev  ON ev.event_name = ac.event_name
        AND CAST(ev.event_session_address AS BINARY(8)) = CAST(ac.event_session_address AS BINARY(8))

    INNER JOIN sys.dm_xe_database_session_object_columns AS oc
         ON CAST(oc.event_session_address AS BINARY(8)) = CAST(ac.event_session_address AS BINARY(8))

    INNER JOIN sys.dm_xe_database_session_targets        AS st
         ON CAST(st.event_session_address AS BINARY(8)) = CAST(ac.event_session_address AS BINARY(8))

    INNER JOIN sys.dm_xe_database_sessions               AS se
         ON CAST(ac.event_session_address AS BINARY(8)) = CAST(se.address AS BINARY(8))
WHERE
        oc.column_name = 'occurrence_number'
    AND
        se.name        = 'eventsession_gm_azuresqldb51'
    AND
        ac.action_name = 'sql_text'
ORDER BY
    se.name,
    ev.event_name,
    ac.action_name,
    st.target_name,
    se.session_source
;
GO

---- Step set 6.


ALTER EVENT SESSION eventsession_gm_azuresqldb51
    ON DATABASE
    STATE = STOP;
GO

---- Step set 7.


ALTER EVENT SESSION eventsession_gm_azuresqldb51
    ON DATABASE
    DROP TARGET package0.ring_buffer;
GO

---- Step set 8.


DROP EVENT SESSION eventsession_gm_azuresqldb51
    ON DATABASE;
GO

DROP TABLE tabEmployee;
GO

 

Contenuto del buffer circolareRing Buffer contents

È stato usato ssms.exe per eseguire l'esempio di codice.We used ssms.exe to run the code sample.

Per visualizzare i risultati, è stato fatto clic sulla cella sotto l'intestazione di colonna target_data_XML.To view the results, we clicked the cell under the column header target_data_XML.

Quindi, nel riquadro dei risultati, è stato fatto clic sulla cella sotto l'intestazione di colonna target_data_XML.Then in the results pane we clicked the cell under the column header target_data_XML. Tramite questo clic del mouse è stata creata un'altra scheda del file in ssms.exe, in cui è stato visualizzato il contenuto della cella del risultato, come XML.This click created another file tab in ssms.exe in which the content of the result cell was displayed, as XML.

L'output è illustrato nella sezione seguente.The output is shown in the following block. Sembra lungo, ma è composto solo da due elementi .It looks long, but it is just two elements.

 

<RingBufferTarget truncated="0" processingTime="0" totalEventsProcessed="2" eventCount="2" droppedCount="0" memoryUsed="1728">
  <event name="sql_statement_starting" package="sqlserver" timestamp="2015-09-22T15:29:31.317Z">
    <data name="state">
      <type name="statement_starting_state" package="sqlserver" />
      <value>0</value>
      <text>Normal</text>
    </data>
    <data name="line_number">
      <type name="int32" package="package0" />
      <value>7</value>
    </data>
    <data name="offset">
      <type name="int32" package="package0" />
      <value>184</value>
    </data>
    <data name="offset_end">
      <type name="int32" package="package0" />
      <value>328</value>
    </data>
    <data name="statement">
      <type name="unicode_string" package="package0" />
      <value>UPDATE tabEmployee
    SET EmployeeKudosCount = EmployeeKudosCount + 102</value>
    </data>
    <action name="sql_text" package="sqlserver">
      <type name="unicode_string" package="package0" />
      <value>
---- Step set 4.


SELECT 'BEFORE_Updates', EmployeeKudosCount, * FROM tabEmployee;

UPDATE tabEmployee
    SET EmployeeKudosCount = EmployeeKudosCount + 102;

UPDATE tabEmployee
    SET EmployeeKudosCount = EmployeeKudosCount + 1015;

SELECT 'AFTER__Updates', EmployeeKudosCount, * FROM tabEmployee;
</value>
    </action>
  </event>
  <event name="sql_statement_starting" package="sqlserver" timestamp="2015-09-22T15:29:31.327Z">
    <data name="state">
      <type name="statement_starting_state" package="sqlserver" />
      <value>0</value>
      <text>Normal</text>
    </data>
    <data name="line_number">
      <type name="int32" package="package0" />
      <value>10</value>
    </data>
    <data name="offset">
      <type name="int32" package="package0" />
      <value>340</value>
    </data>
    <data name="offset_end">
      <type name="int32" package="package0" />
      <value>486</value>
    </data>
    <data name="statement">
      <type name="unicode_string" package="package0" />
      <value>UPDATE tabEmployee
    SET EmployeeKudosCount = EmployeeKudosCount + 1015</value>
    </data>
    <action name="sql_text" package="sqlserver">
      <type name="unicode_string" package="package0" />
      <value>
---- Step set 4.


SELECT 'BEFORE_Updates', EmployeeKudosCount, * FROM tabEmployee;

UPDATE tabEmployee
    SET EmployeeKudosCount = EmployeeKudosCount + 102;

UPDATE tabEmployee
    SET EmployeeKudosCount = EmployeeKudosCount + 1015;

SELECT 'AFTER__Updates', EmployeeKudosCount, * FROM tabEmployee;
</value>
    </action>
  </event>
</RingBufferTarget>

Rilasciare le risorse usate dal buffer circolareRelease resources held by your Ring Buffer

Al termine dell'uso del buffer circolare, è possibile rimuoverlo e rilasciare le relative risorse eseguendo un'istruzione ALTER simile alla seguente:When you are done with your Ring Buffer, you can remove it and release its resources issuing an ALTER like the following:

ALTER EVENT SESSION eventsession_gm_azuresqldb51
    ON DATABASE
    DROP TARGET package0.ring_buffer;
GO

La definizione della sessione dell'evento viene aggiornata, ma non eliminata.The definition of your event session is updated, but not dropped. Successivamente, è possibile aggiungere un'altra istanza del buffer circolare alla sessione dell'evento:Later you can add another instance of the Ring Buffer to your event session:

ALTER EVENT SESSION eventsession_gm_azuresqldb51
    ON DATABASE
    ADD TARGET
        package0.ring_buffer
            (SET
                max_memory = 500   -- Units of KB.
            );

Altre informazioniMore information

L'argomento principale per gli eventi estesi in un database SQL di Azure è:The primary topic for extended events on Azure SQL Database is:

Altri argomenti con esempi di codice per gli eventi estesi sono disponibili ai collegamenti seguenti.Other code sample topics for extended events are available at the following links. È comunque necessario controllare regolarmente qualsiasi esempio per verificare se è destinato a Microsoft SQL Server o al database SQL di Azure.However, you must routinely check any sample to see whether the sample targets Microsoft SQL Server versus Azure SQL Database. È quindi possibile decidere se sono necessarie alcune modifiche per eseguire l'esempio.Then you can decide whether minor changes are needed to run the sample.