Текст запроса с помощью подсистемы расширенных событий Microsoft SQL





В будущем функция sys.fn_trace_gettable будет удалена из Microsoft SQL: http://msdn.microsoft.com/ru-ru/library/ms188425.aspx
Потому предлагаю вашему вниманию способ получения запроса T-SQL с помощью подсистемы расширенных событий

При написания обработки использовались:

1. типовая консоль запросов с диска ИТС

2. статьи по подсистеме расширенных событий: http://msdn.microsoft.com/ru-ru/library/bb630282.aspx

 

Некоторые функции по работе с сеансом расширенных событий

Результаты выводятся:

на закладке «Консоль запросов». В нижней части формы имеется панель со следующими страницами:

— «Результат«, «Сводная таблица» — вывод результата запроса (функционал типовой консоли)

на закладке «Запрос SQL»

—  «Запрос SQL без псевдонимов» — текст запроса на T-SQL, полученный с помощью подсистемы расширенных событий

— «Запрос SQL с псевдонимами» — в тексте запроса на T-SQL заменены некоторые псевдонимы на «близкие глазу» одинэсника Smile Хотя, есть и более значимые причины для этого. Иногда приходится программисту, пишущему на T-SQL, показывать запросы из 1С, преобразованные в T-SQL. Увы, псевдонимы теряются.

— «Результат SQL без псевдонимов«,  «Результат SQL с псевдонимами» — в разработке (выполнение SQL запроса из 1С и вывод результата в 1С без необходимости использовать SQL Server Management Studio — в разработке)

—  «Кольцевой буфер» — информационная страница, показывающая данные, собранные сеансом расширенных событий (с учетом ограничений, с которыми сеанс был создан).

 

Обработка вполне функциональная (хотя еще дописывается), в связи с чем хочу сразу предупредить о некоторых минусах:

1. не полностью переводятся в T-SQL пакетные запросы (в будущем будут)

2. изменяются только некоторые псевдонимы (основное направление развития — именно псевдонимы)

3. перед преобразованием запроса (нажатием на кнопку «SQL») текст запроса на 1С должен быть ОБЯЗАТЕЛЬНО отформатирован с помощью конструктора запроса

 

Некотрые использованные механизмы:

1. регулярные выражения

2. внедрение «маркера» в текст запроса 1С

 

Некоторые алгоритмы работы с сеансами расширенных событий:

Подготовка текстов SQL запросов:

Функция СоздатьИмяСеанса() Экспорт

Возврат СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");

КонецФункции

// http://msdn.microsoft.com/ru-ru/library/bb677289%28v=sql.100%29.aspx
Функция Текст_СозданиеСеанса() Экспорт

Текст =
"CREATE EVENT SESSION ИмяСеанса ON SERVER
|ADD EVENT sqlserver.rpc_completed(SET collect_statement=(1)
| WHERE ([sqlserver].[database_name]=N'ИмяБД')),
|ADD EVENT sqlserver.sql_statement_starting(SET collect_statement=(1)
|   ACTION(package0.callstack,sqlserver.client_app_name,sqlserver.client_connection_id,sqlserver.client_hostname,sqlserver.client_pid)
| WHERE ([sqlserver].[database_name]=N'ИмяБД'))
|ADD TARGET package0.ring_buffer";

Текст = СтрЗаменить(Текст, "ИмяСеанса", ИмяСеанса);
Текст = СтрЗаменить(Текст, "ИмяБД",  ИмяБД);

Возврат Текст;

КонецФункции

// http://msdn.microsoft.com/ru-ru/library/bb630257%28v=sql.100%29.aspx
Функция Текст_УдалениеСеанса() Экспорт

Возврат "DROP EVENT SESSION " + ИмяСеанса + " ON SERVER";

КонецФункции

// http://msdn.microsoft.com/ru-ru/library/bb630368%28v=sql.100%29.aspx
Функция Текст_ЗапускСеанса() Экспорт

Возврат "ALTER EVENT SESSION " + ИмяСеанса + " ON SERVER  STATE = START";

КонецФункции

Функция Текст_ОстановкаСеанса() Экспорт

Возврат "ALTER EVENT SESSION " + ИмяСеанса + " ON SERVER  STATE = STOP";

КонецФункции

// http://msdn.microsoft.com/ru-ru/library/ff878182.aspx
Функция Текст_ПросмотрЦелевогоВывода() Экспорт

Текст =
"SELECT --*** данный запрос получает текст кольцевого буфера ***--
| name,
| target_name,
| CAST(xet.target_data AS xml) AS Данные
|FROM
| sys.dm_xe_session_targets AS xet
|JOIN sys.dm_xe_sessions AS xe ON (xe.address = xet.event_session_address)
|WHERE
| xe.name = 'ИмяСеанса'";

Возврат СтрЗаменить(Текст, "ИмяСеанса", ИмяСеанса);

КонецФункции

 Пример вызова функции:

//удалим созданный сеанс
Если УдалятьСеанс Тогда
УдалениеСеанса = Текст_УдалениеСеанса();
Попытка
ADOТаблица = Соединение.Execute(УдалениеСеанса);
Исключение
Сообщить("Не получилось удалить сеанс" + ИмяСеанса, СтатусСообщения.Важное);
Возврат;
КонецПопытки;
Иначе
//остановим сеанс (на всякий случай)
ОстановкаСеанса = Текст_ОстановкаСеанса();
Попытка
ADOТаблица = Соединение.Execute(ОстановкаСеанса);
Исключение
Сообщить("Не получилось остановить сеанс " + ИмяСеанса, СтатусСообщения.Важное);
Возврат;
КонецПопытки;
КонецЕсли;

Полученные тексты запросов (с псевдонимами и без) протестированы в среде SQL Server Management Studio

28 Comments

  1. Famza

    (0) Любопытно

    Reply
  2. sergant500

    Картинка вместо обработки мешает полюбопытчинать тоже

    Reply
  3. nixel

    Спасибо за идею, покопаемся.

    Под УФ, случаем, нет?

    Будет время, попробую впилить в управляемую консоль…

    Reply
  4. HEKPOH

    Под УФ нет.

    И обработка эта — именно, как идея. Как свободное время появляется, пишу-переписываю-дописываю :).

    Reply
  5. m191

    Где обработка?

    Reply
  6. HEKPOH

    (2)(5) Извините, что-то я напутал с файлами:(

    Вечерком залью обработку (с последними изменениями)

    Reply
  7. HEKPOH

    Описание обновил, скрины и обработку перезалил.

    Еще раз, прошу прощения

    Reply
  8. nixel

    (7) не получилось покопаться =)

    Происходит что-то непонятное при попытке создания сеанса с предложением покурить (строка 907). Сервер доступен, имя базы корректное.

    В Соединение.Errors лежит данная табличка на 4 ошибки:

    Number Source Description HelpFile HelpContext SQLState NativeError
    -2147217900 «Microsoft OLE DB Provider for SQL Server» «Неправильный синтаксис около конструкции «066».» «» 0 «42000» 102
    -2147217900 «Microsoft OLE DB Provider for SQL Server» «Неправильный синтаксис около конструкции «EVENT».» «» 0 «42000» 102
    -2147217900 «Microsoft OLE DB Provider for SQL Server» «Неправильный синтаксис около конструкции «EVENT».» «» 0 «42000» 102
    -2147217900 «Microsoft OLE DB Provider for SQL Server» «Неправильный синтаксис около конструкции «TARGET».» «» 0 «42000» 102
    Reply
  9. HEKPOH

    nixel, привет.

    Попробуем разобраться. Проверь по пунктам:

    1. Уровень совместимости должен быть как на картинке или выше



    2. Проверь, что пишет профайлер

    3. Обнови драйвера OLE DB

    Reply
  10. HEKPOH

    Да, надеюсь название базы начинается не с цифры?

    Reply
  11. HEKPOH

    Может быть, дело в кавычках…

    Попробуй в запрос создания сеанса вставить SET QUOTED_IDENTIFIER OFF

    http://msdn.microsoft.com/ru-ru/library/ms174393.aspx

    Reply
  12. nixel

    (9)

    1) Совпадает.

    2) Я не силен в администрировании sql-сервера. Можно пошаговую инструкцию или хотя бы где найти профайлер и ссылку на краткую инструкцию по использованию? Предоставлю все, что потребуется =)

    3) Обновил. Результат тот же.

    Имя базы начинается с буквы, наименование содержит строчные и заглавные латинские буквы и символы _ (подчеркивание)

    Reply
  13. nixel

    (11) сейчас попробую.

    Reply
  14. nixel

    (11)

    не помогло.

    Заметил, что в первой строчке с ошибками текст постоянно меняется. Насколько я понял — это часть УИДа сеанса.

    Еще иногда (1 раз на 10-15 попыток) вываливается такая ошибка:

    Number Source Description HelpFile HelpContext SQLState NativeError
    -2147217900 «Microsoft OLE DB Provider for SQL Server» «Не удалось обнаружить объект атрибут событий или источник предиката, «sqlserver.database_name».» «» 0 «42000» 25 706

    но не думаю, что это основная проблема в данном случае.

    Reply
  15. HEKPOH

    скопируй сюда (из отладчика) текст запроса (модуль объекта, строка 58)

    Reply
  16. nixel

    (15)

    SET QUOTED_IDENTIFIER OFF;
    
    CREATE EVENT SESSION 8851d25ff3cd495da70b65b9f4257279 ON SERVER
    ADD EVENT sqlserver.rpc_completed(SET collect_statement=(1)
    WHERE ([sqlserver].[database_name]=N’grin_TOR_UV’)),
    ADD EVENT sqlserver.sql_statement_starting(SET collect_statement=(1)
    ACTION(package0.callstack,sqlserver.client_app_name,sqlserver.client_connection_id,sqlserver.client_hostname,sqlserver.client_pid)
    WHERE ([sqlserver].[database_name]=N’grin_TOR_UV’))
    ADD TARGET package0.ring_buffer

    Показать

    что с установкой флага QUOTED_IDENTIFIER, что без — результат и количество ошибок одинаковое.

    Reply
  17. m191

    у меня такая же фигня. 1) Ругается на GUID — добавил литерные символы спереди, стал ругаться так:

    Сообщение 25706, уровень 16, состояние 8, строка 1

    Не удалось обнаружить объект атрибут событий или источник предиката, «sqlserver.database_name».

    CREATE

    EVENT

    SESSION session500b58c2577048aba868a255bd2891e7

    ON SERVER

    ADD EVENT sqlserver.rpc_completed(SET collect_statement=(1)

    WHERE ([sqlserver].[database_name]=N’phis_im’)),

    ADD EVENT sqlserver.sql_statement_starting(SET collect_statement=(1)

    ACTION(package0.callstack,sqlserver.client_app_name,sqlserver.client_connection_id,sqlserver.client_hostname,sqlserver.client_pid)

    WHERE ([sqlserver].[database_name]=N’phis_im’))

    ADD TARGET package0.ring_buffer

    после вставки

    SET QUOTED_IDENTIFIER OFF

    НЕ ЗАРАБОТАЛО

    Reply
  18. HEKPOH

    (17) проверил в SQL Server Management Studio запрос из поста. Сеанс создается (естественно, имя базы заменил)

    Вероятно, не хватает прав 🙁

    У учетки, под которой коннектитесь, права sisadmin есть? Оно включает необходимое право CONTROL SERVER

    Reply
  19. HEKPOH

    m191, спасибо за слово «session» 🙂

    nixel, m191, измените, пожл, функцию СоздатьИмяСеанса()

    Возврат «ф» + СтрЗаменить(Строка(Новый УникальныйИдентификатор()), «-«, «»);
    Reply
  20. nixel

    (18)

    хм. у меня в обозревателе объектов нет ветви «Расширенные события». Это дополнительный компонент и его надо где-то включить?

    Ну и в дополнение, на какой версии сервера Вы проверяете? У меня 2008 r2.

    Reply
  21. HEKPOH

    (20) у меня 2012, но!

    у 2008 R2 с последним сервиспаком должны быть расширенные события

    Reply
  22. nixel

    Вооооот оно что. у меня первый сервис-пак. Что ж, буду трясти админа. спасибо!

    Reply
  23. HEKPOH

    (22) оч надеюсь на продолжение диалога по факту «тряски» админа 🙂

    Reply
  24. m191

    select @@VERSION

    Microsoft SQL Server 2008 R2 (RTM) — 10.50.1600.1 (X64) Apr 2 2010 15:48:46 Copyright © Microsoft Corporation Standard Edition (64-bit) on Windows NT 5.2 <X64> (Build 3790: Service Pack 2)

    Расширенных событий нет.

    Reply
  25. HEKPOH

    (24) Что ж тут сказать? 🙁

    http://www.microsoft.com/sqlserver/2008/ru/ru/test-drives.aspx

    Reply
  26. nixel

    (24) m191, (25) последний сервис-пак на 2008 скуль — третий, не?

    Reply
  27. HEKPOH

    (26) не в курсе. у меня 2008 стоял без расширенных. как про них прочитал, 2012 поставил

    Reply
  28. nixel

    (23) задача, так сказать, поставлена =)

    А там посмотрим. Если разродится, то обязательно напишу о результатах.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *