Capturando consultas executadas no SQL Server (Trace) com .NET via SMO

Como visto na semana passada, é possível utilizar o SQL Server Profiler para identificar as consultas que são executadas em uma instancia do SQL Server, além de outros dados, como o tempo de execução, quem esta executando e etc…

Mas seria possível automatizar este processo com SMO?

A resposta a esta pergunta é “Sim”, mas para um primeiro exemplo, veremos como criar e exibir Traces com o SMO, e na próxima semana veremos como automatizar o processo de criação de um Trace para Tuning (ótimo para quem vai utilizar o Database Engine Tuning Advisor) gerando um arquivo de trace compatível com o SQL Server Profiler.

Então vamos ao exemplo!

As DLLs responsáveis para a utilização das bibliotecas de trace são:
Microsoft.SqlServer.ConnectionInfo.dll
Microsoft.SqlServer.ConnectionInfoExtended.dll

Para este exemplo utilizei o Template Standard do SQL Server Profiler, mas é possível utilizar outros templates ou até mesmo criar novos templates pelo SQL Server Profiler.

E abaixo nosso código de utilização de trace:

using System;
using System.Threading;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Trace;

namespace DemoSmo
{
    static class DemoTrace1
    {
        private const string StandardFile =
            @"C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Profiler\Templates\Microsoft SQL Server\100\Standard.tdf";

        public static void Run()
        {
            var conn = new SqlConnectionInfo { ServerName = @".\SQLEXPRESS" };

            // Criando o objeto TraceServer
            var traceReader = new TraceServer();

            // Iniciando a leitura do trace a partir do template Standard do SQL Server Profiler
            traceReader.InitializeAsReader(conn, StandardFile);

            // Criando uma Thread para a leitura do trace
            var ts =
                new Thread(
                    () =>
                    {
                        while (traceReader.Read())
                        {
                            // Identificando o tipo de evento
                            var name = traceReader.GetValue(traceReader.GetOrdinal("EventClass"));

                            if (!name.Equals("SQL:BatchCompleted") && !name.Equals("RPC:Completed")) continue;

                            // Identificando o SPID que esta executando o comando
                            var spid = traceReader.GetValue(traceReader.GetOrdinal("SPID"));

                            // Identificando informações do que é executado
                            var query = traceReader.GetValue(traceReader.GetOrdinal("TextData"));

                            // .. duração da execução
                            var duration = traceReader.GetValue(traceReader.GetOrdinal("Duration"));

                            Console.WriteLine("--SPID: {0} | Duration: {1}", spid, duration);

                            Console.WriteLine();

                            Console.WriteLine(query);

                            Console.WriteLine();
                        }
                    });

            // Iniciando a Thread
            ts.Start();

            // Esperando 30 segundos
            Thread.Sleep(30000);

            // Fechando o trace de leitura
            traceReader.Close();

            // Fechando a Thread
            ts.Join();
        }
    }
}

E por fim, o resultado da execução deste código:

Desculpe para quem não “manja” de Thread no C#, mas não conheço maneira melhor de criar este exemplo sem Thread.

Abaixo o artigo do Slavik Krassovsky, que utilizei para entender o funcionamento dos objetos de Trace do SMO:
http://technet.microsoft.com/en-US/library/ms345134.aspx

2 pensamentos sobre “Capturando consultas executadas no SQL Server (Trace) com .NET via SMO

  1. Pingback: Capturando consultas executadas no SQL Server (Trace) com PowerShell via SMO « SQL From Hell.com

  2. Pingback: Trabalhando com SMO – Resumo « SQL From Hell.com

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s