<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss1full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:cc="http://web.resource.org/cc/" xmlns="http://purl.org/rss/1.0/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">

<channel rdf:about="http://www.rodcolledge.com/rod_colledge/">
<title>Dirty Reads ... </title>
<link>http://www.rodcolledge.com/rod_colledge/</link>
<description>... and other filthy tales by Rod Colledge, SQL Server MVP</description>
<dc:language>en-US</dc:language>
<dc:creator />
<dc:date>2013-03-05T17:27:46+10:00</dc:date>
<admin:generatorAgent rdf:resource="http://www.typepad.com/" />


<items>
<rdf:Seq><rdf:li rdf:resource="http://www.rodcolledge.com/rod_colledge/2013/03/see-you-in-chicago.html" />
<rdf:li rdf:resource="http://www.rodcolledge.com/rod_colledge/2010/12/using-policy-based-management-to-check-sysadmin-membership.html" />
<rdf:li rdf:resource="http://www.rodcolledge.com/rod_colledge/2010/10/unrelated-dimensions.html" />
<rdf:li rdf:resource="http://www.rodcolledge.com/rod_colledge/2010/10/ssas-dynamic-security-kerberos-and-performancepoint.html" />
<rdf:li rdf:resource="http://www.rodcolledge.com/rod_colledge/2010/09/project-phoenix-update-1.html" />
<rdf:li rdf:resource="http://www.rodcolledge.com/rod_colledge/2010/09/project-.html" />
<rdf:li rdf:resource="http://www.rodcolledge.com/rod_colledge/2010/04/distinct-count-null-analysis-services.html" />
<rdf:li rdf:resource="http://www.rodcolledge.com/rod_colledge/2010/03/built-to-last-for-how-long.html" />
<rdf:li rdf:resource="http://www.rodcolledge.com/rod_colledge/2010/03/speaking-melbourne-sql-server-users-group-tomorrow-evening-hitchhikerss-guide-to-sql-server-management-studio-httpbitl.html" />
<rdf:li rdf:resource="http://www.rodcolledge.com/rod_colledge/2010/02/fun-with-ssis-part-1-troubleshooting.html" />
</rdf:Seq>
</items>

<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rdf+xml" href="http://feeds.feedburner.com/DirtyReadsAndOtherFilthyTales" /><feedburner:info uri="dirtyreadsandotherfilthytales" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /></channel>

<item rdf:about="http://www.rodcolledge.com/rod_colledge/2013/03/see-you-in-chicago.html">
<title>See you in Chicago</title>
<link>http://feedproxy.google.com/~r/DirtyReadsAndOtherFilthyTales/~3/bKApA1VaKes/see-you-in-chicago.html</link>
<description>The SQL Server Community, specifically PASS, has provided me with enormous opportunities for professional growth, and so I always look to give back in whatever way I can. In the last 5 years, my focus has been exclusively on Business...</description>
<content:encoded><![CDATA[<p>The SQL Server Community,
specifically <a href="http://www.sqlpass.org/" target="_blank" title="SQL PASS">PASS</a>, has provided me with enormous opportunities for professional
growth, and so I always look to give back in whatever way I can. In the last 5 years,
my focus has been exclusively on Business Intelligence, so when I heard about
the <a href="http://www.passbaconference.com/" target="_blank" title="PASS Business Analytics Conference">PASS Business Analytics conference</a> being held in April in Chicago, I knew
this was something I wanted to be a part of. I submitted an abstract, and was selected
to speak, so in April, I’ll be making the 18 hour trip to Chicago with one of my
StrataDB colleagues, Mr <a href="http://popbi.wordpress.com/" target="_blank" title="PopBI">PopBI</a>, aka Peter O’Gorman.</p>
<p>What immediately struck me about
the conference is that it uses the phrase “Business Analytics”, instead of “Business
Intelligence”. “Business Intelligence” is used almost universally these days as
a blanket phrase for all sorts of things. So I did some research on the
difference between the two terms; Intelligence is a synonym for “Aptitude”, “Clever”,
and “Brain Power”, all of which are fairly generic terms which could really
mean whatever you want them to mean. “Analytics”, on the other hand, is a
synonym for “Investigation”, “Scrutiny” and “Breakdown” which I believe to be
much more of a descriptive term for the work we as BI professionals are engaged
in.</p>
<p>Before you think I’ve set off on a
self-indulgent grammar excursion, this is a really important distinction,
because what we as BI professionals do, or what we <em>should</em> do, is provide business users with a platform for
information discovery - Investigation, Scrutiny and Breakdown. It’s really
important to understand that the sole reason we exist as IT professionals is not
just to make lots of money and drink beer, but to <em>support the business</em>. At the end of the day, they’re the reason why
we’re here, and if we forget that, they’ll forget about us. So with this in
mind, my session, <a href="http://passbaconference.com/Sessions/SessionDetails.aspx?sid=4096#.UTWcPDCPF5A" target="_blank">Self-Service Business Analytics in 2013</a>, is about how we as
IT professionals can assist the business using the Microsoft BI platform.</p>
<p>Including the term “Self-Service”
in my title was always going to open me up to criticism from my colleagues.
Take this blog post for example, <a href="http://infosolblog.com/self-service-business-intelligence-it%E2%80%99s-wrong-bad-and-shouldn%E2%80%99t-be-anyone%E2%80%99s-goal/" target="_blank">Self-Service Business Intelligence: It’s
Wrong, Bad and Shouldn’t be Anyone’s Goal</a> – Wow, that’s a broad sweeping
statement! Read the post, however, and the core point is that the business cannot
(effectively) perform BI without IT professionals, but the reverse is also
true; IT professionals cannot perform BI without the business. This is
something that Microsoft has long recognised; effective BI systems are those
that combine the traditional strengths of Corporate BI (Data Quality, Security,
Governance and Performance) with the flexibility and agility of Self-Service
BI. Microsoft’s term for this is <a href="https://www.google.com.au/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=2&amp;ved=0CEYQFjAB&amp;url=http%3A%2F%2Fdownload.microsoft.com%2Fdownload%2FC%2FC%2F8%2FCC8ADCCA-5ED1-4B47-9094-5046823A4F17%2FSQL_Server_2012_BI_Overview_Oct2011.pdf&amp;ei=2ps1UYWhJ4qKkwWE34CgDA&amp;usg=AFQjCNGpLYLG_u9zp-letLzs2AJPWc31qA&amp;sig2=jMY9NR78b_bvK8Cxa1w2Pg&amp;bvm=bv.43148975,d.dGI" target="_blank" title="Managed Self-Service BI"><em>Managed</em>
Self-Service BI</a>.</p>
<p>My session will explore the
awesome benefits of <em>Managed</em>
Self-Service BI – how we, as IT professionals, can work <em>with</em> the business to achieve truly meaningful business outcomes. It
is, after all, the whole reason for our existence.</p>
<p>
If you’re a BI professional or a business user with
a keen interest in analytics, this is <em>the</em>
conference to attend in 2013. I’m really pumped about this one, and I’d love to
see you there - I might even shout you an (Australian) beer!</p>
<p>
<a class="asset-img-link" href="http://www.passbaconference.com" style="display: inline;" target="_blank"><img alt="PASS_BAC" border="0" class="asset  asset-image at-xid-6a0111684623b6970c017c375186ec970b image-full" src="http://www.rodcolledge.com/.a/6a0111684623b6970c017c375186ec970b-800wi" title="PASS_BAC" /></a><br /><br /></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?a=bKApA1VaKes:l1suNJNESS8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?i=bKApA1VaKes:l1suNJNESS8:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?a=bKApA1VaKes:l1suNJNESS8:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/DirtyReadsAndOtherFilthyTales/~4/bKApA1VaKes" height="1" width="1"/>]]></content:encoded>


<dc:subject>Business Intelligence</dc:subject>
<dc:subject>Industry</dc:subject>

<dc:creator>Rod Colledge</dc:creator>
<dc:date>2013-03-05T17:27:46+10:00</dc:date>
<feedburner:origLink>http://www.rodcolledge.com/rod_colledge/2013/03/see-you-in-chicago.html</feedburner:origLink></item>
<item rdf:about="http://www.rodcolledge.com/rod_colledge/2010/12/using-policy-based-management-to-check-sysadmin-membership.html">
<title>Using Policy-based Management to Check Sysadmin Membership</title>
<link>http://feedproxy.google.com/~r/DirtyReadsAndOtherFilthyTales/~3/WDOBytP1fpU/using-policy-based-management-to-check-sysadmin-membership.html</link>
<description>I was sent an email recently from a reader of my simple-talk article Policy-based Management and Central Management Servers asking about the usage of the @WindowsUsersAndGroupsInSysadminRole property to detect the existence of sysadmins outside a known base; in other words,...</description>
<content:encoded><![CDATA[<p>I was sent an email recently from a reader of my simple-talk article <a href="http://www.simple-talk.com/sql/database-administration/policy-based-management-and-central-management-servers/" target="_blank">Policy-based Management and Central Management Servers</a> asking about the usage of the <em><strong>@WindowsUsersAndGroupsInSysadminRole</strong></em> property to detect the existence of sysadmins outside a known base; in other words, a scheduled check to see if unauthorised users had gained access to the sysadmin role.</p>
<p>As much as I love Policy-based Management, the documentation and error messages leave a little to be desired, so it wasn&#39;t immediately obvious how to use this property to achieve the desired result.</p>
<p>Here&#39;s the solution...</p>
<p>The trick is using the Array function as shown below. &quot;Field&quot; is simply @WindowsUsersAndGroupsInSysadminRole, but &quot;Value&quot; uses the Array function to convert a CSV list of domain accounts (AD groups or users) into an array data type for comparison with the array data type returned by the @WindowsUsersAndGroupsInSysadminRole function.</p>
<p><a href="http://www.rodcolledge.com/.a/6a0111684623b6970c0148c683a9ef970c-pi" style="display: inline;"><img alt="Condition" border="0" class="asset  asset-image at-xid-6a0111684623b6970c0148c683a9ef970c image-full" src="http://www.rodcolledge.com/.a/6a0111684623b6970c0148c683a9ef970c-800wi" title="Condition" /></a></p>
<p>On my StrataDB development environment, the results of this policy execution is shown below;</p>
<p><a href="http://www.rodcolledge.com/.a/6a0111684623b6970c0148c683b591970c-pi" style="display: inline;"><img alt="Results" border="0" class="asset  asset-image at-xid-6a0111684623b6970c0148c683b591970c image-full" src="http://www.rodcolledge.com/.a/6a0111684623b6970c0148c683b591970c-800wi" title="Results" /></a></p>
<p>The policy failed because the actual list (array) of sysadmin accounts includes more than the expected list (array).</p>
<p>Hope this helps.</p>
<p>Cheers,<br />Rod.</p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?a=WDOBytP1fpU:0otG-a11L2Q:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?i=WDOBytP1fpU:0otG-a11L2Q:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?a=WDOBytP1fpU:0otG-a11L2Q:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/DirtyReadsAndOtherFilthyTales/~4/WDOBytP1fpU" height="1" width="1"/>]]></content:encoded>


<dc:subject>DBA</dc:subject>

<dc:creator>Rod Colledge</dc:creator>
<dc:date>2010-12-08T22:50:02+10:00</dc:date>
<feedburner:origLink>http://www.rodcolledge.com/rod_colledge/2010/12/using-policy-based-management-to-check-sysadmin-membership.html</feedburner:origLink></item>
<item rdf:about="http://www.rodcolledge.com/rod_colledge/2010/10/unrelated-dimensions.html">
<title>Unrelated Dimensions</title>
<link>http://feedproxy.google.com/~r/DirtyReadsAndOtherFilthyTales/~3/Dpi5dJn4ULE/unrelated-dimensions.html</link>
<description>What’s wrong with this picture? I’ve browsed the AdventureWorks cube, and sliced Internet Sales by the Employee Department hierarchy. The same dollar amount ($29,358,677.22) is showing for every employee, which is obviously wrong and the sort of thing that confuses...</description>
<content:encoded><![CDATA[<p>What’s wrong with this picture?</p>
<p><a href="http://www.rodcolledge.com/.a/6a0111684623b6970c0133f547ea43970b-pi" style="display: inline;"><img alt="UnrelatedDimensionSlicing" border="0" class="asset  asset-image at-xid-6a0111684623b6970c0133f547ea43970b image-full" src="http://www.rodcolledge.com/.a/6a0111684623b6970c0133f547ea43970b-800wi" title="UnrelatedDimensionSlicing" /></a></p>
<p>I’ve browsed the AdventureWorks cube, and sliced Internet Sales by the Employee Department hierarchy. The same dollar amount ($29,358,677.22) is showing for every employee, which is obviously wrong and the sort of thing that confuses everyone who uses the cube.</p>
<p>The issue here is that the Employee Department hierarchy is not related to the Internet Sales Amount measure, and by default, the measure’s ALL member (grand total) is shown for any unrelated dimensions.</p>
<p>As a developer, it’s easy to dismiss this as a non-issue; it doesn’t make any sense to slice internet sales by staff member, however, this is the sort of thing that makes business people nervous about the quality of the BI system, and whether or not they trust it.</p>
<p>There’s two ways around this type of problem; Perspectives and IgnoreUnrelatedDimensions.</p>
<p>Perspectives, an Enterprise Edition feature, allows grouping together measures and their related dimensions. In the above example, there’s a “Direct Sales” perspective which excludes the Employee dimension and includes the Internet Sales Amount measure, therefore avoiding this type of invalid cube usage.</p>
<p>The other option is IgnoreUnrelatedDimensions, a property of a measure group, as shown here;</p>
<p>&#0160;  <a href="http://www.rodcolledge.com/.a/6a0111684623b6970c01348867d015970c-pi" style="display: inline;"><img alt="IgnoreUnrelatedDimensions" border="0" class="asset  asset-image at-xid-6a0111684623b6970c01348867d015970c" src="http://www.rodcolledge.com/.a/6a0111684623b6970c01348867d015970c-800wi" title="IgnoreUnrelatedDimensions" /></a> <br /><br /></p>
<p>The default value for this is True, leading to the behaviour in the first image. By setting this to False, as shown here, unrelated dimension slicing is prevented; if attempted, the measure value will be blank, and no dimension members will show.</p>
<p>More details on this property can be found in <a href="http://ms-olap.blogspot.com/2010/04/properly-showing-values-for-unrelated.html" target="_blank">this blog post from Hilmar Buchta</a>.</p>
<p>Cheers,<br />Rod.</p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?a=Dpi5dJn4ULE:cKncYfHHwNc:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?i=Dpi5dJn4ULE:cKncYfHHwNc:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?a=Dpi5dJn4ULE:cKncYfHHwNc:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/DirtyReadsAndOtherFilthyTales/~4/Dpi5dJn4ULE" height="1" width="1"/>]]></content:encoded>


<dc:subject>Business Intelligence</dc:subject>

<dc:creator>Rod Colledge</dc:creator>
<dc:date>2010-10-23T16:43:16+10:00</dc:date>
<feedburner:origLink>http://www.rodcolledge.com/rod_colledge/2010/10/unrelated-dimensions.html</feedburner:origLink></item>
<item rdf:about="http://www.rodcolledge.com/rod_colledge/2010/10/ssas-dynamic-security-kerberos-and-performancepoint.html">
<title>SSAS: Dynamic Security, Kerberos and PerformancePoint</title>
<link>http://feedproxy.google.com/~r/DirtyReadsAndOtherFilthyTales/~3/iNmr6ZYgYTw/ssas-dynamic-security-kerberos-and-performancepoint.html</link>
<description>Richard Lees recently blogged SSAS Dynamic Security. It reminded me that I had an outstanding blog post of my own on the same topic, with a slightly different twist involving PerformancePoint and Kerberos. Before we get to the twist, let’s...</description>
<content:encoded><![CDATA[<p>Richard Lees recently blogged <a href="http://richardlees.blogspot.com/2010/10/ssas-dynamic-security.html" target="_blank">SSAS Dynamic Security</a>. It reminded me that I had an outstanding blog post of my own on the same topic, with a slightly different twist involving PerformancePoint and Kerberos. Before we get to the twist, let’s recap on dynamic security within SQL Server Analysis Services (SSAS).</p>
<p>The concept behind SSAS dynamic security is quite simple. Like SQL Server itself, SSAS uses role based security as a means to restrict the user’s access to various parts of the cube. A commonly cited example is restricting sales people from a particular sales region dimensioning by other sales regions e.g.; Australian sales people should not be able to view sales figures for Canada.</p>
<p>Using an SSAS role, we can implement this quite easily. As shown below, I’ve created a new role, and on the Dimension Data page, restricted the Sales Territory Country to Australia. On the Membership page (not shown), I would then select the appropriate Windows login(s), and those users would then be restricted from dimensioning by countries other than Australia.</p>
<p><a href="http://www.rodcolledge.com/.a/6a0111684623b6970c013488288a04970c-pi" style="display: inline;"><img alt="CreateRole" border="0" class="asset  asset-image at-xid-6a0111684623b6970c013488288a04970c image-full" src="http://www.rodcolledge.com/.a/6a0111684623b6970c013488288a04970c-800wi" title="CreateRole" /></a></p>
<p>&#0160;</p>
<p>So far so good. Nice and easy. But, let’s imagine a situation in which there were thousands of sales territories. Creating a role for each one of them (and then managing membership over time) is simply not feasible.</p>
<p>Enter dynamic security. In essence, we use a many to many structure which maintains the mappings between users and allowed dimension members in tables. Using the AdventureWorks sample, we would create a table structure like this ...</p>
<p><a href="http://www.rodcolledge.com/.a/6a0111684623b6970c0133f508c1c7970b-pi" style="display: inline;"><img alt="Schema" border="0" class="asset  asset-image at-xid-6a0111684623b6970c0133f508c1c7970b image-full" src="http://www.rodcolledge.com/.a/6a0111684623b6970c0133f508c1c7970b-800wi" title="Schema" /></a></p>
<p>&#0160;</p>
<p>The UserTerritoryBridge table simply maps users (Windows accounts) to Sales Territories. In a typical BI implementation, this data would be maintained by an ETL process from the source system that defines such mappings. Note that the structure allows for 1 user to be mapped to many territories and vice versa. A true &quot;many to many&quot; relationship.</p>
<p>The next step is defining the usage of these tables inside Analysis Services. In summary, we create a dimension using the dimUser table, and a measure group using the UserTerritoryBridge table. Such a measure group is commonly called a “factless fact table”. In both cases, we make their measures and attributes hidden; we don’t want users seeing them, they’re meaningless and there for security purposes only. Once defined, the cube structure looks like this ...</p>
<p>&#0160;</p>
<p><a href="http://www.rodcolledge.com/.a/6a0111684623b6970c0133f508c405970b-pi" style="display: inline;"><img alt="Cubestructure" border="0" class="asset  asset-image at-xid-6a0111684623b6970c0133f508c405970b" src="http://www.rodcolledge.com/.a/6a0111684623b6970c0133f508c405970b-800wi" title="Cubestructure" /></a></p>
<p>&#0160;</p>
<p>... and the dimension usage looks like this ...</p>
<p>&#0160;</p>
<p><a href="http://www.rodcolledge.com/.a/6a0111684623b6970c0133f508c449970b-pi" style="display: inline;"><img alt="Dimensionusage" border="0" class="asset  asset-image at-xid-6a0111684623b6970c0133f508c449970b" src="http://www.rodcolledge.com/.a/6a0111684623b6970c0133f508c449970b-800wi" title="Dimensionusage" /></a></p>
<p>&#0160;</p>
<p>With those structures in place, we can go back to our role, and modify it to be dynamic, i.e.; instead of creating a role per user/group, we now have a single role which handles ALL users. We do that by first selecting “Deselect all members” on the Basic tab, and then on the advanced tab use an MDX expression as follows ...</p>
<p>&#0160;</p>
<p><a href="http://www.rodcolledge.com/.a/6a0111684623b6970c0133f508c551970b-pi" style="display: inline;"><img alt="Dynamicrole" border="0" class="asset  asset-image at-xid-6a0111684623b6970c0133f508c551970b image-full" src="http://www.rodcolledge.com/.a/6a0111684623b6970c0133f508c551970b-800wi" title="Dynamicrole" /></a></p>
<p>&#0160;</p>
<p>This expression uses the UserName() function to determine the current user, and uses that to filter out the Sales Territory Country members the user is not setup to view. Note the “Enable Visual Totals” checkbox down the bottom. This ensures the user can only see measure totals for the dimension members they can see. Without that selected, they will see totals for all countries, including those they cannot see when browsing the cube.</p>
<p>So that’s a basic implementation of SSAS dynamic security. Now comes the twist (with triple pike).</p>
<p>Consider an implementation of a PerformancePoint dashboard through SharePoint 2010 which uses the cube as a data source i.e.; a user browsing the cube through a PerformancePoint dashboard. In terms of user authentication/delegation, we have;</p>
<ol>
<li>The user logs onto Windows,</li>
<li>The user connects to SharePoint,</li>
<li>SharePoint launches PerformancePoint services to invoke a Dashboard,</li>
<li>The Dashboard connects to Analysis Services</li>
</ol>
<p>This is Kerberos heaven (or hell). There’s a lot of hopping there. More hops than a Kangaroo on a caffeine binge. There’s a lot that can go wrong, particularly when you add an ISA/Proxy server to the mix.</p>
<p>From a PerformancePoint perspective, there are now 3 authentication options for data sources;</p>
<p>&#0160;</p>
<p><a href="http://www.rodcolledge.com/.a/6a0111684623b6970c013488289280970c-pi" style="display: inline;"><img alt="Pps" border="0" class="asset  asset-image at-xid-6a0111684623b6970c013488289280970c image-full" src="http://www.rodcolledge.com/.a/6a0111684623b6970c013488289280970c-800wi" title="Pps" /></a></p>
<p>&#0160;</p>
<p>Unattended Service Account (first option) is fairly straight forward – All users connect to the data source using the security context of the defined account. Simple, but not granular enough for custom security.</p>
<p>Per-User Identity (third option) solves this problem, assuming you have a working Kerberos environment.</p>
<p>An additional option is listed in the middle; “Unattended Service Account and add authenticated user name in connection string”.&#0160; As per the description, this adds the user’s login details to the connection string, and can be consumed within Analysis Services by using the CustomData() function, instead of the UserName() function, which is a nice little workaround for environments that are “Kerberos challenged”.</p>
<p>Now, something important to point out here is that this does not mean we can forget about Kerberos. As Richard and I discussed in the comments on his post, someone with access to the SSAS cube through a different front end client could potentially circumvent the intended security by altering the CustomData component of the connection string to connect as a different user. This presupposes a sophisticated user, but it’s a concern nonetheless. So at best, this is a temporary workaround for environments that ONLY use PerformancePoint as the front end for their BI solution.</p>
<p>To finish, I just wanted to leave you with this blog post from Adam Saxton, titled <a href="http://blogs.msdn.com/b/psssql/archive/2010/06/23/my-kerberos-checklist.aspx" target="_blank">“My Kerberos Checklist…”</a></p>
<p>Enjoy :-)</p>
<p>&#0160;</p>
<p>Cheers,</p>
<p>Rod.</p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?a=iNmr6ZYgYTw:54GWScv8yb0:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?i=iNmr6ZYgYTw:54GWScv8yb0:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?a=iNmr6ZYgYTw:54GWScv8yb0:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/DirtyReadsAndOtherFilthyTales/~4/iNmr6ZYgYTw" height="1" width="1"/>]]></content:encoded>


<dc:subject>Business Intelligence</dc:subject>

<dc:creator>Rod Colledge</dc:creator>
<dc:date>2010-10-13T21:44:02+10:00</dc:date>
<feedburner:origLink>http://www.rodcolledge.com/rod_colledge/2010/10/ssas-dynamic-security-kerberos-and-performancepoint.html</feedburner:origLink></item>
<item rdf:about="http://www.rodcolledge.com/rod_colledge/2010/09/project-phoenix-update-1.html">
<title>Project Phoenix ... Update 1</title>
<link>http://feedproxy.google.com/~r/DirtyReadsAndOtherFilthyTales/~3/zRPLoVSNF0c/project-phoenix-update-1.html</link>
<description>Since my first Project Phoenix post, I’ve received a lot of interest from MVPs, Vendors and the community in general, and I’m pleased to announce the following updates; MVPs Greg Low and Arnie Rowland have each contributed one of their...</description>
<content:encoded><![CDATA[<p>Since <a href="http://www.rodcolledge.com/rod_colledge/2010/09/project-.html" target="_blank">my first Project Phoenix post</a>, I’ve received a lot of interest from MVPs, Vendors and the community in general, and I’m pleased to announce the following updates;</p><ol>
<li>MVPs <a href="http://sqlblog.com/blogs/greg_low/default.aspx" target="_blank">Greg Low</a> and <a href="http://sqlblog.com/blogs/arnie_rowland/default.aspx" target="_blank">Arnie Rowland</a> have each contributed one of their MSDN subscriptions, bringing the total to 5 so far,</li>
<li>We’re expanding the project to include New Zealand,</li>
<li><a href="http://www.telerik.com/" target="_blank">Telerik </a>have kindly volunteered their <a href="http://www.telerik.com/company/press-center/company-news/telerik%E2%80%99s-ultimate-collection-for-net-named-%E2%80%9Cbest-of-teched-2010%E2%80%9D-by-windows-it-pro-and-sql-server-magazines.aspx" target="_blank">Ultimate Collection for .NET product</a>,</li>
<li>More details on additional training and learning products to come in the following days!</li>
</ol>
<p>Further, we now have the links available for both under/unemployed applicants and non-profits to submit project proposals.</p><ul>
<li>Under/unemployed applicants, <a href="https://spreadsheets.google.com/viewform?hl=en&amp;formkey=dERRMkRIQV9YcFFkdV90dXcydDd6VFE6MQ#gid=0" target="_blank">submit project proposals here</a></li>
<li>Non-profits, <a href="https://spreadsheets.google.com/viewform?hl=en&amp;formkey=dFhXMUtoazdEVkotZEQ1N2FWSEhEN1E6MQ#gid=0" target="_blank">submit project proposals here</a></li>
</ul>
<p>More details to follow, all of which will be posted to the <a href="http://www.rodcolledge.com/rod_colledge/project-phoenix.html" target="_blank">dedicated Project Phoenix page</a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?a=zRPLoVSNF0c:tgu36qgNSEg:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?i=zRPLoVSNF0c:tgu36qgNSEg:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?a=zRPLoVSNF0c:tgu36qgNSEg:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/DirtyReadsAndOtherFilthyTales/~4/zRPLoVSNF0c" height="1" width="1"/>]]></content:encoded>


<dc:subject>MVP</dc:subject>
<dc:subject>Project Phoenix</dc:subject>

<dc:creator>Rod Colledge</dc:creator>
<dc:date>2010-09-15T22:19:50+10:00</dc:date>
<feedburner:origLink>http://www.rodcolledge.com/rod_colledge/2010/09/project-phoenix-update-1.html</feedburner:origLink></item>
<item rdf:about="http://www.rodcolledge.com/rod_colledge/2010/09/project-.html">
<title>Project Phoenix</title>
<link>http://feedproxy.google.com/~r/DirtyReadsAndOtherFilthyTales/~3/c3Q_H3pgh9k/project-.html</link>
<description>Update; Project submission links and further details available here In January this year, I received the MVP award for my contributions to the SQL Server community, joining an amazing group of people from around the world, each of which contribute...</description>
<content:encoded><![CDATA[<p style="text-align: justify;">Update; <a href="http://www.rodcolledge.com/rod_colledge/project-phoenix.html" target="_blank">Project submission links and further details available here</a></p><p style="text-align: justify;">In January this year, I received the MVP
 award for my contributions to the SQL Server community, joining an 
amazing group of people from around the world, each of which contribute 
to the community in their own unique way. Be it running user groups or 
websites, writing blogs or speaking at events, each of these people 
contribute their own time to make our community the vibrant and dynamic 
success that it is today.</p><p style="text-align: justify;">This year, 
Microsoft rewarded MVPs with 3 MSDN Ultimate subscriptions to give away 
in any manner of their choosing. Each MSDN Ultimate subscription grants 
access to Visual Studio Ultimate, SQL Server, Windows Server and almost 
all other Microsoft software. I’ve wrestled with many different ideas on
 how best to give these away, none of which I was really happy with; 
each of these subscriptions retail at ~ $12,000 USD, so it’s not an easy
 decision.</p><p style="text-align: justify;">Recently, I was <a href="http://sqlblog.com/blogs/arnie_rowland/archive/2010/07/30/like-a-phoenix-rising-from-the-ashes.aspx" target="_blank">inspired 
by MVP Arnie Rowland’s decision to create Project Phoenix</a>, a program in 
which under/unemployed people are granted software, books &amp; training
 materials in return for devoting their time to develop solutions for 
non-profit organisations. In Arnie’s own words ...</p><blockquote><p><em>&quot;...The
 idea is to provide the recipient access to all of the tools needed to 
improve his/her skills, an opportunity to gain practical experience, the
 potential to earn a recommendation and/or referral –and to positively 
contribute to society as a form of &#39;give-back&#39;. No free lunch, just 
sweat equity –the kind that makes us all feel good for the effort...&quot;</em></p></blockquote><p style="text-align: justify;">The
 program, based in the US, has been an amazing success, and looks to be 
gaining in strength. A truly inspirational idea from Arnie, and exactly 
the type of thing that makes me proud to be a fellow MVP.</p><p style="text-align: justify;">I
 asked Arnie about the possibility of running something similar in 
Australia, and he enthusiastically supports the idea, so today, I’m 
announcing Australia’s own Project Phoenix, and to kick start the 
program, I’ll be donating my own 3 MSDN subscriptions. In coming weeks, 
I’ll be announcing more details, including qualification/award rules, 
and a formal application process. For now, this is a call to arms;</p><ol>
<li>If
 you’re an Australian non-profit organisation in need of 
software/database development services, <a href="mailto:rod@stratadb.com">email me</a> a description of the 
services required and your location,</li>
<li>If you’re from an 
organisation willing to contribute books, software, hardware or 
training, <a href="mailto:rod@stratadb.com">email me</a> the details of what you’ll contribute,</li>
<li>If you’re an MVP willing to contribute your MSDN licenses to this program, <a href="mailto:rod@stratadb.com">email me</a>,</li>
<li>If
 you’re a successful software developer willing to assist the award 
recipients in their development efforts, <a href="mailto:rod@stratadb.com">email me</a> the support services 
you can provide</li>
</ol>
Together, let’s make this happen.<br /><br />Cheers,<br /><p>Rod.</p><p style="text-align: justify;">Update; <a href="http://www.rodcolledge.com/rod_colledge/project-phoenix.html" target="_blank">Project submission links and further details available here</a><br />
</p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?a=c3Q_H3pgh9k:tiTFK4Zw49Q:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?i=c3Q_H3pgh9k:tiTFK4Zw49Q:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?a=c3Q_H3pgh9k:tiTFK4Zw49Q:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/DirtyReadsAndOtherFilthyTales/~4/c3Q_H3pgh9k" height="1" width="1"/>]]></content:encoded>


<dc:subject>MVP</dc:subject>
<dc:subject>Project Phoenix</dc:subject>

<dc:creator>Rod Colledge</dc:creator>
<dc:date>2010-09-12T09:48:07+10:00</dc:date>
<feedburner:origLink>http://www.rodcolledge.com/rod_colledge/2010/09/project-.html</feedburner:origLink></item>
<item rdf:about="http://www.rodcolledge.com/rod_colledge/2010/04/distinct-count-null-analysis-services.html">
<title>Distinct Count, NULL &amp; Analysis Services</title>
<link>http://feedproxy.google.com/~r/DirtyReadsAndOtherFilthyTales/~3/kc4hlpRMWVg/distinct-count-null-analysis-services.html</link>
<description>Consider the following record set … A B C NULL D … and the following T-SQL command; SELECT COUNT(DISTINCT(&lt;value&gt;)) FROM &lt;table&gt; In SQL Server, running the above command on the record set will return 4, because the NULL value is...</description>
<content:encoded><![CDATA[Consider the following record set …<br /><br />A<br />B<br />C<br />NULL<br />D<br /><br />… and the following T-SQL command;<br /><br />SELECT COUNT(DISTINCT(&lt;value&gt;))<br />FROM &lt;table&gt;<br /><br />In SQL Server, running the above command on the record set will return 4, because the NULL value is ignored. What about the equivalent command in Analysis Services? More on that shortly …<br /><br />I’m currently implementing a BI solution for a client in which the fact table contains a “Purchase Order” column. The granularity of the fact table is the invoice line item, with dimensions for products, clients, date etc …. Two of the questions this solution needs to answer are;<br /><p>1.&#0160;&#0160;&#0160; How many invoices did we process?, and <br />2.&#0160;&#0160;&#0160; How many purchase orders did we process?<br /><br />The answer to the first question is easy. Every invoice in the fact table contains an invoice number so we can use a simple DistinctCount aggregate function to return the number of invoices as a measure. Note we use *distinct* count instead of count because the granularity of the fact table is the line item, so many rows will have the same invoice number.<br /><br />Answering the second question (how many purchase orders) is a little bit more difficult. Not every invoice has a corresponding purchase order. “Direct invoices” are those that are paid without needing to have a pre-existing purchase order. In these cases, the Purchase Order column is NULL.<br /><br />Back to the example at the start of the post; a distinct count in Analysis Services works differently than T-SQL. Where T-SQL will return 4, Analysis Services returns 5, considering NULL as something different than the other values. As a result, using the same DistinctCount aggregate function on the purchase order column will return one more than it should, assuming there are some invoices with a NULL purchase order value.<br /><br />There’s a few ways around this problem, but the method I used was to create a new named calculation column in the data source view called NULL_PO_Exists with the following expression;<br /><br />CASE WHEN PurchaseOrder IS NULL THEN 1 ELSE 0 END</p><p><br />Next, I created a new hidden measure called [Maximum NULL PO Exists] which used the MAX aggregate function over the NULL_PO_Exists column.<br /><br />Next up, I set the visible property to false for the existing Purchase Order count measure called [Total Purchase Orders], and created a new calculation [Purchase Order Total] which used the following expression;<br /><br />[Measures].[Total Purchase Orders] - [Measures].[Maximum NULL PO Exists]<br /><br />In summary, the new measure is using the old measure as a base, and then subtracting 1 (if NULLS exist) or 0 (if no NULLS exist). A bit of fiddling around, but it works :-)<br /><br />Finally, there’s a number of performance considerations when using distinct count. <a href="http://sqlcat.com/whitepapers/archive/2008/04/17/analysis-services-distinct-count-optimization.aspx" target="_blank">This white paper from Denny Lee</a> does a great job of explaining the problem and a number of best practices for optimizing its performance.<br /><br />Cheers,</p><p>Rod.</p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?a=kc4hlpRMWVg:raHP_gAk-KU:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?i=kc4hlpRMWVg:raHP_gAk-KU:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?a=kc4hlpRMWVg:raHP_gAk-KU:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/DirtyReadsAndOtherFilthyTales/~4/kc4hlpRMWVg" height="1" width="1"/>]]></content:encoded>


<dc:subject>Business Intelligence</dc:subject>

<dc:creator>Rod Colledge</dc:creator>
<dc:date>2010-04-23T23:02:29+10:00</dc:date>
<feedburner:origLink>http://www.rodcolledge.com/rod_colledge/2010/04/distinct-count-null-analysis-services.html</feedburner:origLink></item>
<item rdf:about="http://www.rodcolledge.com/rod_colledge/2010/03/built-to-last-for-how-long.html">
<title>Built to last .... for how long?</title>
<link>http://feedproxy.google.com/~r/DirtyReadsAndOtherFilthyTales/~3/A2nshyeohvg/built-to-last-for-how-long.html</link>
<description>One of the enduring memories from my childhood was my father bemoaning the design and build quality of contemporary objects. Whether it was the aesthetics of a newly constructed building or the durability of a recently acquired television, the song...</description>
<content:encoded><![CDATA[One of the enduring memories from my childhood was my father bemoaning the design and build quality of contemporary objects. Whether it was the aesthetics of a newly constructed building or the durability of a recently acquired television, the song remained the same … <em>“They don’t build ‘em like they did in my day”</em>.<br /><br />In many ways he was right, although what he meant by <em>“my day”</em> was never well defined. Presumably <em>“his day”</em> included the construction of the pyramids and the Sistine Chapel! His point, while imbued with plenty of artistic license, raises a good question; Are we less concerned with build quality today?<br /><br />In exploring this question, let’s use a 2 year old cell phone as an example. If my 2 year old phone stops working, do I send it away for repair? No, I buy a new one because a) it will probably be cheaper than repairing the old one and b) the technology has improved so much that I’ll get a much better phone anyway. The manufacturers know this, so they have no real incentive to engineer products that outlast the warranty period.<br /><br />In that context, when it comes to database design, there are a number of important questions we need to ask ourselves as database professionals. Firstly, how much time should we spend engineering designs that achieve maximum performance when modern hardware can easily mask the effects of poor design, and secondly, with the increasing emphasis on timely delivery of working solutions, how much time should we spend on flexible designs that cater for unknown future usage scenarios?<br /><br />The answer to both of those questions is “it depends”. A purist would argue otherwise, but a pragmatic design approach suggests that we take advantage of modern hardware and spend less time wringing every last drop of performance from our designs. In a similar manner, a certain element of design flexibility can deliver future cost savings, but should not be used as a substitute for gathering business requirements at the commencement of a development project.<br /><br />Flexible and high performance database designs are often the unconscious side effect of using an experienced designer, someone whose default approach to database design has been shaped over many years of experience. Those same people often cringe when they see the work of less experienced practitioners whose designs only work due to the modern hardware they run on.<br /><br />In terms of design flexibility, an area I often target is the relationships between entities. For example, a classic entity relationship is between a product and a product category. There’s a number of ways of representing this relationship. We could store the category as a column within the product table, or create a separate table for categories and include a foreign key in the product table. In both cases, there are inherent design limitations here; What if we need to include subcategories, or add a product to more than one category? With a little bit more thought, we can create a many to many table between products and categories, and design a parent-child relationship within the categories table. Such a design provides a lot more flexibility, and the cost of implementing the design up front is orders of magnitude cheaper than retrofitting the design at a later point.<br /><br />Performance can be seen in a similar light; the system may perform fine with the current production load, but what happens if the user base triples overnight? Depending on the application design, throwing more hardware at the problem may not be a viable solution.<br /><br />While this post doesn’t provide any answers, I hope that these questions make you think about the database design process a little more deeply, and perhaps help you to build a solution that stands the test of time, and maybe even make my father stand back and admire your creation :-)<br /><p>Cheers</p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?a=A2nshyeohvg:dpYVnopbhDU:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?i=A2nshyeohvg:dpYVnopbhDU:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?a=A2nshyeohvg:dpYVnopbhDU:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/DirtyReadsAndOtherFilthyTales/~4/A2nshyeohvg" height="1" width="1"/>]]></content:encoded>


<dc:subject>DBA</dc:subject>
<dc:subject>Industry</dc:subject>

<dc:creator>Rod Colledge</dc:creator>
<dc:date>2010-03-23T17:48:52+10:00</dc:date>
<feedburner:origLink>http://www.rodcolledge.com/rod_colledge/2010/03/built-to-last-for-how-long.html</feedburner:origLink></item>
<item rdf:about="http://www.rodcolledge.com/rod_colledge/2010/03/speaking-melbourne-sql-server-users-group-tomorrow-evening-hitchhikerss-guide-to-sql-server-management-studio-httpbitl.html">
<title />
<link>http://feedproxy.google.com/~r/DirtyReadsAndOtherFilthyTales/~3/cmT-ozsOyqA/speaking-melbourne-sql-server-users-group-tomorrow-evening-hitchhikerss-guide-to-sql-server-management-studio-httpbitl.html</link>
<description>Speaking @ Melbourne SQL Server User's Group tomorrow evening. "Hitchhiker's Guide to SQL Server Management Studio" http://bit.ly/9tvbkU</description>
<content:encoded><![CDATA[Speaking @ Melbourne SQL Server User&#39;s Group tomorrow evening. &quot;Hitchhiker&#39;s Guide to SQL Server Management Studio&quot; <a href="http://bit.ly/9tvbkU">http://bit.ly/9tvbkU</a><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?a=cmT-ozsOyqA:_ofOwRpe3S8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?i=cmT-ozsOyqA:_ofOwRpe3S8:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?a=cmT-ozsOyqA:_ofOwRpe3S8:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/DirtyReadsAndOtherFilthyTales/~4/cmT-ozsOyqA" height="1" width="1"/>]]></content:encoded>



<dc:creator>Rod Colledge</dc:creator>
<dc:date>2010-03-15T11:42:10+10:00</dc:date>
<feedburner:origLink>http://www.rodcolledge.com/rod_colledge/2010/03/speaking-melbourne-sql-server-users-group-tomorrow-evening-hitchhikerss-guide-to-sql-server-management-studio-httpbitl.html</feedburner:origLink></item>
<item rdf:about="http://www.rodcolledge.com/rod_colledge/2010/02/fun-with-ssis-part-1-troubleshooting.html">
<title>Fun with SSIS - Part 1 - Troubleshooting</title>
<link>http://feedproxy.google.com/~r/DirtyReadsAndOtherFilthyTales/~3/sr7RqiMu57A/fun-with-ssis-part-1-troubleshooting.html</link>
<description>Although I still consider myself a DBA, the last few years have seen me spend more and more time in the Business Intelligence development space (SSIS development in particular). In this the first of a 2-part SSIS series, I’ll be...</description>
<content:encoded><![CDATA[<p>Although I still consider myself a DBA, the last few years have seen me spend more and more time in the Business Intelligence development space (SSIS development in particular). In this the first of a 2-part SSIS series, I’ll be focusing on a number of SSIS “issues” I’ve discovered the hard way.</p><p><span style="color: #4040ff; font-size: 18px;">1: Case Sensitivity</span></p><p>I’ve never been particularly good at using case consistently, the perfect example of which was my publisher asking me to edit hundreds of figure captions in my <a href="http://www.amazon.com/gp/product/193398872X?ie=UTF8&amp;tag=wwwrodcolledg-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=193398872X" target="_blank">recently published book</a>. Like most people of my age who took a college course in programming, I studied C, and spent countless hours debugging problems traced back to the incorrect case of variable names (and using “=” instead of “==” !).</p><p>When I decided to specialize in SQL Server administration, I rejoiced at the lack of case sensitivity involved, although I occasionally see databases with the case sensitive option, in most cases (pardon the pun) installed my accident.</p><p>Imagine my angst when I discovered that a tool I’m spending more and more time with is rampantly case sensitive. Almost everything about SSIS is case sensitive; the expression language, variable names and one that gets me every time; lookups.</p><p>A very common SSIS data flow transformation is <em>lookup</em>. As the name implies, it’s most often used to lookup a key value based on a text value in the data flow. For example, in the figure below, we’re returning the supplierKey based on the supplierName value. The first screen defines the lookup source, and the second defines the join condition and what value is to be returned.</p><p><a href="http://www.rodcolledge.com/.a/6a0111684623b6970c0128777d1852970c-pi" style="display: inline;"><img alt="1" border="0" class="asset asset-image at-xid-6a0111684623b6970c0128777d1852970c image-full " src="http://www.rodcolledge.com/.a/6a0111684623b6970c0128777d1852970c-800wi" title="1" /></a> <br /> </p><p>This, for all intents and purposes, in a simple join condition with a column from the joined table being returned. However, unlike T-SQL, the SSIS lookup <em>is </em>case sensitive.</p><p>The obvious way to address this is to ensure both the lookup column (vendorName in this example) and the matching data flow field (Supplier) are set to the same case using the UPPER (or LOWER) function. For the lookup, that’s a simple case of changing the lookup source T-SQL to use one of those functions. For the data flow field, we could use the <em>derived column transformation </em>using the same function, and use that column in the lookup process.</p><p><span style="color: #4040ff; font-size: 18px;">2: Strong Typing</span><br />
</p>
<p>If there was any remaining doubt that SSIS was designed for developers (and not classic DBAs) it’s confirmed in its (very) strong typing. As an example of that, let’s revisit the lookup example from above. A previous version of the database had the Supplier data type set to varchar(50) and vendorName set to nvarchar(255). When we try and connect these in the lookup, we’ll get the following error;</p><p><a href="http://www.rodcolledge.com/.a/6a0111684623b6970c0128777d1f5c970c-pi" style="display: inline;"><img alt="2" border="0" class="asset asset-image at-xid-6a0111684623b6970c0128777d1f5c970c image-full " src="http://www.rodcolledge.com/.a/6a0111684623b6970c0128777d1f5c970c-800wi" title="2" /></a> <br />&#0160; </p><p>Another common issue with mismatched data types is when inserting rows into a table at the end of a data flow task. If the destination table’s column length is shorter than the source, you’ll get a warning such as this one;</p><p><a href="http://www.rodcolledge.com/.a/6a0111684623b6970c0120a87aa229970b-pi" style="display: inline;"><img alt="3" border="0" class="asset asset-image at-xid-6a0111684623b6970c0120a87aa229970b image-full " src="http://www.rodcolledge.com/.a/6a0111684623b6970c0120a87aa229970b-800wi" title="3" /></a> <br /> </p><p>Unless you have the luxury of an enterprise wide data dictionary (that every one adheres to), data type variances such as these are common, with the most frequent SSIS workarounds being to either CAST the columns in the data source selection (e.g.; using a view) and/or using type casts in a derived column transformation (more on that in part 2 of this blog series)</p><p><span style="color: #4040ff; font-size: 18px;">3: 64-bit Trickery</span><br />
</p>

<p>There will presumably come a day when everything works on 64-bit, and that day can’t come soon enough. In the meantime, we have to deal with a variety of annoying problems, one of which is 64-bit driver support in SSIS.</p><p>A common data source for SSIS packages are Excel files. The current (and all previous) versions of Excel do not include 64-bit drivers. This presents a problem when SSIS packages run in 64-bit environments, and the error messages returned are far from helpful (unless you consider <em>“The AcquireConnection method call to the connection manager blah failed with error code blah”</em> helpful).</p><p>Fortunately, there’s an easy workaround for this issue, via a property called <em>Run64BitRuntime</em> accessed through the Debugging page of the project’s properties window. As per the figure below, setting this property to <em>False </em>(it’s true by default) will use the 32-bit driver.</p><p><a href="http://www.rodcolledge.com/.a/6a0111684623b6970c0128777d2099970c-pi" style="display: inline;"><img alt="4" border="0" class="asset asset-image at-xid-6a0111684623b6970c0128777d2099970c image-full " src="http://www.rodcolledge.com/.a/6a0111684623b6970c0128777d2099970c-800wi" title="4" /></a> <br /> </p><p>Note that there are a whole range of other considerations for 64-bit mode, for example when calling child packages from a parent with a different setting for this value. For a great blog post on these issues visit <a href="http://toddmcdermid.blogspot.com/2009/10/quick-reference-ssis-in-32-and-64-bits.html" target="_blank">Todd McDermid’s post&#0160;</a> from last year.</p><p><span style="color: #4040ff; font-size: 18px;">4: Package Configurations</span><br />
</p>


<p>One of the real SSIS horror stories that I was very close to (but not responsible for!) was an SSIS package that was run against a production database by accident (blowing away gigabytes of production data). The package used a production configuration file instead of a test/development file. There’s a couple of aspects to this (all too common) problem; configuration technique and security. </p><p>Firstly, configuration technique. SSIS allows a number of ways of configuring settings such as server and database name. The most common one is to use an XML configuration file, the path to which is either stored within the package itself, or set through an environment variable.</p><p>I’ve seen problems with both of these techniques. Using a configuration file location (as per the example below) assumes that all servers on which the package runs has the same path available, which is quite often not the case.</p><p><a href="http://www.rodcolledge.com/.a/6a0111684623b6970c0120a87aa3e9970b-pi" style="display: inline;"><img alt="5" border="0" class="asset asset-image at-xid-6a0111684623b6970c0120a87aa3e9970b " src="http://www.rodcolledge.com/.a/6a0111684623b6970c0120a87aa3e9970b-800wi" title="5" /></a> <br /> </p><p>The environment variable option can also present some problems, notably the need to reboot the server for the variable to come into effect. Depending on the environment, rebooting production servers is not the easiest thing to do.</p><p>Another alternative to both of the above is one that I discovered while listening to <a href="http://sqldownunder.com/PreviousShows/tabid/98/Default.aspx" target="_blank">Greg Low’s SQLDownUnder podcast with Jamie Thompson</a>&#0160; in which Greg spoke of the idea of connecting to a special configuration database which stored the configuration settings. The settings returned were based on the calling machine’s context and then used to set the value of package variables for subsequent use.</p><p>Regardless of the configuration technique, one of the really important considerations is security. In each of the above techniques, mistakes can still be made. For example, a production configuration file can be copied over the top of a development file, or the incorrect settings stored in a configuration database. </p><p>To prevent these types of configuration errors from killing a production database, we need to ensure that the security context of an SSIS package prevents it from accessing the wrong environment. There are at least two ways of achieving this; using separate service accounts in each environment (and making sure the account only has database permissions in the appropriate environment), or better still, having the production database in a separate domain with trust permissions removed to the other domain(s). </p><p>With the appropriate security setup, even if the wrong configuration file is used, the package will fail to run due to the lack of database permissions.</p><p><span style="color: #4040ff; font-size: 18px;">5: Miscellaneous Silly Business</span><br />
</p>



<p>Finally, there’s a number of really silly things I continue to do that I shouldn’t (I’m a slow learner). Firstly, the <em>evaluate as expression</em> property.</p><p>A common design pattern in SSIS packages is to use a variable as the source for an Execute SQL task. The variable’s value is then set using an expression which references another variable. A common example of this is a variable that contains an update command with a where clause containing the value of a BatchID variable. The expression property contains the code that references the other variable.</p><p>If you use this type of arrangement, make sure the variable&#39;s <em>evaluate as expression</em> property is set to TRUE, as per the example below. I’ve spent many hours debugging problems where I’ve simply forgotten to set this properly.</p><p><a href="http://www.rodcolledge.com/.a/6a0111684623b6970c0120a87aa515970b-pi" style="display: inline;"><img alt="6" border="0" class="asset asset-image at-xid-6a0111684623b6970c0120a87aa515970b " src="http://www.rodcolledge.com/.a/6a0111684623b6970c0120a87aa515970b-800wi" title="6" /></a> <br /> </p><p>To wrap up this post, I frequently want to add an existing .dtsx package (e.g.; from another project) to the current project. By default I right click the <em>SSIS Packages</em> node in solution explorer and choose the .dtsx package that I’ve already copied into the project directory. I’m then confused as to why the package is renamed e.g.; from Package.dtsx to Package(1).dtsx. </p><p>It turns out that the <em>Add Existing Package</em> menu is really designed for adding a package from a different location (i.e.; remote server), and if you use it locally, it makes a copy (and renames) the file.</p><p>For the situation I described, using the <em>Add &gt; Existing Item</em> option (instead of Add Existing Package from the SSIS Packages menu) is the correct option. The figure below compares these 2 options side by side.</p><p><a href="http://www.rodcolledge.com/.a/6a0111684623b6970c0120a87aa5c1970b-pi" style="display: inline;"><img alt="7" border="0" class="asset asset-image at-xid-6a0111684623b6970c0120a87aa5c1970b image-full " src="http://www.rodcolledge.com/.a/6a0111684623b6970c0120a87aa5c1970b-800wi" title="7" /></a> <br /> In the next post, I’ll talk about some important SSIS performance tuning tips.</p><p>Cheers<br /> </p><p> </p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?a=sr7RqiMu57A:V5xGJz4KHmI:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?i=sr7RqiMu57A:V5xGJz4KHmI:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?a=sr7RqiMu57A:V5xGJz4KHmI:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/DirtyReadsAndOtherFilthyTales?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/DirtyReadsAndOtherFilthyTales/~4/sr7RqiMu57A" height="1" width="1"/>]]></content:encoded>


<dc:subject>Business Intelligence</dc:subject>

<dc:creator>Rod Colledge</dc:creator>
<dc:date>2010-02-09T22:40:38+10:00</dc:date>
<feedburner:origLink>http://www.rodcolledge.com/rod_colledge/2010/02/fun-with-ssis-part-1-troubleshooting.html</feedburner:origLink></item>


</rdf:RDF><!-- ph=1 -->
