<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2italianfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>SQL Server &amp; Delphi</title><link>http://community.ugiss.org/blogs/sgovoni/default.aspx</link><description>Informations are one of the most valuable treasures of today&amp;#39;s society</description><dc:language>it</dc:language><generator>CommunityServer 2007 SP2 (Debug Build: 20611.960)</generator><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/SqlServerDelphi" type="application/rss+xml" /><feedburner:emailServiceId>SqlServerDelphi</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FSqlServerDelphi" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/SqlServerDelphi" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FSqlServerDelphi" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FSqlServerDelphi" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FSqlServerDelphi" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2FSqlServerDelphi" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://add.my.yahoo.com/content?lg=it&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2FSqlServerDelphi" src="http://eur.i1.yimg.com/eur.yimg.com/i/it/my/mioya1.gif">Subscribe with Mio Yahoo!</feedburner:feedFlare><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><title>[OT] Porretta Soul Festival 2009</title><link>http://feedproxy.google.com/~r/SqlServerDelphi/~3/75KqPn6veuQ/ot-porretta-soul-festival-2009.aspx</link><pubDate>Thu, 02 Jul 2009 21:47:00 GMT</pubDate><guid isPermaLink="false">696bf4df-f0eb-4942-9326-ff40615b13e5:6444</guid><dc:creator>sgovoni</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://community.ugiss.org/blogs/sgovoni/rsscomments.aspx?PostID=6444</wfw:commentRss><wfw:comment>http://community.ugiss.org/blogs/sgovoni/commentapi.aspx?PostID=6444</wfw:comment><comments>http://community.ugiss.org/blogs/sgovoni/archive/2009/07/02/ot-porretta-soul-festival-2009.aspx#comments</comments><description>&lt;p&gt;Vi piace la musica Soul ma non potete andare fino a Memphis &lt;img src="http://community.ugiss.org/emoticons/emotion-1.gif" alt="Smile" /&gt; per ascoltare le grandi icone della black music ?&lt;/p&gt;
&lt;p&gt;Vi segnalo la 22 nd edizione del Porretta Soul Festival che si svolgerà nella cittadina Bolognese dal 23 al 26 Luglio 2009. In particolare il ricavato del concerto di apertura, nella serata inaugurale, sarà devoluto a favore della &lt;a class="" href="http://www.hospiceseragnoli.it/" target="_blank"&gt;Fondazione Hospice&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a class="" href="http://community.ugiss.org/blogs/sgovoni/Immagini/SOUL_FESTIVAL_2009_Invito.png" target="_blank"&gt;Qui&lt;/a&gt; trovate i dettagli della serata inaugurale.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://community.ugiss.org/aggbug.aspx?PostID=6444" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SqlServerDelphi?a=75KqPn6veuQ:TySmG7GXswE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SqlServerDelphi?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SqlServerDelphi/~4/75KqPn6veuQ" height="1" width="1"/&gt;</description><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/Off+Topic/default.aspx">Off Topic</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/Fondazione+Hospice+MT.+Chiantore+Ser_26002300_224_3B00_gnoli/default.aspx">Fondazione Hospice MT. Chiantore Ser&amp;#224;gnoli</category><feedburner:origLink>http://community.ugiss.org/blogs/sgovoni/archive/2009/07/02/ot-porretta-soul-festival-2009.aspx</feedburner:origLink></item><item><title>User Auditing</title><link>http://feedproxy.google.com/~r/SqlServerDelphi/~3/L9cs1rSccTw/user-auditing.aspx</link><pubDate>Wed, 01 Jul 2009 21:56:00 GMT</pubDate><guid isPermaLink="false">696bf4df-f0eb-4942-9326-ff40615b13e5:6440</guid><dc:creator>sgovoni</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://community.ugiss.org/blogs/sgovoni/rsscomments.aspx?PostID=6440</wfw:commentRss><wfw:comment>http://community.ugiss.org/blogs/sgovoni/commentapi.aspx?PostID=6440</wfw:comment><comments>http://community.ugiss.org/blogs/sgovoni/archive/2009/07/01/user-auditing.aspx#comments</comments><description>&lt;p&gt;Abbiamo parlato dei meccanismi di auditing in questo articolo &lt;a class="" href="http://www.ugiss.org/Content/Article/Meccanismi-di-auditing.aspx" target="_blank"&gt;Meccanismi di Auditing&lt;/a&gt;&amp;nbsp;e nella sessione dedicata durante l’ultimo &lt;a class="" href="http://community.ugiss.org/files/folders/workshop-20090616/default.aspx" target="_blank"&gt;workshop UGISS a Torino&lt;/a&gt;. Riprendo l’argomento per rispondere ad una domanda che alcuni di voi mi hanno sottoposto durante l&amp;#39;evento.&lt;/p&gt;
&lt;p&gt;&amp;quot;&lt;em&gt;Come è possibile fare user auditing anche quando la gestione delle login (e degli utenti) risiede nell’applicazione e non nel database ?&lt;/em&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;Il caso tipico è rappresentato da un’applicazione WEB o Win32 che gestisce in autonomia i primi due livelli di sicurezza (autenticazione e autorizzazione) per l’accesso ai dati di un DB SQL Server. Al momento della connessione tutti gli utenti applicativi (autenticati e autorizzati) si presentano al database con la medesima login (ad esempio “ERPLogin”). In questa situazione, il database non conosce la *vera* identità dell’utente perché mascherata dalla login applicativa. Abbiamo tuttavia la necessità di conoscere chi fa che cosa e quando sul database applicativo.&lt;/p&gt;
&lt;p&gt;La soluzione più pulita sarebbe quella di creare, sul DB, una login/utente per ogni utente applicativo assegnando correttamente ruoli e diritti a livello di database, in questo modo *vera* identità dell’utente non verrebbe mascherata dalla login applicativa. In alcune situazioni però non è possibile (almeno nel breve periodo) spostare la gestione delle login (e degli utenti) dall’applicazione al database. Pensiamo ad esempio ad un software gestionale che implementa, lato applicativo, l’intera gestione degli utenti e dei relativi permessi di accesso alle funzioni.&lt;/p&gt;
&lt;p&gt;Una soluzione alternativa è rappresentata dall’implementazione di una tabella di associazione SIPD/utente applicativo. Subito dopo aver eseguito la connessione al database l’applicazione conoscerà sia lo SPID ovvero l’ID della sessione relativa al processo utente, che l’utente applicativo utilizzato per fare login. Queste due informazioni con l’aggiunta della data/ora di login potranno essere memorizzate (dall’applicazione stessa) nella tabella di associazione dbo.userforSPID. Di seguito i comandi T-SQL per il setup delle tabelle dbo.userforSPID e dbo.auditing. Nella tabella dbo.auditing, rispetto alla precedente versione, è stata aggiunta la colonna externaluser:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;use [AdventureWorks];&lt;br /&gt;go&lt;/p&gt;
&lt;p&gt;-- Drop table dbo.userforSPID if exists&lt;br /&gt;if (object_id(&amp;#39;userforSPID&amp;#39;) is not null)&lt;br /&gt;&amp;nbsp; drop table dbo.userforSPID;&lt;br /&gt;go&lt;/p&gt;
&lt;p&gt;-- Create table dbo.userforSPID&lt;br /&gt;-- Memorizza l&amp;#39;utente esterno (user name) associato ad un&lt;br /&gt;-- determinato SPID in un determinato momento&lt;br /&gt;create table dbo.userforSPID&lt;br /&gt;(id int identity(1, 1),&lt;br /&gt;&amp;nbsp;SPID int not null default @@SPID,&lt;br /&gt;&amp;nbsp;externaluser nvarchar(128) not null,&lt;br /&gt;&amp;nbsp;login_time datetime not null,&lt;br /&gt;&amp;nbsp;logout_time datetime default null&lt;br /&gt;&amp;nbsp;primary key(id)&lt;br /&gt;)&lt;br /&gt;go&lt;/p&gt;
&lt;p&gt;-- Drop table dbo.auditing if exists&lt;br /&gt;if (isnull(object_id(&amp;#39;auditing&amp;#39;), 0) &amp;gt; 0)&lt;br /&gt;&amp;nbsp; drop table [dbo].[auditing]&lt;br /&gt;go&lt;/p&gt;
&lt;p&gt;-- Create table dbo.auditing if exists&lt;br /&gt;create table [dbo].[auditing]&lt;br /&gt;(id int identity (1, 1) not null,&lt;br /&gt;&amp;nbsp;rowid int null,&lt;br /&gt;&amp;nbsp;eventclass int null,&lt;br /&gt;&amp;nbsp;textdata nvarchar(max) null,&lt;br /&gt;&amp;nbsp;databaseid int null,&lt;br /&gt;&amp;nbsp;ntusername nvarchar(128) null,&lt;br /&gt;&amp;nbsp;ntdomainname nvarchar(128) null,&lt;br /&gt;&amp;nbsp;hostname nvarchar(128) null,&lt;br /&gt;&amp;nbsp;clientprocessid int null,&lt;br /&gt;&amp;nbsp;applicationname nvarchar(128) null,&lt;br /&gt;&amp;nbsp;loginname nvarchar(128) null,&lt;br /&gt;&amp;nbsp;spid int null,&lt;br /&gt;&amp;nbsp;duration bigint null,&lt;br /&gt;&amp;nbsp;starttime datetime null,&lt;br /&gt;&amp;nbsp;objectid int null,&lt;br /&gt;&amp;nbsp;objectname nvarchar(128) null,&lt;br /&gt;&amp;nbsp;databasename nvarchar(128) null,&lt;br /&gt;&amp;nbsp;dbusername nvarchar(128) null,&lt;br /&gt;&amp;nbsp;login_time datetime null,&lt;br /&gt;&amp;nbsp;oldvalue nvarchar(128) null,&amp;nbsp; &lt;br /&gt;&amp;nbsp;newvalue nvarchar(128) null,&lt;br /&gt;&amp;nbsp;fieldname nvarchar(128) null,&lt;br /&gt;&amp;nbsp;&lt;strong&gt;externaluser&lt;/strong&gt; nvarchar(128) null&lt;br /&gt;)&amp;nbsp; &lt;br /&gt;on [primary]&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Sarà necessario implementare anche la tabella dbo.lastimport per registrare la data/ora dell’ultima importazione, dal file fisico (traccia SQL) alla tabella dbo.auditing.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;use [AdventureWorks];&lt;br /&gt;go&lt;/p&gt;
&lt;p&gt;-- Drop table dbo.lastimport if exists&lt;br /&gt;if (object_id(&amp;#39;lastimport&amp;#39;) is not null)&lt;br /&gt;&amp;nbsp; drop table dbo.lastimport;&lt;br /&gt;go&lt;/p&gt;
&lt;p&gt;-- Create table dbo.lastimport&lt;br /&gt;create table dbo.lastimport&lt;br /&gt;(id int identity(1, 1),&lt;br /&gt;&amp;nbsp;lastexecution datetime not null&lt;br /&gt;&amp;nbsp;primary key(id)&lt;br /&gt;)&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Subito dopo aver eseguito la connessione, l’applicazione potrà registrare l’associazione SPID/utente applicativo semplicemente con:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;-- Subito dopo la connessione al DB&lt;br /&gt;insert into dbo.userforSPID&lt;br /&gt;(&lt;br /&gt;&amp;nbsp; externaluser,&lt;br /&gt;&amp;nbsp; login_time&lt;br /&gt;)&lt;br /&gt;select&lt;br /&gt;&amp;nbsp; &amp;#39;ERPLogin&amp;#39;,&lt;br /&gt;&amp;nbsp; (select login_time from sys.sysprocesses where SPID=@@SPID);&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Dove “ERPLogin” rappresenta l’utente applicativo utilizzato per fare login; consultando la tabella di associazione si otterrà:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://community.ugiss.org/blogs/sgovoni/SQL_Server/Auditing/User_Auditing_dbo_userforSPID.png"&gt;&lt;img src="http://community.ugiss.org/blogs/sgovoni/SQL_Server/Auditing/User_Auditing_dbo_userforSPID.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;L’implementazione della traccia di auditing descritta nel precedente articolo riporta, per ogni evento, l’identificativo della sessione relativa al processo utente (SPID), tale ID avrà una corrispondenza nella tabella di associazione dbo.userforSPID.&lt;/p&gt;
&lt;p&gt;Le attività registrate potranno essere associate all’utente applicativo attraverso lo SPID, la data/ora di login e la data/ora di esecuzione dell’evento registrato (attività tracciata), semplicemente con una join rivolta alla tabella di associazione allestita al momento della connessione.&lt;/p&gt;
&lt;p&gt;Per importare le attività registrate, dal file fisico (traccia SQL) alla tabella dbo.auditing, si può utilizzare la seguente stored procedure schedulandone l’esecuzione attraverso un job:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;use [AdventureWorks];&lt;br /&gt;go&lt;/p&gt;
&lt;p&gt;-- Drop procedure dbo.usp_trace_gettable_import_file if exists&lt;br /&gt;if (object_id(&amp;#39;usp_trace_gettable_import_file&amp;#39;) is not null)&lt;br /&gt;&amp;nbsp; drop procedure [dbo].[usp_trace_gettable_import_file]&lt;br /&gt;go&lt;/p&gt;
&lt;p&gt;-- Create procedure dbo.usp_trace_gettable_import_file&lt;br /&gt;create procedure dbo.usp_trace_gettable_import_file&lt;br /&gt;as&lt;br /&gt;begin&lt;/p&gt;
&lt;p&gt;&amp;nbsp; -- Aggiornamento dbo.lastimport&lt;br /&gt;&amp;nbsp; if (select count(id) from dbo.lastimport) = 0 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; insert into dbo.lastimport&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lastexecution&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; values&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#39;19000101&amp;#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; -- Importazione dei dati raccolti da file (.trc) --&amp;gt; tabella dbo.auditing&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; Insert Into [dbo].[auditing]&lt;br /&gt;&amp;nbsp; (&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EventClass,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; TextData,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DatabaseID,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NTUserName,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NTDomainName,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HostName,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ClientProcessID,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ApplicationName,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LoginName,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Login_Time,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPID,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Duration,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; StartTime,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ObjectID,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ObjectName,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DatabaseName,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DBUserName,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; externaluser&lt;br /&gt;&amp;nbsp; )&lt;br /&gt;&amp;nbsp; select &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; T.EventClass,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; replace(cast(T.TextData as nvarchar(max)), char(13) + char(10), &amp;#39;&amp;#39;),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; T.DatabaseID,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; T.NTUserName,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; T.NTDomainName,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; T.HostName,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; T.ClientProcessID,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; T.ApplicationName,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; T.LoginName,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (select&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s.login_time&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sys.sysprocesses s&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (s.spid=T.SPID)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) as Login_Time,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; T.SPID,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; T.Duration,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; T.StartTime,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; T.ObjectID,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; T.ObjectName,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; T.DatabaseName,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; T.DBUserName,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; uSPID.externaluser&lt;br /&gt;&amp;nbsp; from&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ::fn_trace_gettable(&amp;#39;C:\Audit_Trace\audit_trace_file.trc&amp;#39;, default) as T&lt;br /&gt;&amp;nbsp; left outer join&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbo.userforSPID uSPID on (uSPID.SPID=T.SPID) and&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (T.StartTime &amp;gt;= uSPID.login_time)&lt;br /&gt;&amp;nbsp; where&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (T.TextData is not null) and&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (T.StartTime &amp;gt;= (select lastexecution from dbo.lastimport));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; if (@@error=0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; update&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbo.lastimport&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lastexecution = getdate();&lt;/p&gt;
&lt;p&gt;&amp;nbsp; if (@@error=0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Cancellazione per SPID login_time e logout_time&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- nella tabella dbo.userforSPID&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; delete&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uSPID&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbo.userforSPID uSPID&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; join&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbo.auditing au on (au.SPID=uSPID.SPID) and&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (au.starttime &amp;gt;= uSPID.login_time) and&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (uSPID.logout_time is not null);&lt;br /&gt;end&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Subito dopo aver chiuso la connessione, l’applicazione potrà registrare la data/ora di logout nella tabella di l’associazione SPID/utente applicativo, alla prossima esecuzione della stored procedure dbo.usp_trace_gettable_import_file verranno importate le registrazioni mancanti e successivamente verranno eliminate le associazioni SPID/utente applicativo con data/ora login diversa da NULL.&lt;/p&gt;
&lt;p&gt;Le registrazioni importate sono state arricchite della login applicativa utilizzata, siamo quindi in grado di conoscere quale utente applicativo che ha eseguito una determinata attività:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;select&lt;br /&gt;&amp;nbsp; SPID,&lt;br /&gt;&amp;nbsp; externaluser,&lt;br /&gt;&amp;nbsp; starttime,&lt;br /&gt;&amp;nbsp; textdata,&lt;br /&gt;&amp;nbsp; objectname,&lt;br /&gt;&amp;nbsp; databaseid&lt;br /&gt;from&lt;br /&gt;&amp;nbsp; dbo.auditing;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="http://community.ugiss.org/blogs/sgovoni/SQL_Server/Auditing/User_Auditing_dbo_auditing.png"&gt;&lt;img src="http://community.ugiss.org/blogs/sgovoni/SQL_Server/Auditing/User_Auditing_dbo_auditing.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://community.ugiss.org/aggbug.aspx?PostID=6440" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SqlServerDelphi?a=L9cs1rSccTw:gOJBX4nIJ6E:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SqlServerDelphi?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SqlServerDelphi/~4/L9cs1rSccTw" height="1" width="1"/&gt;</description><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/SQL+Server/default.aspx">SQL Server</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/SQL+Server+2005/default.aspx">SQL Server 2005</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/Auditing/default.aspx">Auditing</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/SQL+Trace/default.aspx">SQL Trace</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/Sicurezza/default.aspx">Sicurezza</category><feedburner:origLink>http://community.ugiss.org/blogs/sgovoni/archive/2009/07/01/user-auditing.aspx</feedburner:origLink></item><item><title>Indici doppi: un sovraccarico inutile #2</title><link>http://feedproxy.google.com/~r/SqlServerDelphi/~3/QS6qbRv2dYk/indici-doppi-un-sovraccarico-inutile-2.aspx</link><pubDate>Thu, 18 Jun 2009 21:57:00 GMT</pubDate><guid isPermaLink="false">696bf4df-f0eb-4942-9326-ff40615b13e5:6353</guid><dc:creator>sgovoni</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://community.ugiss.org/blogs/sgovoni/rsscomments.aspx?PostID=6353</wfw:commentRss><wfw:comment>http://community.ugiss.org/blogs/sgovoni/commentapi.aspx?PostID=6353</wfw:comment><comments>http://community.ugiss.org/blogs/sgovoni/archive/2009/06/18/indici-doppi-un-sovraccarico-inutile-2.aspx#comments</comments><description>&lt;p&gt;Grazie alla segnalazione di Andrea Benedetti,&amp;nbsp;nel post &lt;a class="" href="http://community.ugiss.org/blogs/abenedetti/archive/2009/05/27/indici-duplicati-qualche-considerazione.aspx" target="_blank"&gt;Indici duplicati. Qualche considerazione&lt;/a&gt;,&amp;nbsp;ho potuto correggere un bug nella stored procedure dbo.usp_drop_double_more_index:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="http://community.ugiss.org/blogs/sgovoni/SQL_Server/Indexes/Indici_doppi_un_sovraccarico_inutile(USP_DROP_DOUBLE_MORE_INDEX)_1.PNG"&gt;&lt;img title="dbo.usp_drop_double_more_index" alt="dbo.usp_drop_double_more_index" src="http://community.ugiss.org/blogs/sgovoni/SQL_Server/Indexes/Indici_doppi_un_sovraccarico_inutile(USP_DROP_DOUBLE_MORE_INDEX)_1.PNG" border="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Con l’occasione ho eliminato anche l’utilizzo dei cursori &lt;img src="http://community.ugiss.org/emoticons/emotion-1.gif" alt="Smile" /&gt;… la versione aggiornata è disponibile &lt;a class="" title="qui" href="http://www.ugiss.org/Content/Article/Indici-doppi-un-sovraccarico-inutile.aspx" target="_blank"&gt;qui&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://community.ugiss.org/aggbug.aspx?PostID=6353" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SqlServerDelphi?a=QS6qbRv2dYk:jDzs_1-EEug:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SqlServerDelphi?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SqlServerDelphi/~4/QS6qbRv2dYk" height="1" width="1"/&gt;</description><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/SQL+Server/default.aspx">SQL Server</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/SQL+Server+2005/default.aspx">SQL Server 2005</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/SQL+Server+2000/default.aspx">SQL Server 2000</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/Ottimizzazione/default.aspx">Ottimizzazione</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/Indici/default.aspx">Indici</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/SQL+Server+2008/default.aspx">SQL Server 2008</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/INFORMATION_5F00_SCHEMA/default.aspx">INFORMATION_SCHEMA</category><feedburner:origLink>http://community.ugiss.org/blogs/sgovoni/archive/2009/06/18/indici-doppi-un-sovraccarico-inutile-2.aspx</feedburner:origLink></item><item><title>Speaker Dinner @ Giovanni restaurant</title><link>http://feedproxy.google.com/~r/SqlServerDelphi/~3/xJI-aPaJsak/speaker-dinner.aspx</link><pubDate>Tue, 16 Jun 2009 00:19:00 GMT</pubDate><guid isPermaLink="false">696bf4df-f0eb-4942-9326-ff40615b13e5:6297</guid><dc:creator>sgovoni</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://community.ugiss.org/blogs/sgovoni/rsscomments.aspx?PostID=6297</wfw:commentRss><wfw:comment>http://community.ugiss.org/blogs/sgovoni/commentapi.aspx?PostID=6297</wfw:comment><comments>http://community.ugiss.org/blogs/sgovoni/archive/2009/06/16/speaker-dinner.aspx#comments</comments><description>&lt;p&gt;Una foto per immortalare questa magnifica&amp;nbsp;cena pre-workshop, finalmente ci siamo potuti conoscere di persona.&lt;/p&gt;
&lt;p&gt;Tra una portata e l&amp;#39;altra, tanto SQL... DDL Trigger...&amp;nbsp;ma non solo... &lt;img src="http://community.ugiss.org/emoticons/emotion-2.gif" alt="Big Smile" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://community.ugiss.org/blogs/sgovoni/Immagini/Cena_Speaker_15_06_2009.PNG"&gt;&lt;img src="http://community.ugiss.org/blogs/sgovoni/Immagini/Cena_Speaker_15_06_2009.PNG" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Da sinistra a destra, Francesco Diaz, io, Davide Mauri, Luca Bovo, Marco Russo e Andrea Benedetti.&lt;/p&gt;
&lt;p&gt;Bellissima serata!!&lt;/p&gt;&lt;img src="http://community.ugiss.org/aggbug.aspx?PostID=6297" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SqlServerDelphi?a=xJI-aPaJsak:Tl0tF4WoMSo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SqlServerDelphi?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SqlServerDelphi/~4/xJI-aPaJsak" height="1" width="1"/&gt;</description><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/UGISS/default.aspx">UGISS</category><feedburner:origLink>http://community.ugiss.org/blogs/sgovoni/archive/2009/06/16/speaker-dinner.aspx</feedburner:origLink></item><item><title>Torino 16 Giugno 2009: Workshop UGISS now!</title><link>http://feedproxy.google.com/~r/SqlServerDelphi/~3/qxBzL8kCzMs/torino-16-giugno-2009-workshop-ugiss-now.aspx</link><pubDate>Sun, 24 May 2009 23:14:00 GMT</pubDate><guid isPermaLink="false">696bf4df-f0eb-4942-9326-ff40615b13e5:6268</guid><dc:creator>sgovoni</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://community.ugiss.org/blogs/sgovoni/rsscomments.aspx?PostID=6268</wfw:commentRss><wfw:comment>http://community.ugiss.org/blogs/sgovoni/commentapi.aspx?PostID=6268</wfw:comment><comments>http://community.ugiss.org/blogs/sgovoni/archive/2009/05/25/torino-16-giugno-2009-workshop-ugiss-now.aspx#comments</comments><description>&lt;p&gt;Tra meno di un mese si terrà il primo Workshop UGISS nella città di Torino.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.ugiss.org/Content/Event/Workshop-UGISS-Torino.aspx"&gt;http://www.ugiss.org/Content/Event/Workshop-UGISS-Torino.aspx&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;C’è grande attesa per questo evento tecnico, a 360° sul mondo SQL Server, composto da ben 6 sessioni che reputo di grande interesse ed attualità: si parlerà di Modellazione, Business Intelligence, Virtualizzazione, Sicurezza e Gestione dei carichi di lavoro.&lt;/p&gt;
&lt;p&gt;Ho l’onore di partecipare a questo workshop come speaker con la sessione:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Meccanismi di Auditing con SQL Server 2005 e 2008&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Con SQL Server 2008 il supporto all&amp;#39;auditing è nativo grazie al comando &amp;quot;CREATE AUDIT&amp;quot;, con SQL Server 2005 è necessario invece costruire una soluzione basata sull’utilizzo di SQL Trace. L&amp;#39;utilizzo delle tracce è fondamentale per mantenere alto il livello delle prestazioni, esse infatti, non sono intrusive come i Trigger ed inoltre rappresentano l&amp;#39;unico modo per poter effettuare l&amp;#39;audit anche del comando “TRUNCATE TABLE” che altrimenti non potrebbe mai essere intercettato in quanto non scatena Trigger. Si utilizzeranno i Trigger solo in quelle situazioni in cui è necessario conoscere il valore che aveva un attributo prima dell’aggiornamento ed il valore che ha assunto dopo l’aggiornamento.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;La partecipazione all’evento è &lt;strong&gt;*gratuita*&lt;/strong&gt;, sì avete letto bene &lt;img src="http://community.ugiss.org/emoticons/emotion-1.gif" alt="Smile" /&gt; … sarebbe un peccato non partecipare!! e se sarete pronti e fortunati potrete portare a casa un &lt;strong&gt;Best-Seller su SQL Server&lt;/strong&gt;... da leggere sotto l&amp;#39;ombrellone &lt;img src="http://community.ugiss.org/emoticons/emotion-11.gif" alt="Cool" /&gt;.&lt;/p&gt;&lt;img src="http://community.ugiss.org/aggbug.aspx?PostID=6268" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SqlServerDelphi?a=qxBzL8kCzMs:oDWq0DyrvFg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SqlServerDelphi?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SqlServerDelphi/~4/qxBzL8kCzMs" height="1" width="1"/&gt;</description><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/Workshop/default.aspx">Workshop</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/UGISS/default.aspx">UGISS</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/Eventi/default.aspx">Eventi</category><feedburner:origLink>http://community.ugiss.org/blogs/sgovoni/archive/2009/05/25/torino-16-giugno-2009-workshop-ugiss-now.aspx</feedburner:origLink></item><item><title>Aggiornare una tabella pivot di Microsoft Excel #2</title><link>http://feedproxy.google.com/~r/SqlServerDelphi/~3/HZAzkLW5NLU/aggiornare-una-tabella-pivot-di-microsoft-excel-2.aspx</link><pubDate>Sun, 17 May 2009 21:56:00 GMT</pubDate><guid isPermaLink="false">696bf4df-f0eb-4942-9326-ff40615b13e5:6224</guid><dc:creator>sgovoni</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://community.ugiss.org/blogs/sgovoni/rsscomments.aspx?PostID=6224</wfw:commentRss><wfw:comment>http://community.ugiss.org/blogs/sgovoni/commentapi.aspx?PostID=6224</wfw:comment><comments>http://community.ugiss.org/blogs/sgovoni/archive/2009/05/17/aggiornare-una-tabella-pivot-di-microsoft-excel-2.aspx#comments</comments><description>&lt;p&gt;Oltre alle tabelle pivot, un foglio di lavoro Microsoft Excel può ospitare anche oggetti di tipo QueryTables.&lt;/p&gt;
&lt;p&gt;E’ disponibile un aggiornamento della stored procedure &lt;a class="" href="http://www.ugiss.org/Content/Article/Aggiornare-una-tabella-pivot-di-Microsoft-Excel.aspx" target="_blank"&gt;dbo.USP_DMO_Excel_Pivot_RefreshTable&lt;/a&gt; con cui&amp;nbsp;ora è possibile rinfrescare anche eventuali QueryTables presenti nei fogli di lavoro del file XLS indicato come parametro.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://community.ugiss.org/aggbug.aspx?PostID=6224" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SqlServerDelphi?a=HZAzkLW5NLU:ZTPqOnqyX-c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SqlServerDelphi?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SqlServerDelphi/~4/HZAzkLW5NLU" height="1" width="1"/&gt;</description><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/SQL+Server/default.aspx">SQL Server</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/T-SQL/default.aspx">T-SQL</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/OLE+Automation+Stored+Procedures/default.aspx">OLE Automation Stored Procedures</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/Microsoft+Excel/default.aspx">Microsoft Excel</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/sp_5F00_OA_2A00_+Method/default.aspx">sp_OA* Method</category><feedburner:origLink>http://community.ugiss.org/blogs/sgovoni/archive/2009/05/17/aggiornare-una-tabella-pivot-di-microsoft-excel-2.aspx</feedburner:origLink></item><item><title>SQLCLR instead of OLE Automation (sp_OA* method)</title><link>http://feedproxy.google.com/~r/SqlServerDelphi/~3/BNXyCpyqVk0/sqlclr-instead-of-ole-automation-sp_5F00_oa_2A00_-method.aspx</link><pubDate>Sat, 11 Apr 2009 17:32:00 GMT</pubDate><guid isPermaLink="false">696bf4df-f0eb-4942-9326-ff40615b13e5:6023</guid><dc:creator>sgovoni</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://community.ugiss.org/blogs/sgovoni/rsscomments.aspx?PostID=6023</wfw:commentRss><wfw:comment>http://community.ugiss.org/blogs/sgovoni/commentapi.aspx?PostID=6023</wfw:comment><comments>http://community.ugiss.org/blogs/sgovoni/archive/2009/04/11/sqlclr-instead-of-ole-automation-sp_5F00_oa_2A00_-method.aspx#comments</comments><description>&lt;p&gt;Riprendo il tema dell&amp;#39;aggiornamento dei dati esposti su una tabella pivot di un foglio di lavoro Microsoft Excel.&lt;/p&gt;
&lt;p&gt;Con&amp;nbsp;il post &lt;a class="" href="http://community.ugiss.org/blogs/sgovoni/archive/2009/01/09/aggiornare-una-tabella-pivot-di-microsoft-excel.aspx" target="_blank"&gt;Aggiornare una tabella pivot di Microsoft Excel&lt;/a&gt; abbiamo&amp;nbsp;realizzato una possibile soluzione basata sull&amp;#39;utilizzo di OLE Automation Stored Procedures (sp_OA*).&lt;/p&gt;
&lt;p&gt;Vediamo ora com&amp;#39;è possibile raggiungere lo stesso risultato utilizzando il Common Language Runtime (CLR) del .Net Framework... &lt;a class="" href="http://www.ugiss.org/ReadArticle.aspx?aid=634" target="_blank"&gt;Read More...&lt;/a&gt;&lt;/p&gt;&lt;img src="http://community.ugiss.org/aggbug.aspx?PostID=6023" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SqlServerDelphi?a=BNXyCpyqVk0:oUsQIR0s3dE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SqlServerDelphi?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SqlServerDelphi/~4/BNXyCpyqVk0" height="1" width="1"/&gt;</description><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/SQL+Server/default.aspx">SQL Server</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/SQL+Server+2005/default.aspx">SQL Server 2005</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/Microsoft+Excel/default.aspx">Microsoft Excel</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/SQL+Server+2008/default.aspx">SQL Server 2008</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/SQL+CLR/default.aspx">SQL CLR</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/Microsoft+Visual+C_2300_/default.aspx">Microsoft Visual C#</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/Microsoft+Visual+Studio/default.aspx">Microsoft Visual Studio</category><feedburner:origLink>http://community.ugiss.org/blogs/sgovoni/archive/2009/04/11/sqlclr-instead-of-ole-automation-sp_5F00_oa_2A00_-method.aspx</feedburner:origLink></item><item><title>[OT] 5x1000 Volte Grazie</title><link>http://feedproxy.google.com/~r/SqlServerDelphi/~3/beI11kZpGsw/_5B00_OT_5D00_-5x1000-Volte-Grazie.aspx</link><pubDate>Tue, 24 Mar 2009 01:14:00 GMT</pubDate><guid isPermaLink="false">696bf4df-f0eb-4942-9326-ff40615b13e5:5919</guid><dc:creator>sgovoni</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://community.ugiss.org/blogs/sgovoni/rsscomments.aspx?PostID=5919</wfw:commentRss><wfw:comment>http://community.ugiss.org/blogs/sgovoni/commentapi.aspx?PostID=5919</wfw:comment><comments>http://community.ugiss.org/blogs/sgovoni/archive/2009/03/24/_5B00_OT_5D00_-5x1000-Volte-Grazie.aspx#comments</comments><description>&lt;p&gt;Un brevissimo OT per segnalare la possibilità devolvere il cinque per mille delle imposte a favore di organizzazioni non-profit come &lt;a class="" href="http://www.hospiceseragnoli.it/" target="_blank"&gt;l’Hospice MTC Seràgnoli&lt;/a&gt;&amp;nbsp;oppure alla ricerca scientifica e sanitaria.&lt;/p&gt;
&lt;p&gt;Segnalo inoltre che è stato creato il gruppo &lt;em&gt;Sostenitori dell&amp;#39;Hospice MT. Chiantore Seràgnoli&lt;/em&gt; sul famosissimo LinkedIn.&lt;/p&gt;
&lt;p&gt;Tutti coloro che vogliono essere aggiornati sulle iniziative a sostegno dell’Hospice non devono far altro che aggiungersi al gruppo:&lt;/p&gt;
&lt;p&gt;&lt;a class="" href="http://www.linkedin.com/groups?gid=1856898" target="_blank"&gt;http://www.linkedin.com/groups?gid=1856898&lt;/a&gt;&lt;/p&gt;&lt;img src="http://community.ugiss.org/aggbug.aspx?PostID=5919" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SqlServerDelphi?a=beI11kZpGsw:IngnWUadPuM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SqlServerDelphi?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SqlServerDelphi/~4/beI11kZpGsw" height="1" width="1"/&gt;</description><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/Off+Topic/default.aspx">Off Topic</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/Fondazione+Hospice+MT.+Chiantore+Ser_26002300_224_3B00_gnoli/default.aspx">Fondazione Hospice MT. Chiantore Ser&amp;#224;gnoli</category><feedburner:origLink>http://community.ugiss.org/blogs/sgovoni/archive/2009/03/24/_5B00_OT_5D00_-5x1000-Volte-Grazie.aspx</feedburner:origLink></item><item><title>Indici doppi: un sovraccarico inutile</title><link>http://feedproxy.google.com/~r/SqlServerDelphi/~3/xI8xBq_cUjQ/indici-doppi-un-sovraccarico-inutile.aspx</link><pubDate>Mon, 26 Jan 2009 00:34:00 GMT</pubDate><guid isPermaLink="false">696bf4df-f0eb-4942-9326-ff40615b13e5:5605</guid><dc:creator>sgovoni</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://community.ugiss.org/blogs/sgovoni/rsscomments.aspx?PostID=5605</wfw:commentRss><wfw:comment>http://community.ugiss.org/blogs/sgovoni/commentapi.aspx?PostID=5605</wfw:comment><comments>http://community.ugiss.org/blogs/sgovoni/archive/2009/01/26/indici-doppi-un-sovraccarico-inutile.aspx#comments</comments><description>&lt;p&gt;Immaginiamo di dover cercare una parola in un libro. L’azione più naturale (la prima che ci viene in mente) è quella di andare nell’indice analitico dove possiamo facilmente trovare le pagine nelle quali appare la parola che stiamo cercando, perché le parole in un indice sono ordinate alfabeticamente. Possiamo quindi leggere le pagine indicate dall’indice e trovare tutte le informazioni associate alla parola cercata.&lt;/p&gt;
&lt;p&gt;Cosa succederebbe se il nostro libro non avesse indici ? Avremmo dovuto leggere l’intero libro, dall’inizio, pagina per pagina, per cercare tutte le occorrenze della parola che desideriamo trovare.&lt;/p&gt;
&lt;p&gt;Anche SQL Server applica questa stessa logica quando ricerca per un valore di un attributo. Indicizzando l’attributo SQL Server potrà eseguire un’index seek, in alternativa l’engine sarà costretto a leggere tutte le pagine eseguendo l’operazione che viene chiamata table scan.&lt;/p&gt;
&lt;p&gt;Potremmo quindi avere la tentazione di indicizzare tutti i possibili attributi di una tabella! In ogni caso SQL Server dovrà mantenere aggiornati tutti gli indici che abbiamo deciso di creare… più indici decideremo di creare più lenti saranno&amp;nbsp;i comandi di update.&lt;/p&gt;
&lt;p&gt;E se un attributo fosse doppiamente indicizzato ? In questo caso SQL Server sarà costretto ad aggiornare due indici, organizzati in strutture B-Tree letteralmente identiche, senza trarre alcun beneficio da una delle due.&lt;/p&gt;
&lt;p&gt;La stored procedure&amp;nbsp;&lt;a class="" href="http://www.ugiss.org/Content/Article/Indici-doppi-un-sovraccarico-inutile.aspx" target="_blank"&gt;dbo.usp_drop_double_more_index&lt;/a&gt;, illustrata&amp;nbsp;nella figura seguente, permette di individuare ed eliminare i casi di doppia (tripla, ...) indicizzazione&amp;nbsp;dei medesimi attributi.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://community.ugiss.org/blogs/sgovoni/SQL_Server/Indexes/Indici_doppi_un_sovraccarico_inutile(USP_DROP_DOUBLE_MORE_INDEX)_1.PNG"&gt;&lt;img src="http://community.ugiss.org/blogs/sgovoni/SQL_Server/Indexes/Indici_doppi_un_sovraccarico_inutile(USP_DROP_DOUBLE_MORE_INDEX)_1.PNG" border="1" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://community.ugiss.org/aggbug.aspx?PostID=5605" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SqlServerDelphi?a=xI8xBq_cUjQ:5xq7fgpvfH4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SqlServerDelphi?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SqlServerDelphi/~4/xI8xBq_cUjQ" height="1" width="1"/&gt;</description><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/SQL+Server/default.aspx">SQL Server</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/SQL+Server+2005/default.aspx">SQL Server 2005</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/SQL+Server+2000/default.aspx">SQL Server 2000</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/Ottimizzazione/default.aspx">Ottimizzazione</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/Indici/default.aspx">Indici</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/SQL+Server+2008/default.aspx">SQL Server 2008</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/INFORMATION_5F00_SCHEMA/default.aspx">INFORMATION_SCHEMA</category><feedburner:origLink>http://community.ugiss.org/blogs/sgovoni/archive/2009/01/26/indici-doppi-un-sovraccarico-inutile.aspx</feedburner:origLink></item><item><title>Aggiornare una tabella pivot di Microsoft Excel</title><link>http://feedproxy.google.com/~r/SqlServerDelphi/~3/2TU5LYMjlsc/aggiornare-una-tabella-pivot-di-microsoft-excel.aspx</link><pubDate>Fri, 09 Jan 2009 01:08:00 GMT</pubDate><guid isPermaLink="false">696bf4df-f0eb-4942-9326-ff40615b13e5:5525</guid><dc:creator>sgovoni</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://community.ugiss.org/blogs/sgovoni/rsscomments.aspx?PostID=5525</wfw:commentRss><wfw:comment>http://community.ugiss.org/blogs/sgovoni/commentapi.aspx?PostID=5525</wfw:comment><comments>http://community.ugiss.org/blogs/sgovoni/archive/2009/01/09/aggiornare-una-tabella-pivot-di-microsoft-excel.aspx#comments</comments><description>&lt;p&gt;Le tabelle pivot sono un’apprezzabile caratteristica di Microsoft Excel (&lt;a class="" href="http://www.timeatlas.com/mos/5_Minute_Tips/Chunkers/Learn_to_use_Pivot_Tables_in_Excel_2007_to_Organize_Data/" target="_blank"&gt;Learn to use Pivot Tables in Excel 2007&lt;/a&gt;) e vengono largamente utilizzate per aggregare i dati con l’obiettivo di presentarli attraverso nuova prospettiva, in pochi click.&lt;/p&gt;
&lt;p&gt;Si potrebbe pensare ad una tabella pivot come ad una tabella utente, riepilogativa, di un foglio di lavoro originale. È possibile creare una tabella pivot definendo quali campi visualizzare e come i dati dovranno essere visualizzati.&lt;/p&gt;
&lt;p&gt;In funzione dei campi selezionati, Excel aggrega e organizza i dati in modo da fornire un diverso punto di vista per l’analisi dei dati stessi. I dati da analizzare potrebbero essere esterni (origine dati esterna):&lt;/p&gt;
&lt;p&gt;&lt;a href="http://community.ugiss.org/blogs/sgovoni/Immagini/Microsoft_Excel/Creazione_guidata_tabella_pivot_di_Microsoft_Excel.PNG"&gt;&lt;img src="http://community.ugiss.org/blogs/sgovoni/Immagini/Microsoft_Excel/Creazione_guidata_tabella_pivot_di_Microsoft_Excel.PNG" border="0" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;... e potrebbero risiedere all’interno di un database SQL Server interrogato con una query ad hoc che collega più tabelle, come ad esempio avviene in una tabella pivot implementata per l’analisi del portafoglio ordini o del fatturato trimestrale di un’azienda.&lt;/p&gt;
&lt;p&gt;Ad esempio, i dati necessari&amp;nbsp;all&amp;#39;analisi del fatturato&amp;nbsp;provengono dal sistema informativo aziendale e vengono modificati frequentemente (si spera &lt;img src="http://community.ugiss.org/emoticons/emotion-1.gif" alt="Smile" /&gt;), in queste situazioni, potrebbe essere richiesto un &lt;strong&gt;aggiornamento automatico&lt;/strong&gt;, della tabella pivot, ogni X minuti oppure al &lt;strong&gt;verificarsi di un determinato evento&lt;/strong&gt; senza dover necessariamente aprire il file Excel.&lt;/p&gt;
&lt;p&gt;La stored procedure &lt;a class="" href="http://www.ugiss.org/Content/Article/Aggiornare-una-tabella-pivot-di-Microsoft-Excel.aspx" target="_blank"&gt;dbo.USP_DMO_Excel_Pivot_RefreshTable&lt;/a&gt;, attraverso l’utilizzo di OLE Automation Stored Procedures, permette di aggiornare i dati esposti su una tabella pivot di un determinato file Excel (senza l’apertura manuale del documento XLS).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://community.ugiss.org/aggbug.aspx?PostID=5525" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SqlServerDelphi?a=2TU5LYMjlsc:e-povT35jqw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SqlServerDelphi?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SqlServerDelphi/~4/2TU5LYMjlsc" height="1" width="1"/&gt;</description><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/SQL+Server/default.aspx">SQL Server</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/T-SQL/default.aspx">T-SQL</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/OLE+Automation+Stored+Procedures/default.aspx">OLE Automation Stored Procedures</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/Microsoft+Excel/default.aspx">Microsoft Excel</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/sp_5F00_OA_2A00_+Method/default.aspx">sp_OA* Method</category><feedburner:origLink>http://community.ugiss.org/blogs/sgovoni/archive/2009/01/09/aggiornare-una-tabella-pivot-di-microsoft-excel.aspx</feedburner:origLink></item><item><title>Conoscere la data/ora dell'ultimo user UPDATE su una tabella</title><link>http://feedproxy.google.com/~r/SqlServerDelphi/~3/dMlVYSmy27A/Conoscere-la-data_2F00_ora-dell_2700_ultimo-user-UPDATE-su-una-tabella.aspx</link><pubDate>Sat, 20 Dec 2008 18:58:00 GMT</pubDate><guid isPermaLink="false">696bf4df-f0eb-4942-9326-ff40615b13e5:5446</guid><dc:creator>sgovoni</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://community.ugiss.org/blogs/sgovoni/rsscomments.aspx?PostID=5446</wfw:commentRss><wfw:comment>http://community.ugiss.org/blogs/sgovoni/commentapi.aspx?PostID=5446</wfw:comment><comments>http://community.ugiss.org/blogs/sgovoni/archive/2008/12/20/Conoscere-la-data_2F00_ora-dell_2700_ultimo-user-UPDATE-su-una-tabella.aspx#comments</comments><description>&lt;p&gt;Come posso conoscere la data e l’ora dell’ultimo user UPDATE eseguito su una tabella ?&lt;/p&gt;
&lt;p&gt;Una possibile soluzione a questo link:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.ugiss.org/Content/Article/Conoscere-la-data-ora-dell-ultimo-user-UPDATE-su-una-tabella.aspx"&gt;http://www.ugiss.org/Content/Article/Conoscere-la-data-ora-dell-ultimo-user-UPDATE-su-una-tabella.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://community.ugiss.org/aggbug.aspx?PostID=5446" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SqlServerDelphi?a=dMlVYSmy27A:tqomG1aPyzc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SqlServerDelphi?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SqlServerDelphi/~4/dMlVYSmy27A" height="1" width="1"/&gt;</description><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/SQL+Server/default.aspx">SQL Server</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/T-SQL/default.aspx">T-SQL</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/SQL+Server+2005/default.aspx">SQL Server 2005</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/Indici/default.aspx">Indici</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/SQL+Server+2008/default.aspx">SQL Server 2008</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/Dynamic+Management+Views+and+Functions/default.aspx">Dynamic Management Views and Functions</category><feedburner:origLink>http://community.ugiss.org/blogs/sgovoni/archive/2008/12/20/Conoscere-la-data_2F00_ora-dell_2700_ultimo-user-UPDATE-su-una-tabella.aspx</feedburner:origLink></item><item><title>Etichette di identificazione prodotti: estrazione ordinata su due colonne</title><link>http://feedproxy.google.com/~r/SqlServerDelphi/~3/LgUvGDABC0Y/Etichette-di-identificazione-prodotti_3A00_-estrazione-ordinata-su-due-colonne.aspx</link><pubDate>Fri, 19 Dec 2008 21:24:00 GMT</pubDate><guid isPermaLink="false">696bf4df-f0eb-4942-9326-ff40615b13e5:4554</guid><dc:creator>sgovoni</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://community.ugiss.org/blogs/sgovoni/rsscomments.aspx?PostID=4554</wfw:commentRss><wfw:comment>http://community.ugiss.org/blogs/sgovoni/commentapi.aspx?PostID=4554</wfw:comment><comments>http://community.ugiss.org/blogs/sgovoni/archive/2008/12/19/Etichette-di-identificazione-prodotti_3A00_-estrazione-ordinata-su-due-colonne.aspx#comments</comments><description>&lt;p&gt;Si sta avvicinando la fine dell’esercizio fiscale e la vostra azienda si appresta ad eseguire l’inventario fisico dei prodotti giacenti a magazzino.&lt;/p&gt;
&lt;p&gt;Il responsabile del magazzino, in occasione dell’inventario fisico, desidera etichettare tutti i prodotti in modo da identificarli univocamente. Uno degli obbiettivi del prossimo anno è infatti l’implementazione della movimentazione merci con l’utilizzo dei codici a barre e l’etichettatura dei prodotti rappresenta un prerequisito fondamentale.&lt;/p&gt;
&lt;p&gt;L’azienda dispone di una stampante di etichette adesive a trasferimento termico avente un supporto cartaceo a due colonne. Vi hanno chiesto l’estrazione dei dati che identificano in modo univoco un prodotto&amp;nbsp;e la possibilità di stamparli, in modo ordinato,&amp;nbsp;su etichette a due colonne.&lt;/p&gt;
&lt;p&gt;L’anagrafica prodotti ha una struttura simile a quella disegnata nel database &lt;strong&gt;AdventureWorks&lt;/strong&gt; con la tabella &lt;strong&gt;Production.Product&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Per produrre l’output richiesto si può utilizzare la stored procedure &lt;a class="" href="http://www.ugiss.org/Content/Article/Split-ordinato-di-una-colonna-di-tipo-VarChar.aspx" target="_blank"&gt;dbo.usp_split_column&lt;/a&gt; con la seguente chiamata:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;COLOR:blue;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:EN-GB;"&gt;EXEC&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:EN-GB;"&gt; dbo&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;USP_SPLIT_COLUMN&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;COLOR:blue;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:EN-GB;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:EN-GB;"&gt;&amp;nbsp; @TableName&lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;Production.Product&amp;#39;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:EN-GB;"&gt;&lt;span style="COLOR:gray;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:EN-GB;"&gt;&amp;nbsp; @AliasName&lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;P&amp;#39;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:EN-GB;"&gt;&lt;span style="COLOR:gray;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:EN-GB;"&gt;@FieldPK&lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;ProductID&amp;#39;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:EN-GB;"&gt;&lt;span style="COLOR:gray;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:EN-GB;"&gt;@FieldName&lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;ProductNumber&amp;#39;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:EN-GB;"&gt;&lt;span style="COLOR:gray;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:EN-GB;"&gt;@FieldName1&lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;Name&amp;#39;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:EN-GB;"&gt;&lt;span style="COLOR:gray;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:EN-GB;"&gt;@WhereCond&lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:EN-GB;"&gt;&lt;span style="COLOR:gray;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:EN-GB;"&gt;@TableJoin&lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;Production.ProductSubCategory&amp;#39;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:EN-GB;"&gt;&lt;span style="COLOR:gray;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:EN-GB;"&gt;@AliasJoin&lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;C&amp;#39;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:EN-GB;"&gt;&lt;span style="COLOR:gray;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:EN-GB;"&gt;@FieldJoinLeft&lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;ProductSubcategoryID&amp;#39;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:EN-GB;"&gt;&lt;span style="COLOR:gray;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;@FieldJoinRight&lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;ProductSubcategoryID&amp;#39;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="COLOR:gray;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:IT;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:IT;mso-bidi-language:AR-SA;"&gt;@FieldJoinList&lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;LTRIM(RTRIM(C.Name))&amp;#39;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://community.ugiss.org/blogs/sgovoni/Immagini/Etichette_di_identificazione_prodotti_Split.PNG"&gt;&lt;img src="http://community.ugiss.org/blogs/sgovoni/Immagini/Etichette_di_identificazione_prodotti_Split.PNG" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://community.ugiss.org/aggbug.aspx?PostID=4554" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SqlServerDelphi?a=LgUvGDABC0Y:TCJIl2NP_Nk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SqlServerDelphi?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SqlServerDelphi/~4/LgUvGDABC0Y" height="1" width="1"/&gt;</description><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/SQL+Server/default.aspx">SQL Server</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/T-SQL/default.aspx">T-SQL</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/Split+column/default.aspx">Split column</category><feedburner:origLink>http://community.ugiss.org/blogs/sgovoni/archive/2008/12/19/Etichette-di-identificazione-prodotti_3A00_-estrazione-ordinata-su-due-colonne.aspx</feedburner:origLink></item><item><title>[OT] Il week end che preferisco</title><link>http://feedproxy.google.com/~r/SqlServerDelphi/~3/8L4rlx6eyBc/ot-il-week-end-che-preferisco.aspx</link><pubDate>Sat, 29 Nov 2008 22:01:00 GMT</pubDate><guid isPermaLink="false">696bf4df-f0eb-4942-9326-ff40615b13e5:5346</guid><dc:creator>sgovoni</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://community.ugiss.org/blogs/sgovoni/rsscomments.aspx?PostID=5346</wfw:commentRss><wfw:comment>http://community.ugiss.org/blogs/sgovoni/commentapi.aspx?PostID=5346</wfw:comment><comments>http://community.ugiss.org/blogs/sgovoni/archive/2008/11/29/ot-il-week-end-che-preferisco.aspx#comments</comments><description>&lt;p&gt;Tra colleghi non è facile pianificare un week end fuori porta &lt;img src="http://community.ugiss.org/emoticons/emotion-1.gif" alt="Smile" /&gt;&amp;nbsp;accontentando tutti tra mille impegni e imprevisti, ma questa volta ce l’abbiamo fatta!&lt;/p&gt;
&lt;p&gt;Nonostante le previsioni meteo &lt;img src="http://community.ugiss.org/emoticons/emotion-37.gif" alt="Storm" /&gt;, siamo partiti per un week end in montagna, ospiti nell’appartamento di un carissimo amico ed ex-collega. La neve non ha tardato ad arrivare, già dalla sera di venerdì...&lt;/p&gt;
&lt;p&gt;&lt;a href="http://community.ugiss.org/blogs/sgovoni/Immagini/Nebbiu_0_20082811.PNG"&gt;&lt;img src="http://community.ugiss.org/blogs/sgovoni/Immagini/Nebbiu_0_20082811.PNG" border="1" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;...e questa mattina ci siamo svegliati immersi in questo magnifico paesaggio:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://community.ugiss.org/blogs/sgovoni/Immagini/Nebbiu_1_20082911.PNG"&gt;&lt;img src="http://community.ugiss.org/blogs/sgovoni/Immagini/Nebbiu_1_20082911.PNG" border="1" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://community.ugiss.org/blogs/sgovoni/Immagini/Nebbiu_2_20082911.PNG"&gt;&lt;img src="http://community.ugiss.org/blogs/sgovoni/Immagini/Nebbiu_2_20082911.PNG" border="1" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Peccato non si possa fare più spesso &lt;img src="http://community.ugiss.org/emoticons/emotion-1.gif" alt="Smile" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://community.ugiss.org/aggbug.aspx?PostID=5346" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SqlServerDelphi?a=8L4rlx6eyBc:tk2NEU8uPeA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SqlServerDelphi?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SqlServerDelphi/~4/8L4rlx6eyBc" height="1" width="1"/&gt;</description><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/Off+Topic/default.aspx">Off Topic</category><feedburner:origLink>http://community.ugiss.org/blogs/sgovoni/archive/2008/11/29/ot-il-week-end-che-preferisco.aspx</feedburner:origLink></item><item><title>Indicizzazione dei vincoli FOREIGN KEY</title><link>http://feedproxy.google.com/~r/SqlServerDelphi/~3/i_8QN9alt1I/indicizzazione-dei-vincoli-foreign-key.aspx</link><pubDate>Wed, 26 Nov 2008 22:46:00 GMT</pubDate><guid isPermaLink="false">696bf4df-f0eb-4942-9326-ff40615b13e5:5290</guid><dc:creator>sgovoni</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://community.ugiss.org/blogs/sgovoni/rsscomments.aspx?PostID=5290</wfw:commentRss><wfw:comment>http://community.ugiss.org/blogs/sgovoni/commentapi.aspx?PostID=5290</wfw:comment><comments>http://community.ugiss.org/blogs/sgovoni/archive/2008/11/26/indicizzazione-dei-vincoli-foreign-key.aspx#comments</comments><description>&lt;p&gt;Abbiamo utilizzato la stored procedure &lt;a class="" href="http://www.ugiss.org/Content/Article/Indicizzazione-dei-vincoli-FOREIGN-KEY.aspx" target="_blank"&gt;usp_create_index_on_foreign_key&lt;/a&gt;&amp;nbsp;per determinare e creare gli indici mancanti per i vincoli FOREIGN KEY in essere su una determinata tabella o su un determinato schema.&lt;/p&gt;
&lt;p&gt;Lo scenario illustrato di seguito permetterà di osservare il comportamento dell’ottimizzatore durante la fase di ricerca del piano di esecuzione migliore per risolvere una query che faccia uso di JOIN per l’estrazione dei dati di due tabelle relazionate tra loro attraverso una chiave primaria (Primary Key) ed una chiave esterna (Foreign Key).&lt;/p&gt;
&lt;p&gt;Confronteremo i piani di esecuzione utilizzati ed il numero di accessi di I/O con e senza&amp;nbsp;indici.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La nostra azienda ha un database SQL Server 2005 che contiene le tabelle dbo.OrderHeader e dbo.OrderDetail utilizzate rispettivamente per memorizzare testate e righe degli ordini di vendita ricevuti dai propri clienti. Gli utenti utilizzano una query di estrazione dati applicando un filtro per numero ordine.&lt;/p&gt;
&lt;p&gt;Utilizziamo il seguente script T-SQL per la generazione delle tabelle dbo.OrderHeader e dbo.OrderDetail:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;-- Drop table OrderDetail&lt;br /&gt;IF (OBJECT_ID(&amp;#39;OrderDetail&amp;#39;, &amp;#39;U&amp;#39;) IS NOT NULL)&lt;br /&gt;&amp;nbsp; DROP TABLE dbo.OrderDetail&lt;br /&gt;GO&lt;/p&gt;
&lt;p&gt;-- Create table OrderDetail&lt;br /&gt;CREATE TABLE dbo.OrderDetail&lt;br /&gt;(OrderDetailID INT IDENTITY(1, 1) NOT NULL,&lt;br /&gt;&amp;nbsp;OrderHeaderID INT NOT NULL,&lt;br /&gt;&amp;nbsp;ProductID INT NOT NULL,&lt;br /&gt;&amp;nbsp;RigNumber AS (OrderDetailID * 2) ,&lt;br /&gt;&amp;nbsp;UnitPrice MONEY DEFAULT 0 NOT NULL&lt;br /&gt;&amp;nbsp;PRIMARY KEY(OrderDetailID)&lt;br /&gt;)&lt;/p&gt;
&lt;p&gt;GO&lt;/p&gt;
&lt;p&gt;-- Drop table Order&lt;br /&gt;IF (OBJECT_ID(&amp;#39;OrderHeader&amp;#39;, &amp;#39;U&amp;#39;) IS NOT NULL)&lt;br /&gt;&amp;nbsp; DROP TABLE dbo.OrderHeader&lt;br /&gt;GO&lt;/p&gt;
&lt;p&gt;-- Create table OrderHeader&lt;br /&gt;CREATE TABLE dbo.OrderHeader&lt;br /&gt;(OrderID INT IDENTITY(1, 1) NOT NULL,&lt;br /&gt;&amp;nbsp;OrderDATE DATETIME DEFAULT GETDATE() NOT NULL,&lt;br /&gt;&amp;nbsp;OrderNUMBER AS (ISNULL(N&amp;#39;SO&amp;#39; + CONVERT([nvarchar](23), [OrderID], 0), N&amp;#39;*** ERROR ***&amp;#39;)),&lt;br /&gt;&amp;nbsp;CustomerID INT DEFAULT 1 NOT NULL,&lt;br /&gt;&amp;nbsp;ShipName VARCHAR(20) DEFAULT &amp;#39;Name&amp;#39;,&lt;br /&gt;&amp;nbsp;ShipAddress VARCHAR(40) DEFAULT &amp;#39;Address&amp;#39;,&lt;br /&gt;&amp;nbsp;ShipVia VARCHAR(40) DEFAULT &amp;#39;Via&amp;#39;,&lt;br /&gt;&amp;nbsp;ShipCity VARCHAR(20) DEFAULT &amp;#39;City&amp;#39;,&lt;br /&gt;&amp;nbsp;ShipRegion VARCHAR(20) DEFAULT &amp;#39;Region&amp;#39;,&lt;br /&gt;&amp;nbsp;ShipPostalCode VARCHAR(20) DEFAULT &amp;#39;Postal code&amp;#39;,&lt;br /&gt;&amp;nbsp;ShipCountry VARCHAR(20) DEFAULT &amp;#39;Country&amp;#39;&lt;br /&gt;&amp;nbsp;PRIMARY KEY(OrderID)&lt;br /&gt;)&lt;/p&gt;
&lt;p&gt;GO&lt;/p&gt;
&lt;p&gt;-- ALTER TABLE ADD CONSTRAINT&lt;br /&gt;ALTER TABLE&lt;br /&gt;&amp;nbsp; [dbo].[OrderDetail] &lt;br /&gt;WITH CHECK ADD CONSTRAINT &lt;br /&gt;&amp;nbsp; [FK_OrderHeaderID]&lt;br /&gt;FOREIGN KEY&lt;br /&gt;&amp;nbsp; ([OrderHeaderID])&lt;br /&gt;REFERENCES&lt;br /&gt;&amp;nbsp; [dbo].[OrderHeader] ([OrderID])&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Inseriamo alcuni dati di prova:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;DECLARE @i AS int,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @scope_id AS int&lt;/p&gt;
&lt;p&gt;SET @i = 0&lt;br /&gt;SET @scope_id = 0&lt;/p&gt;
&lt;p&gt;WHILE (@i &amp;lt; 20000)&lt;br /&gt;BEGIN&lt;br /&gt;&amp;nbsp; SET NOCOUNT ON&lt;/p&gt;
&lt;p&gt;&amp;nbsp; INSERT INTO dbo.OrderHeader DEFAULT VALUES&lt;/p&gt;
&lt;p&gt;&amp;nbsp; SELECT @scope_id = SCOPE_IDENTITY()&lt;/p&gt;
&lt;p&gt;&amp;nbsp; -- 1&lt;br /&gt;&amp;nbsp; INSERT INTO dbo.OrderDetail&lt;br /&gt;&amp;nbsp; (OrderHeaderID, &lt;br /&gt;&amp;nbsp;&amp;nbsp; ProductID,&lt;br /&gt;&amp;nbsp;&amp;nbsp; UnitPrice)&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; SELECT&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @scope_id,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (@i * 2)+1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((@i * 2)+1)/2&lt;/p&gt;
&lt;p&gt;&amp;nbsp; -- 2&lt;br /&gt;&amp;nbsp; INSERT INTO dbo.OrderDetail&lt;br /&gt;&amp;nbsp; (OrderHeaderID, &lt;br /&gt;&amp;nbsp;&amp;nbsp; ProductID,&lt;br /&gt;&amp;nbsp;&amp;nbsp; UnitPrice)&lt;br /&gt;&amp;nbsp; SELECT&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @scope_id,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (@i * 3)+1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((@i * 3)+1)/3&lt;/p&gt;
&lt;p&gt;&amp;nbsp; -- 3&lt;br /&gt;&amp;nbsp; INSERT INTO dbo.OrderDetail&lt;br /&gt;&amp;nbsp; (OrderHeaderID, &lt;br /&gt;&amp;nbsp;&amp;nbsp; ProductID,&lt;br /&gt;&amp;nbsp;&amp;nbsp; UnitPrice)&lt;br /&gt;&amp;nbsp; SELECT&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @scope_id,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (@i * 4)+1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((@i * 4)+1)/4&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp; SET @i = (@i + 1)&lt;/p&gt;
&lt;p&gt;&amp;nbsp; SET NOCOUNT OFF&lt;br /&gt;END&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Utilizziamo ad esempio la seguente query (Q1) per consultare alcune informazioni relative all’ordine numero &amp;#39;SO9000&amp;#39;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;select &lt;br /&gt;&amp;nbsp; OH.OrderDATE,&lt;br /&gt;&amp;nbsp; OH.OrderNUMBER,&lt;br /&gt;&amp;nbsp; OH.CustomerID,&lt;br /&gt;&amp;nbsp; OD.ProductID&lt;br /&gt;from&lt;br /&gt;&amp;nbsp; dbo.OrderHeader OH&lt;br /&gt;join&lt;br /&gt;&amp;nbsp; dbo.OrderDetail OD ON OD.OrderHeaderID = OH.OrderID&lt;br /&gt;where&lt;br /&gt;&amp;nbsp; OH.OrderNUMBER = &amp;#39;SO9000&amp;#39;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;La Foreign Key &lt;strong&gt;FK_OrderHeaderID&lt;/strong&gt; non è indicizzata, il piano di esecuzione utilizzato per soddisfare la query (Q1) è il seguente:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://community.ugiss.org/blogs/sgovoni/SQL_Server/Execution_Plan/Indicizzazione_dei_vincoli_Foreign_Key_Plan_No_Index.bmp"&gt;&lt;img title="click to enlarge" alt="click to enlarge" src="http://community.ugiss.org/blogs/sgovoni/SQL_Server/Execution_Plan/Indicizzazione_dei_vincoli_Foreign_Key_Plan_No_Index.bmp" border="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Si osservano i due &lt;strong&gt;Clustered Index Scan&lt;/strong&gt; rispettivamente sulle tabelle dbo.OrderHeader e dbo.OrderDetail con le seguenti statistiche di I/O:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;SQL Server parse and compile time: &lt;br /&gt;&amp;nbsp;&amp;nbsp; CPU time = 0 ms, elapsed time = 1 ms.&lt;/p&gt;
&lt;p&gt;SQL Server Execution Times:&lt;br /&gt;&amp;nbsp;&amp;nbsp; CPU time = 0 ms,&amp;nbsp; elapsed time = 1 ms.&lt;br /&gt;SQL Server parse and compile time: &lt;br /&gt;&amp;nbsp;&amp;nbsp; CPU time = 0 ms, elapsed time = 50 ms.&lt;/p&gt;
&lt;p&gt;(3 row(s) affected)&lt;br /&gt;Table &amp;#39;Worktable&amp;#39;. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.&lt;/p&gt;
&lt;p&gt;Table &amp;#39;&lt;strong&gt;OrderDetail&lt;/strong&gt;&amp;#39;. Scan count 1, &lt;strong&gt;logical reads 218&lt;/strong&gt;, physical reads 0, &lt;strong&gt;read-ahead reads 224&lt;/strong&gt;, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.&lt;/p&gt;
&lt;p&gt;Table &amp;#39;&lt;strong&gt;OrderHeader&lt;/strong&gt;&amp;#39;. Scan count 1, &lt;strong&gt;logical reads 211&lt;/strong&gt;, physical reads 1, &lt;strong&gt;read-ahead reads 212&lt;/strong&gt;, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.&lt;/p&gt;
&lt;p&gt;(1 row(s) affected)&lt;/p&gt;
&lt;p&gt;SQL Server Execution Times:&lt;br /&gt;&amp;nbsp;&amp;nbsp; CPU time = 15 ms,&amp;nbsp; elapsed time = 90 ms.&lt;br /&gt;SQL Server parse and compile time: &lt;br /&gt;&amp;nbsp;&amp;nbsp; CPU time = 0 ms, elapsed time = 1 ms.&lt;/p&gt;
&lt;p&gt;SQL Server Execution Times:&lt;br /&gt;&amp;nbsp;&amp;nbsp; CPU time = 0 ms,&amp;nbsp; elapsed time = 1 ms.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Utilizziamo ora la stored procedure &lt;a class="" href="http://www.ugiss.org/Content/Article/Indicizzazione-dei-vincoli-FOREIGN-KEY.aspx" target="_blank"&gt;usp_create_index_on_foreign_key&lt;/a&gt; per generare l’indice (NONCLUSTERED) mancante sul campo OrderHeaderID della tabella dbo.OrderDetail:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;EXEC dbo.usp_create_index_on_foreign_key 1, N&amp;#39;dbo&amp;#39;, N&amp;#39;OrderDetail&amp;#39;, 0;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;usp_create_index_on_foreign_key : Generazione indici...&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Esecuzione di: CREATE NONCLUSTERED INDEX [IDX__OrderDetail_OrderHeaderID] ON dbo.OrderDetail(OrderHeaderID) completata correttamente.&lt;br /&gt;&lt;br /&gt;usp_create_index_on_foreign_key : Generazione indici completata.&lt;/p&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;DBCC DROPCLEANBUFFERS&lt;/p&gt;
&lt;p&gt;DBCC FREEPROCCACHE&lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;La Foreign Key FK_OrderHeaderID è ora indicizzata, eseguiamo di nuovo la query (Q1) e confrontiamo il nuovo piano di esecuzione e le statistiche di I/O:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://community.ugiss.org/blogs/sgovoni/SQL_Server/Execution_Plan/Indicizzazione_dei_vincoli_Foreign_Key_Plan_With_Index.bmp"&gt;&lt;img title="click to enlarge" alt="click to enlarge" src="http://community.ugiss.org/blogs/sgovoni/SQL_Server/Execution_Plan/Indicizzazione_dei_vincoli_Foreign_Key_Plan_With_Index.bmp" border="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Osserviamo ora che il Clustered Index Scan sulla tabella dbo.OrderDetail è stato sostituito con un Index Seek sull’indice &lt;strong&gt;IDX__OrderDetail_OrderHeaderID&lt;/strong&gt; individuato e creato dalla stored procedure. Le statistiche di I/O denotano una sensibile diminuzione delle letture sulla tabella di dettaglio ordini i cui dati vengono acceduti attraverso l’indice:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;SQL Server parse and compile time: &lt;br /&gt;&amp;nbsp;&amp;nbsp; CPU time = 0 ms, elapsed time = 1 ms.&lt;/p&gt;
&lt;p&gt;SQL Server Execution Times:&lt;br /&gt;&amp;nbsp;&amp;nbsp; CPU time = 0 ms,&amp;nbsp; elapsed time = 1 ms.&lt;br /&gt;SQL Server parse and compile time: &lt;br /&gt;&amp;nbsp;&amp;nbsp; CPU time = 0 ms, elapsed time = 5 ms.&lt;/p&gt;
&lt;p&gt;(3 row(s) affected)&lt;br /&gt;Table &amp;#39;&lt;strong&gt;OrderDetail&lt;/strong&gt;&amp;#39;. Scan count 1, &lt;strong&gt;logical reads 8&lt;/strong&gt;, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.&lt;/p&gt;
&lt;p&gt;Table &amp;#39;&lt;strong&gt;OrderHeader&lt;/strong&gt;&amp;#39;. Scan count 1, &lt;strong&gt;logical reads 211&lt;/strong&gt;, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.&lt;/p&gt;
&lt;p&gt;(1 row(s) affected)&lt;/p&gt;
&lt;p&gt;SQL Server Execution Times:&lt;br /&gt;&amp;nbsp;&amp;nbsp; CPU time = 15 ms,&amp;nbsp; elapsed time = 18 ms.&lt;br /&gt;SQL Server parse and compile time: &lt;br /&gt;&amp;nbsp;&amp;nbsp; CPU time = 0 ms, elapsed time = 1 ms.&lt;/p&gt;
&lt;p&gt;SQL Server Execution Times:&lt;br /&gt;&amp;nbsp;&amp;nbsp; CPU time = 0 ms,&amp;nbsp; elapsed time = 1 ms.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Conclusioni&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Creare un indice su una chiave esterna rappresenta spesso un&amp;#39;operazione utile in quanto:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;Le modifiche apportate ai vincoli PRIMARY KEY vengono confrontate con i vincoli FOREIGN KEY nelle tabelle correlate&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Le colonne chiave primaria vengono citate nei criteri di JOIN quando per riunire i dati di tabelle diverse si confrontano rispettivamente le colonne nel vincolo FOREIGN KEY con le colonne nel vincolo PRIMARY KEY&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;In questi casi la presenza di un indice consente all’engine di SQL Server di trovare rapidamente i dati correlati nella tabella che contiene la chiave esterna.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://community.ugiss.org/aggbug.aspx?PostID=5290" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SqlServerDelphi?a=i_8QN9alt1I:8esJO-2RNvs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SqlServerDelphi?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SqlServerDelphi/~4/i_8QN9alt1I" height="1" width="1"/&gt;</description><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/FOREIGN+KEY/default.aspx">FOREIGN KEY</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/SQL+Server/default.aspx">SQL Server</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/SQL+Server+2005/default.aspx">SQL Server 2005</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/Ottimizzazione/default.aspx">Ottimizzazione</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/Indici/default.aspx">Indici</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/SQL+Server+2008/default.aspx">SQL Server 2008</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/CONSTRAINT/default.aspx">CONSTRAINT</category><feedburner:origLink>http://community.ugiss.org/blogs/sgovoni/archive/2008/11/26/indicizzazione-dei-vincoli-foreign-key.aspx</feedburner:origLink></item><item><title>Non si tratta solo di dati...</title><link>http://feedproxy.google.com/~r/SqlServerDelphi/~3/F51Vyt2Bb7s/non-si-tratta-solo-di-dati.aspx</link><pubDate>Thu, 30 Oct 2008 23:32:00 GMT</pubDate><guid isPermaLink="false">696bf4df-f0eb-4942-9326-ff40615b13e5:5068</guid><dc:creator>sgovoni</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://community.ugiss.org/blogs/sgovoni/rsscomments.aspx?PostID=5068</wfw:commentRss><wfw:comment>http://community.ugiss.org/blogs/sgovoni/commentapi.aspx?PostID=5068</wfw:comment><comments>http://community.ugiss.org/blogs/sgovoni/archive/2008/10/31/non-si-tratta-solo-di-dati.aspx#comments</comments><description>&lt;p&gt;...è una nuova forma di energia:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.microsoft.com/servers/sql/2008/sqlserverenergy/it/it/default.aspx?WT.srch=1&amp;amp;WT.mc_id=ms_sql"&gt;http://www.microsoft.com/servers/sql/2008/sqlserverenergy/it/it/default.aspx?WT.srch=1&amp;amp;WT.mc_id=ms_sql&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://community.ugiss.org/aggbug.aspx?PostID=5068" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SqlServerDelphi?a=F51Vyt2Bb7s:Cep5DYKjmqM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SqlServerDelphi?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SqlServerDelphi/~4/F51Vyt2Bb7s" height="1" width="1"/&gt;</description><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/SQL+Server/default.aspx">SQL Server</category><category domain="http://community.ugiss.org/blogs/sgovoni/archive/tags/SQL+Server+2008/default.aspx">SQL Server 2008</category><feedburner:origLink>http://community.ugiss.org/blogs/sgovoni/archive/2008/10/31/non-si-tratta-solo-di-dati.aspx</feedburner:origLink></item></channel></rss>
