{"id":1559,"date":"2019-09-09T14:43:48","date_gmt":"2019-09-09T14:43:48","guid":{"rendered":"https:\/\/cloudsurfers.it\/2019\/09\/09\/tracciamento-delle-procedure-sql-tracing-stored-procedures\/"},"modified":"2019-09-09T14:43:48","modified_gmt":"2019-09-09T14:43:48","slug":"tracciamento-delle-procedure-sql-tracing-stored-procedures","status":"publish","type":"post","link":"https:\/\/cloudsurfers.it\/index.php\/tracciamento-delle-procedure-sql-tracing-stored-procedures\/","title":{"rendered":"Tracciamento delle procedure SQL (Tracing Stored Procedures)"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-1435 size-full\" src=\"https:\/\/cloudsurfers.it\/wp-content\/uploads\/2019\/04\/TracingStoredProcedures.png\" alt=\"\" width=\"1200\" height=\"400\" srcset=\"https:\/\/cloudsurfers.it\/wp-content\/uploads\/2019\/04\/TracingStoredProcedures.png 1200w, https:\/\/cloudsurfers.it\/wp-content\/uploads\/2019\/04\/TracingStoredProcedures-600x200.png 600w, https:\/\/cloudsurfers.it\/wp-content\/uploads\/2019\/04\/TracingStoredProcedures-300x100.png 300w, https:\/\/cloudsurfers.it\/wp-content\/uploads\/2019\/04\/TracingStoredProcedures-768x256.png 768w, https:\/\/cloudsurfers.it\/wp-content\/uploads\/2019\/04\/TracingStoredProcedures-1024x341.png 1024w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><\/p>\n<p>In questa guida verr\u00e0 mostrato come creare un processo di <em>trace<\/em> che monitori tutte le <em>Stored Procedure <\/em>invocate su una base dati <strong>Microsoft SQL Server<\/strong>, e le relative tecniche di estrazione e lettura delle informazioni di tracciamento ottenute.<\/p>\n<p>Il monitoraggio si suddivide in due fasi: una prima fase di scrittura in cui vengono salvate le informazioni man mano che la base dati viene interrogata, mentre la seconda fase riguarda la lettura delle informazioni raccolte.<\/p>\n<h2>Fase 1: Scrittura file di tracciamento<\/h2>\n<p>Il primo passaggio \u00e8 quello di creare la procedura di trace; eseguire lo script SQL riportato di seguito selezionando come target la base dati che si vuole monitorare.<br \/>\nValorizzare le due variabili <em>@tracefile<\/em> e <em>@database<\/em>:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nDECLARE @tracefile NVARCHAR(MAX) = N'&lt;trace file path&gt;'\r\nDECLARE @database NVARCHAR(MAX) = N'&lt;database name&gt;'\r\n\r\n-- Crea una coda\r\nDECLARE @rc INT\r\nDECLARE @TraceID INT\r\nDECLARE @maxfilesize BIGINT\r\nSET @maxfilesize = 10\r\n\r\nEXEC @rc = sp_trace_create @TraceID OUTPUT, 2, @tracefile, @maxfilesize, NULL \r\nIF (@rc != 0) GOTO error\r\n\r\n-- Settaggio eventi\r\nDECLARE @on BIT\r\nSET @on = 1\r\nEXEC sp_trace_setevent @TraceID, 43, 6, @on\r\nEXEC sp_trace_setevent @TraceID, 43, 8, @on\r\nEXEC sp_trace_setevent @TraceID, 43, 10, @on\r\nEXEC sp_trace_setevent @TraceID, 43, 11, @on\r\nEXEC sp_trace_setevent @TraceID, 43, 12, @on\r\nEXEC sp_trace_setevent @TraceID, 43, 14, @on\r\nEXEC sp_trace_setevent @TraceID, 43, 34, @on\r\nEXEC sp_trace_setevent @TraceID, 43, 35, @on\r\n\r\n-- Settaggio filtri\r\nDECLARE @intfilter INT\r\nDECLARE @bigintfilter BIGINT\r\n\r\nEXEC sp_trace_setfilter @TraceID, 35, 0, 6, @database\r\n\r\n-- Imposta lo stato del tracciamento a 1 per avviarlo\r\nEXEC sp_trace_setstatus @TraceID, 1\r\n\r\n-- Mostra l'identificativo del tracciamento per poterlo referenziare in futuro\r\nSELECT TraceID = @TraceID\r\nGOTO finish\r\n\r\nerror: \r\nSELECT ErrorCode = @rc\r\n\r\nfinish: \r\nGO\r\n<\/pre>\n<p><strong>&lt;trace file path&gt;<\/strong> = percorso assoluto in cui verr\u00e0 salvato il file di tracciamento (<em>file .trc<\/em>).<br \/>\n<strong>&lt;database name&gt;<\/strong> = database monitorato.<\/p>\n<p>Eseguendo quindi la procedura, il tracciamento sar\u00e0 attivo fino ad uno stop manuale.<\/p>\n<h2>Fase 2: Lettura file di tracciamento<\/h2>\n<p>Per interrogare il trace log file generato, \u00e8 possibile &#8220;parcheggiare&#8221; il contenuto del file all&#8217;interno di una tabella SQL<em>,<\/em> facilitandone l&#8217;analisi e le interrogazioni.<\/p>\n<p>Utilizzando quindi l&#8217;istruzione:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nDECLARE @tracefile NVARCHAR(MAX) = N'&lt;trace file path&gt;'\r\nSELECT * INTO trace_table\r\n\tFROM fn_trace_gettable(@tracefile, DEFAULT);\r\n<\/pre>\n<p>dove <em>@tracefile<\/em> identifica il percorso del file trace log file (<em>.trc<\/em>), esattamente come impostato nella fase 1. Viene cos\u00ec creata una nuova tabella chiamata <strong>trace_table<\/strong> che conterr\u00e0 tutte le informazioni del file di tracciamento.<\/p>\n<p>Successivamente \u00e8 possibile effettuare interrogazioni sulla nuova tabella per ottenere le informazioni volute.<\/p>\n<p><em>Esempio<\/em>: per ottenere l&#8217;elenco delle procedure invocate almeno una volta e relativo timestamp di ultima chiamata:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nSELECT x.ObjectName AS StoredProcedureName, MAX(x.StartTime) AS LastCall         \r\n    FROM trace_table x JOIN (\r\n\t\tSELECT p.ObjectName, MAX(StartTime) AS max_StartTime\r\n            FROM trace_table p\r\n\t\t\tGROUP BY p.ObjectName) y ON y.ObjectName = x.ObjectName \r\n\t\tAND y.max_StartTime = x.StartTime\r\n\tGROUP BY x.ObjectName, x.StartTime\r\n<\/pre>\n<h2>Comandi di supporto per la gestione delle procedure di trace<\/h2>\n<p>E&#8217; possibile utilizzare una serie di comandi SQL per gestire i tracciamenti attivi su Microsoft SQL Server. Ecco alcuni esempi:<\/p>\n<p><strong>Ottenere l&#8217;elenco dei trace<\/strong><\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nSELECT * FROM ::fn_trace_getinfo(default)\r\n<\/pre>\n<p><strong>Terminare uno specifico trace dato un identificativo<\/strong><\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nEXEC sp_trace_setstatus @traceid, 0\r\n<\/pre>\n<p><strong>Terminare ed eliminare uno specifico trace dato un identificativo<\/strong><\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nEXEC sp_trace_setstatus @traceid, 2\r\n<\/pre>\n<p>Altre informazioni \u00e8 possibile trovarle tramite la <a href=\"https:\/\/docs.microsoft.com\/en-us\/sql\/relational-databases\/sql-trace\/sql-trace?view=sql-server-2017\" target=\"_blank\" rel=\"noopener noreferrer\">documentazione ufficiale<\/a> SQL Trace Microsoft.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In questa guida verr\u00e0 mostrato come creare un processo di trace che monitori tutte le Stored Procedure invocate su una base dati Microsoft SQL Server, e le relative tecniche di estrazione e lettura delle informazioni di tracciamento ottenute.<\/p>\n<p>Il monitoraggio si suddivide in due fasi: una prima fase di scrittura in cui vengono salvate le informazioni man mano che la base dati viene interrogata, mentre la seconda fase riguarda la lettura delle informazioni raccolte.<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"wds_primary_category":0,"footnotes":""},"categories":[71,72],"tags":[73,75,74],"class_list":["post-1559","post","type-post","status-publish","format-standard","hentry","category-guides","category-sql-server-en","tag-sql-server-en","tag-stored-procedures-en","tag-tracing-en"],"_links":{"self":[{"href":"https:\/\/cloudsurfers.it\/index.php\/wp-json\/wp\/v2\/posts\/1559","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudsurfers.it\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudsurfers.it\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudsurfers.it\/index.php\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudsurfers.it\/index.php\/wp-json\/wp\/v2\/comments?post=1559"}],"version-history":[{"count":0,"href":"https:\/\/cloudsurfers.it\/index.php\/wp-json\/wp\/v2\/posts\/1559\/revisions"}],"wp:attachment":[{"href":"https:\/\/cloudsurfers.it\/index.php\/wp-json\/wp\/v2\/media?parent=1559"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudsurfers.it\/index.php\/wp-json\/wp\/v2\/categories?post=1559"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudsurfers.it\/index.php\/wp-json\/wp\/v2\/tags?post=1559"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}