التعليمة البرمجية لهدف Ring Buffer للأحداث الموسَّعة في Azure SQL Database

ينطبق على: قاعدة بيانات Azure SQL

لعلك تريد نموذج تعليمة برمجية كاملة لتوفير أسهل طريقة سريعة لالتقاط المعلومات والإبلاغ عنها لحدث ممتد أثناء الاختبار. أسهل هدف لبيانات الأحداث الموسَّعة هو هدف Ring Buffer.

يقدم هذا الموضوع نموذج تعليمات برمجية لـ Transact-SQL:

  1. يُنشئ جدولاً بالبيانات للتوضيح باستخدامه.

  2. لإنشاء جلسة لحدث موسَّع موجود، وبالتحديد sqlserver.sql_statement_starting.

    • يقتصر الحدث على عبارات SQL التي تحتوي على سلسلة Update معينة:عبارة LIKE '%UPDATE tabEmployee%' .
    • يختار إرسال إخراج الحدث إلى هدف من النوع Ring Buffer، وهو package0.ring_buffer.
  3. يبدأ جلسة الحدث.

  4. يصدر بضع عبارات بسيطة لـ SQL UPDATE.

  5. يصدر عبارة SQL SELECT لاسترداد إخراج الحدث من Ring Buffer.

    • تم ضم sys.dm_xe_database_session_targets وعروض الإدارة الديناميكية الأخرى (DMVs).
  6. يوقف جلسة الحدث.

  7. يسقط الهدف Ring Buffer لتحرير موارده.

  8. يسقط جلسة الحدث والجدول التجريبي.

المتطلبات الأساسية

نموذج التعليمة البرمجية

مع تعديل طفيف للغاية، يمكن تشغيل نموذج التعليمة البرمجية Ring Buffer التالية على Azure SQL Database أو Microsoft SQL Server. يتمثل الاختلاف في وجود العقدة '_database' في اسم بعض طرق عرض الإدارة الديناميكية (DMVs)، المستخدمة في عبارة FROM في الخطوة 5. على سبيل المثال:

  • sys.dm_xe_database_session_targets
  • sys.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

 

محتويات Ring Buffer

استخدمنا ssms.exe لتشغيل نموذج التعليمة البرمجية.

لعرض النتائج، قمنا بالنقر فوق الخلية الموجودة أسفل رأس العمود target_data_XML.

ثم في جزء النتائج، نقرنا على الخلية الموجودة أسفل رأس العمود target_data_XML. أدى هذا النقر إلى إنشاء علامة تبويب ملف أخرى في ssms.exe حيث تم عرض محتوى خلية النتيجة، مثل XML.

يتم عرض الإخراج في الكتلة التالية. تبدو طويلة، لكنها مكونة من <عنصري> أحداث فقط.

 

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

تحرير الموارد التي يحتفظ بها Ring Buffer

عند الانتهاء من Ring Buffer الخاص بك، يمكنك إزالته وتحرير موارده بإصدار الأمر ALTERمثل ما يلي:

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

تم تحديث تعريف جلسة الحدث الخاص بك، ولكن لم يتم إسقاطه. يمكنك لاحقًا إضافة مثيل آخر من Ring Buffer إلى جلسة الحدث:

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

مزيد من المعلومات

الموضوع الأساسي للأحداث الموسَّعة في Azure SQL Database هو:

تتوفر موضوعات نماذج التعليمة البرمجية الأخرى للأحداث الموسَّعة على الارتباطات التالية. ومع ذلك، يجب عليك التحقق بشكل دوري من أي نموذج لمعرفة ما إذا كان النموذج يستهدف Microsoft SQL Server مقابل Azure SQL Database. ثم يمكنك أن تقرر ما إذا كانت هناك حاجة لإجراء تغييرات طفيفة لتشغيل العينة.