<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Cathy Dumas's Blog</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/cathyk/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/cathyk/feed.xml</link>
    <description />
    <lastBuildDate>Wed, 17 Apr 2019 03:20:29 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Last day at Microsoft</title>
      <link>https://docs.microsoft.com/archive/blogs/cathyk/last-day-at-microsoft</link>
      <pubDate>Thu, 22 Dec 2011 11:09:11 GMT</pubDate>
      <dc:creator><![CDATA[Cathy Dumas -]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/cathyk/2011/12/22/last-day-at-microsoft/</guid>
      <description><![CDATA[Hi, today is my last day at Microsoft. I am moving back home to Vancouver, BC.  I won’t be allowed...]]></description>
      <content:encoded><![CDATA[<p>Hi, today is my last day at Microsoft. I am moving back home to Vancouver, BC.</p>  <p>I won’t be allowed to post to my MSDN blog any more, so I found a new home at <a href="http://cathydumas.com/">http://cathydumas.com/</a>. You can watch there for updates.&#160; You can also contact me through my blog and on Linked In. </p>  <p>Cheers</p>]]></content:encoded>
    </item>
    <item>
      <title>The Hans Rosling project</title>
      <link>https://docs.microsoft.com/archive/blogs/cathyk/the-hans-rosling-project</link>
      <pubDate>Wed, 21 Dec 2011 16:40:05 GMT</pubDate>
      <dc:creator><![CDATA[Cathy Dumas -]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/cathyk/2011/12/21/the-hans-rosling-project/</guid>
      <description><![CDATA[About a year ago, I read a profile about Hans Rosling in the Economist magazine. Apparently I had...]]></description>
      <content:encoded><![CDATA[<p>About a year ago, I read <a href="http://www.economist.com/node/21013330">a profile about Hans Rosling in the Economist magazine</a>. Apparently I had been living under a rock, as I had never seen his data visualizations before. Pretty impressive:</p>  <p></p>  <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:0a6f02e2-32f3-4e6c-91cb-51a51d49336b" class="wlWriterEditableSmartContent"><div><object width="425" height="355"><param name="movie" value="https://www.youtube.com/v/hVimVzgtD6w&amp;hl=en"></param><embed src="https://www.youtube.com/v/hVimVzgtD6w&amp;hl=en" type="application/x-shockwave-flash" width="425" height="355"></embed></object></div></div>  <p></p>  <p>Rosling made sure all his information was put up publically on <a href="http://gapminder.org/">gapminder.org</a>. I resolved to use this data set to come up with some nifty visualizations, but never quite got around to this project – until now.</p>  <p>I had to do quite a bit of ETL to get the data into a form that was suitable for consumption by DAX. Also, I needed some pictures so my Power View reports would look nice, so I had to put in some flags from the <a href="https://www.cia.gov/library/publications/the-world-factbook/docs/flagsoftheworld.html">CIA World Fact Book</a>. The mapping of country to continent I got from the web, unfortunately I lost the link to the original data source but it is publically available information. Once I got all this data together, I put it into one single SQL Server data source for easy import into PowerPivot. I made a PowerPivot workbook, and then a Power View report. And now, we have exciting data in Microsoft tools as well:</p>  <p></p>  <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:f285f434-637a-4080-a399-8ec932097ecc" class="wlWriterEditableSmartContent"><div><object width="425" height="355"><param name="movie" value="https://www.youtube.com/v/uuZesGpnoAQ&amp;hl=en"></param><embed src="https://www.youtube.com/v/uuZesGpnoAQ&amp;hl=en" type="application/x-shockwave-flash" width="425" height="355"></embed></object></div></div>  <p></p>  <p>Here are the samples:</p>  <ul>   <li>The <a href="https://skydrive.live.com/redir.aspx?cid=e254934e58c285e3&amp;resid=E254934E58C285E3!112&amp;parid=root">SQL Server data source</a> for the project, so you can muck about with the data yourself. </li>    <li><a href="https://skydrive.live.com/redir.aspx?cid=e254934e58c285e3&amp;resid=E254934E58C285E3!113&amp;parid=root">The PowerPivot workbook</a> for the project </li>    <li><a href="https://skydrive.live.com/redir.aspx?cid=e254934e58c285e3&amp;resid=E254934E58C285E3!114&amp;parid=root">The Power View report</a> for the project </li> </ul>  <p>Enjoy</p>]]></content:encoded>
    </item>
    <item>
      <title>DirectQuery impersonation options explained</title>
      <link>https://docs.microsoft.com/archive/blogs/cathyk/directquery-impersonation-options-explained</link>
      <pubDate>Mon, 12 Dec 2011 18:32:33 GMT</pubDate>
      <dc:creator><![CDATA[Cathy Dumas -]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/cathyk/2011/12/12/directquery-impersonation-options-explained/</guid>
      <description><![CDATA[In my previous post about impersonation, I mentioned that DirectQuery impersonation was a bit...]]></description>
      <content:encoded><![CDATA[<p>In my <a href="http://blogs.msdn.com/b/cathyk/archive/2011/11/08/impersonation-in-tabular-models.aspx">previous post about impersonation</a>, I mentioned that <a href="http://blogs.msdn.com/b/cathyk/archive/2011/09/06/directquery-101.aspx">DirectQuery</a> impersonation was a bit tricky. That is because there is a special project property called Impersonation Settings that determines the credentials to use when connecting to the data source. The <a href="http://msdn.microsoft.com/en-us/library/gg492120(v=SQL.110).aspx">MSDN documentation of this property</a> is a little thin, so let’s walk through the details.</p>  <p>If I were to write the MSDN on the Impersonations Settings property, I might write something like this:</p>  <table border="1" cellspacing="0" cellpadding="2" width="500"><tbody>     <tr>       <td valign="top" width="142"><strong>Property</strong></td>        <td valign="top" width="358"><strong>Description</strong></td>     </tr>      <tr>       <td valign="top" width="142">Default</td>        <td valign="top" width="358">Always use the credentials specified in the import wizard to connect to the data source. This is true for when querying the data source directly from a client tool (SSMS or Power View) and when processing.</td>     </tr>      <tr>       <td valign="top" width="142">ImpersonateCurrentUser</td>        <td valign="top" width="358">When querying the data source directly from a tool like SSMS or Power View, always use the current user’s credentials to connect to the data source. Ignore the credentials specified in the import wizard.         <br />          <br />When processing, the credentials specified in the import wizard are used. Data fetched during processing is stored in the VertiPaq cache, which is accessible to all users with read access to the AS database.</td>     </tr>   </tbody></table>  <p>Even that description is a bit convoluted. Here is a pictorial example, which may aid understanding. </p>  <p>Let’s assume we have the following:</p>  <ul>   <li>There is a user that has admin access to the AS instance and read access to the SQL Server data source. In this example, it is me – REDMOND\cathyk. Also, for illustration purposes, <a href="http://blogs.msdn.com/b/cathyk/archive/2011/10/03/configuring-a-workspace-database-server.aspx">I am running the AS service account as myself</a>. </li>    <li>There is a second user that does not have access to either the AS instance or the SQL Server data source. In this example, it is REDMOND\sqlcl01.</li> </ul>  <p>Now we can create our model. I create a tabular model and set it to DirectQuery mode by selecting the Model.bim file, viewing the property grid, then setting the DirectQuery Mode property to On. Next, I import data from my SQL Server data source, specifying either REDMOND\cathyk or the service account for the impersonation credentials (in this case they are the same). I then open the Role Manager and create a Read role with REDMOND\sqlcl01 as a member. Now let’s run some queries for REDMOND\sqlcl01 in three scenarios.</p>  <h5>Scenario 1: Using default impersonation settings</h5>  <p>I right click the project, then select Properties. Here are my settings:</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/29/53/metablogapi/7571.image_67382832.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-53-metablogapi/7571.image_5F00_67382832.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/29/53/metablogapi/7484.image_thumb_1A27B89A.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-53-metablogapi/7484.image_5F00_thumb_5F00_1A27B89A.png" width="788" height="427" /></a>&#160;</p>  <p>Query Mode=DirectQuery means that a VertiPaq cache is not constructed for the model, so end users always use DirectQuery to connect to the data source at query time. Impersonation Settings=Default says use the credentials from the import wizard to connect.</p>  <p>F5 to deploy the model. Now let’s see what happens when REDMOND\sqlcl01 tries to connect:</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/29/53/metablogapi/2287.image_72ED6F64.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-53-metablogapi/2287.image_5F00_72ED6F64.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/29/53/metablogapi/4338.image_thumb_1DC5D377.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-53-metablogapi/4338.image_5F00_thumb_5F00_1DC5D377.png" width="1028" height="764" /></a> </p>  <p>Success. REDMOND\sqlcl01 sees the data because the credentials on the data source, and not the current user’s credentials are used. To verify that this is indeed the case, we need two profiler traces.</p>  <p>First, let’s look at the Analysis Services Profiler trace. You will need to customize the trace events by clicking “Show all events”, then selecting Direct Query Begin, Direct Query End, VertiPaq SE Query Begin, VertiPaq SE Query End. Now check the results of the trace for the DAX query issued above.</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/29/53/metablogapi/0131.image_396A5F6D.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-53-metablogapi/0131.image_5F00_396A5F6D.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/29/53/metablogapi/5482.image_thumb_4B46F33A.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-53-metablogapi/5482.image_5F00_thumb_5F00_4B46F33A.png" width="1131" height="539" /></a> </p>  <p>You can see from the trace that DirectQuery was used to connect to the data source. Now we check the Profiler trace for the SQL Server instance, which shows the credentials:.</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/29/53/metablogapi/8228.image_5D238707.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-53-metablogapi/8228.image_5F00_5D238707.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/29/53/metablogapi/6813.image_thumb_31DEF000.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-53-metablogapi/6813.image_5F00_thumb_5F00_31DEF000.png" width="1131" height="539" /></a> </p>  <p>You see that the credentials specified on the data source, in this case REDMOND\cathyk, are passed along and used to execute the query. Thus, we have shown that using the Default impersonation setting allows users without read access to the underlying data sources to get data from SQL Server.</p>  <h5>Scenario 2: Impersonating the current user in a DirectQuery only model</h5>  <p>Now, let’s reconfigure our model and try a different setting. Let’s change the impersonation credentials to impersonate the current user, as pictured below.</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/29/53/metablogapi/3264.image_58AD0640.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-53-metablogapi/3264.image_5F00_58AD0640.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/29/53/metablogapi/0525.image_thumb_1876ECC6.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-53-metablogapi/0525.image_5F00_thumb_5F00_1876ECC6.png" width="779" height="420" /></a> </p>  <p>F5 to redeploy the model. Now let’s see what happens when REDMOND\sqlcl01 tries to connect:</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/29/53/metablogapi/0118.image_5840D34B.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-53-metablogapi/0118.image_5F00_5840D34B.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/29/53/metablogapi/1207.image_thumb_0319375E.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-53-metablogapi/1207.image_5F00_thumb_5F00_0319375E.png" width="1038" height="731" /></a> </p>  <p>You can see that the query fails. The complete error message in this case was “A connection could not be made to the data source with the DataSourceID of 'bc0bbbec-9cc4-4c53-aca9-b3569b0edeb3', Name of 'SqlServer localhost BikeSales'. OLE DB or ODBC error: Login failed for user 'REDMOND\SQLCL01'.; 28000.” If you look in Profiler for the SQL Server data source, you see that there was no query executed by Analysis Services this time. </p>  <p>Observe the Profiler trace for AS:</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/29/53/metablogapi/7558.image_42E31DE3.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-53-metablogapi/7558.image_5F00_42E31DE3.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/29/53/metablogapi/1205.image_thumb_69B13423.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-53-metablogapi/1205.image_5F00_thumb_5F00_69B13423.png" width="1131" height="539" /></a> </p>  <p>What that shows is that AS tried but failed to connect directly to the data source as REDMOND\sqlcl01. Thus, we have showed that impersonating the current user can cause connection attempts to fail even though the data was imported successfully in the import wizard.</p>  <h5>Scenario 3: Impersonating the current user in a hybrid model</h5>  <p>Just to make things more complicated, now let’s consider what happens if we have configured our DirectQuery model to work in a hybrid mode, so that users can hit either the VertiPaq cache or the DirectQuery data source directly. Let’s change our deployment settings as pictured, setting the Query Mode to &quot;In-Memory with DirectQuery”.</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/29/53/metablogapi/2604.image_7B8DC7F0.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-53-metablogapi/2604.image_5F00_7B8DC7F0.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/29/53/metablogapi/6406.image_thumb_3B57AE76.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-53-metablogapi/6406.image_5F00_thumb_5F00_3B57AE76.png" width="779" height="420" /></a> </p>  <p></p>  <p>F5 to redeploy. This time you see that processing happens after deployment, which makes sense because we have a hybrid mode. Now let’s see what happens when REDMOND\sqlcl01 runs a query:</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/29/53/metablogapi/5824.image_1013176F.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-53-metablogapi/5824.image_5F00_1013176F.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/29/53/metablogapi/5808.image_thumb_3AEB7B81.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-53-metablogapi/5808.image_5F00_thumb_5F00_3AEB7B81.png" width="1038" height="731" /></a> </p>  <p>Query succeeds. Why? The Profiler trace on the SQL Server data source yields no clues, as there are no trace events showing.&#160; The Analysis Services Profiler trace, however, is much more illuminating:</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/29/53/metablogapi/1602.image_7AB56206.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-53-metablogapi/1602.image_5F00_7AB56206.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/29/53/metablogapi/2781.image_thumb_3A7F488C.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-53-metablogapi/2781.image_5F00_thumb_5F00_3A7F488C.png" width="1131" height="539" /></a> </p>  <p></p>  <p></p>  <p></p>  <p></p>  <p>User REDMOND\sqlcl01 hit the VertiPaq cache to get the query results. This is as expected for the hybrid mode. So, even though the current user is not authorized to connect to the SQL Server data source, she can still see the data because it already existed in the VertiPaq cache and the results were fetched from there.</p>  <h5>What’s the bottom line – which impersonation settings should be used?</h5>  <p>Impersonating the current user has its pros and cons:</p>  <ul>   <li>Con: you have to configure access on both Analysis Services and the SQL Server data source</li>    <li>Pro: the security model on SQL Server is much fancier than the one for tabular models, so you might find the pain of configuring access worth the gain of the fine grained security model</li>    <li>Con: the behaviour of Analysis Services can be confusing in hybrid mode, as hitting the VertiPaq cache yields extremely different results from hitting the data source directly</li> </ul>  <p>Using default impersonation settings has its pros and cons:</p>  <ul>   <li>Pro: conceptually much simpler, same account is always used to access data, and it’s the same account you specify in the import wizard</li>    <li>Con: all users with read access to the model can read everything. Row level security is not allowed for DirectQuery models in SQL Server 2012. Limiting access to a subset of data to some users is impossible. </li> </ul>  <p>The right answer for you depends on your use case. Have fun</p>]]></content:encoded>
    </item>
    <item>
      <title>New for RC0 – the .layout file</title>
      <link>https://docs.microsoft.com/archive/blogs/cathyk/new-for-rc0-the-layout-file</link>
      <pubDate>Fri, 02 Dec 2011 18:38:53 GMT</pubDate>
      <dc:creator><![CDATA[Cathy Dumas -]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/cathyk/2011/12/02/new-for-rc0-the-layout-file/</guid>
      <description><![CDATA[If you look at my previous post on the tabular project structure, you’ll see this teaser: “There are...]]></description>
      <content:encoded><![CDATA[<p>If you look at my previous post on the <a href="http://blogs.msdn.com/b/cathyk/archive/2011/08/08/tabular-project-structure.aspx">tabular project structure</a>, you’ll see this teaser: “There are a couple of other files in the project folder, an optional ABF file and a hidden user settings file, but I’ll talk about those another day.” The ABF file description I just put off because it was complicated, but <a href="http://blogs.msdn.com/b/cathyk/archive/2011/09/20/working-with-backups-in-the-tabular-designer.aspx">I finally got around to describing the ABF file</a>. The user settings file I put off deliberately because I knew we were going to change the design for RC0. Now the design is done, I can tell you about it.</p>  <h5>The user settings file</h5>  <p>First, the user settings file. When I refer to the user settings file, I am referring to the hidden file called “Model.bim_&lt;username&gt;.settings”. For RC0 models, this file is very small. It does a few things. This file is created whenever a project (new or existing) is opened for the first time by this user. The file stores personal settings such as the workspace database name, the workspace database retention policy, and the back up policy. Also, it stores a bit of metadata that is used to populate the error list on open as needed. This is all private, per-user data that you should not be mucking about with and also not sharing with other users. It is OK to delete this file if you want to force usage of the ABF (as described in my previous article), but you should not ever modify this file nor check it into source control.</p>  <h5>The .layout file</h5>  <p>Now, the Model.bim.layout file. We created this new file for RC0 to solve a specific problem. The problem is with persistence of view state information. We save out a lot of view state information for tabular models. Some of this view state information is something that you would want to share with other developers in a shared development environment. The position of measures in the measure grid and the position of tables and connectors in the diagram are two such examples. If you have ever rearranged a complicated diagram, you know how much work this takes and you would want to share your hard work with others!</p>  <p>We did not want to save this information in the .bim file. The reason – developers have a hard enough time trying to figure out what changed in the model between iterations without adding the view state information. Last thing you need is to force a change to the .bim file whenever you move something with your mouse in the table. It becomes very difficult very quickly to differentiate real changes (such as add/remove of measures, tables, columns, etc) vs simply cosmetic changes. What to do?</p>  <p>Thus, the .layout file is born. It stores all the view state information. This new .layout file is very smart. Triggering a view state change (such as moving a table in the diagram) shows the dirty flag on the .bim file, even though the .bim file itself is not dirty. This enables VS to prompt for save on close, so you never lose your view state changes (unless you close without saving). The .layout file is renamed automatically when the Model.bim file is renamed. Should the .layout file ever disappear, don’t worry. All the model metadata is safe. Only view state information is lost, and models can still be opened and edited without issue. Also, stale information in the .layout file (anything not matching model metadata) is simply ignored. We tested this pretty thoroughly and it works pretty well.</p>  <h5>Behind the design of the .layout file</h5>  <p>You might wonder where we had this view state information before RC0, as it wasn’t in the bim file. Previously, it was in the user settings file. That approach was problematic because the user settings file cannot be shared in a source control environment. The designer ensures that you only use the user settings file with your name on it. The .layout file is much better because it can be shared.</p>  <p>You might also wonder why, if this information in the .layout file is so important, the .layout file isn’t added by default to the .smproj. This is a cut we had to make due to time constraints. Getting the Solution Explorer to work with your custom project types is actually quite tricky and time consuming, so we took a shortcut there. Another shortcut that we made was that we just put all the view state information into the .layout file, which includes personal information such as sheet tab selection, diagram vs. grid view selection, filter selection, etc. So if you choose to share the .layout file, you are sharing all non-metadata things that each user can see. This is not ideal, but it beats the alternative of not being able to share anything at all.</p>  <h5>Sharing the .layout file</h5>  <p>If you are in a source control environment and you want to share the diagram and measure grid settings, here is what you do:</p>  <ol>   <li>Create a new project or open an existing project.</li>    <li>Open the Solution Explorer. Right click the .smproj, select Add-&gt;Existing item.</li>    <li>Select the Model.bim.layout file (in the same folder as the .bim file you are currently using), OK. </li>    <li>Add the Model.bim.layout file to source control and check it in.</li> </ol>  <p>Obviously, sharing is optional. If you don’t want developers to be dirtying your project by switching back and forth between diagram and grid view, don’t share the file. However, I do highly recommend sharing out the layout settings as setting up the diagram is time consuming and there is no point in making every developer do it manually.</p>  <h5>Wrap-up – the final file structure </h5>  <p>With this, we can now summarize the final project structure for tabular models. You have a parent .smproj project file, with a single child .bim file that contains model metadata. To this project, you can optionally add the .bim.layout file to the project/source control that contains view state information.</p>  <p>We have a couple of auxiliary files in the project folder that help the designer know how to load data. These are the Model.bim_&lt;username&gt;.settings file and the ABF backup of the project.</p>  <p>When you build the project, you get three outputs – the .asdatabase file, the .deploymentoptions file, and the .deploymenttargets file. These build outputs are designed to be used by the Deployment Wizard, but can be used by anybody that wants to deploy the project using any method (AMO/PowerShell/executing XMLA in SSMS).</p>  <p>Eight files – that’s all you need to build and deploy your tabular project, with only two files (the .smproj and .bim) that are absolutely essential to manage. Pretty simple.</p>]]></content:encoded>
    </item>
    <item>
      <title>PowerPivot measures command – no really, don’t modify it manually!</title>
      <link>https://docs.microsoft.com/archive/blogs/cathyk/powerpivot-measures-command-no-really-dont-modify-it-manually</link>
      <pubDate>Tue, 29 Nov 2011 11:15:28 GMT</pubDate>
      <dc:creator><![CDATA[Cathy Dumas -]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/cathyk/2011/11/29/powerpivot-measures-command-no-really-dont-modify-it-manually/</guid>
      <description><![CDATA[If you look in the metadata of a BIM file, or if you look at the .dax file generated by the DAX...]]></description>
      <content:encoded><![CDATA[<p>If you look in the metadata of a BIM file, or if you look at the .dax file generated by the <a href="http://daxeditor.codeplex.com/">DAX Editor</a>, you will see the following perplexing comment:</p>  <pre class="csharpcode">--------------------------------------------------------<span class="rem">--</span>
<span class="rem">-- PowerPivot measures command (do not modify manually) --</span>
----------------------------------------------------------</pre>

<p>This is actually a meaningful comment. Despite having PowerPivot in the name, it is used in the tabular designer in Visual Studio as well. This header is used to tell the measure grid where the measures are in the model. </p>

<p>If you modify the header manually, here is what will happen. Say you insert a carriage return between the &lt;Text&gt; and the first hyphen in the comment. When you reopen the designer, you will see that all of your measures are gone from the measure grid! The measures are still in the model, and in fact when you deploy to the server you can query the measures perfectly fine. The designer simply cannot see the measures because the text does not match exactly the text generated by the designer.</p>

<p>I found this quirk of design not by hand-editing my BIM file (which is bad), but when processing my .asdatabase file as shown in my <a href="http://blogs.msdn.com/b/cathyk/archive/2011/08/10/deploying-tabular-projects-using-a-custom-msbuild-task.aspx">msbuild customization example</a>. PowerShell, not understanding that it could not treat the .asdatabase file as any other XML file, inserted line breaks. When I deployed the database, everything seemed fine. However, next time I created a new tabular project by importing my model, the measures were all gone from the database. In a panic (thinking my demo ruined!) I filed a high priority bug and got a bunch of people to gather round and help me with my conundrum. And as it turns out, I just had to delete one line break from the XMLA, and my model was restored.</p>

<p>Bottom line: that command above is not joking. Do not modify the PowerPivot measures command manually. Consider yourself warned. </p>]]></content:encoded>
    </item>
    <item>
      <title>Least discoverable feature: importing more tables from an existing connection</title>
      <link>https://docs.microsoft.com/archive/blogs/cathyk/least-discoverable-feature-importing-more-tables-from-an-existing-connection</link>
      <pubDate>Wed, 23 Nov 2011 13:58:36 GMT</pubDate>
      <dc:creator><![CDATA[Cathy Dumas -]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/cathyk/2011/11/23/least-discoverable-feature-importing-more-tables-from-an-existing-connection/</guid>
      <description><![CDATA[You’ve run the import wizard, and imported a bunch of tables into your tabular model. Now you want...]]></description>
      <content:encoded><![CDATA[<p>You’ve run the import wizard, and imported a bunch of tables into your tabular model. Now you want to import one more from that same connection. How do you do this?</p>  <p>What you need is the Existing Connections dialog. To start the Existing Connections dialog, go to Model-&gt;Existing Connections or click the Existing Connections button on the toolbar:</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/29/53/metablogapi/7266.existingconnectionsbutton_5DE95D92.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-53-metablogapi/7266.existingconnectionsbutton_5F00_5DE95D92.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="existing connections button" border="0" alt="existing connections button" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/29/53/metablogapi/2046.existingconnectionsbutton_thumb_2F23A4F0.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-53-metablogapi/2046.existingconnectionsbutton_5F00_thumb_5F00_2F23A4F0.png" width="426" height="102" /></a> </p>  <p>Either operation starts the Existing Connections dialog. Select the connection you want to reuse, then click Open:</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/29/53/metablogapi/6740.existingconnectionsopen_3F4F6CE9.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-53-metablogapi/6740.existingconnectionsopen_5F00_3F4F6CE9.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="existing connections open" border="0" alt="existing connections open" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/29/53/metablogapi/6763.existingconnectionsopen_thumb_661D8329.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-53-metablogapi/6763.existingconnectionsopen_5F00_thumb_5F00_661D8329.png" width="622" height="592" /></a> </p>  <p>This operation then takes you directly into the import wizard, as shown:</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/29/53/metablogapi/1157.importwizard_5EFE46B1.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-53-metablogapi/1157.importwizard_5F00_5EFE46B1.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="import wizard" border="0" alt="import wizard" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/29/53/metablogapi/0160.importwizard_thumb_05CC5CF2.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-53-metablogapi/0160.importwizard_5F00_thumb_5F00_05CC5CF2.png" width="622" height="592" /></a> </p>  <p>Now you can import your table as shown.</p>  <p>If you forget to take this step, and simply import through the import wizard multiple times, connections will simply proliferate in the Existing Connections dialog, as shown:</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/29/53/metablogapi/5873.multipleexistingconnectionsentries_139EA2ED.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-53-metablogapi/5873.multipleexistingconnectionsentries_5F00_139EA2ED.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="multiple existing connections entries" border="0" alt="multiple existing connections entries" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/29/53/metablogapi/8510.multipleexistingconnectionsentries_thumb_3E7706FF.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-53-metablogapi/8510.multipleexistingconnectionsentries_5F00_thumb_5F00_3E7706FF.png" width="622" height="592" /></a> </p>  <p>Unfortunately, since you cannot change the connection used by a table after it has been created, you are stuck with these multiple connections forever unless you delete all tables associated with the “bad” connection and re-import them using the “good” connection.</p>  <p>Moral of the story – the Existing Connections dialog box is your friend, I know it is awkward to import from there (I trip over this too!) but you will learn to do it with practice over time.</p>]]></content:encoded>
    </item>
    <item>
      <title>Securing your tabular model</title>
      <link>https://docs.microsoft.com/archive/blogs/cathyk/securing-your-tabular-model</link>
      <pubDate>Mon, 21 Nov 2011 10:52:04 GMT</pubDate>
      <dc:creator><![CDATA[Cathy Dumas -]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/cathyk/2011/11/21/securing-your-tabular-model/</guid>
      <description><![CDATA[Now that RC0 has arrived I can finally post about security for tabular models. I have put off...]]></description>
      <content:encoded><![CDATA[<p>Now that <a href="http://blogs.msdn.com/b/analysisservices/archive/2011/11/17/announcing-microsoft-sql-server-2012-release-candidate-0-rc0.aspx">RC0 has arrived</a> I can finally post about security for tabular models. I have put off writing about security because I think the RC0 documentation on this subject is really quite good so I don’t have too much to add. Also, we had a minor feature add for RC0 that is very exciting. You can now create and delete roles in SSMS. Also, you can edit the row filters for a role in SSMS. The row filter editing functionality in SSMS is rather rudimentary (no autocomplete or semantic error validation), so I don’t recommend SSMS as your primary row filter editor, but for making small fix ups it works just fine.</p>  <p>Now on to the summary of the security model for tabular models for SQL Server 2012. There are two types of permissions for tabular models: database permissions and allowed row sets. A database permission is simple – a user can administer, read, or process a database. Granting a user read access to the database allows the user to see all data (but not metadata such as the DAX calculations included in the model). If you would like to restrict the amount of data the user in the read role can see, you can change the number of rows returned for a particular table by applying a row filter. Row filters affect related tables in the one to many direction, so applying a filter to a lookup table always affects the related fact tables. Aggregates in the table always aggregate the filtered row set. If multiple row filters are applied to a table, the user sees the intersection of the rows returned by each individual filter. If a user is a member of multiple roles, the user sees the union of all results returned for a particular role.</p>  <p>For more basic overview information, see the <a href="http://msdn.microsoft.com/en-us/library/hh213165(v=SQL.110).aspx">MSDN documentation on roles</a> and <a href="http://paultebraak.wordpress.com/">Paul te Braak’s</a> <a href="http://paultebraak.wordpress.com/2011/09/04/bism-%e2%80%93-tabular-security-model/">security overview post</a>.&#160; The <a href="http://msdn.microsoft.com/en-us/library/hh231697(v=SQL.110).aspx">Create Roles</a> tutorial shows you how to create basic roles and set row filters. There is an awesome new supplemental lesson for RC0, called <a href="http://msdn.microsoft.com/en-us/library/hh479759(v=SQL.110).aspx">Implement Dynamic Security Using Row Filters</a>, that shows how to do dynamic security. This is exactly the demo I gave for SQL PASS on dynamic security, except on AdventureWorks. The lesson shows how to add a table with a list of securable objects, “secure” the table, and then modify the allowed rowset for users using the <a href="http://msdn.microsoft.com/en-us/library/hh230954(v=SQL.110).aspx">USERNAME()</a> function. We do not have a meaningful example that shows how to use <a href="http://msdn.microsoft.com/en-us/library/hh213140(v=SQL.110).aspx">CUSTOMDATA()</a> at this time. </p>  <p>Notes and tips:</p>  <ul>   <li>Perspectives, tables, and columns are not securable objects. Only databases and rows are securable objects. </li>    <li>There is no way to allow a user to view the aggregate data for all rows in the table while restricting permission to view individual rows in the table. Visual totals always apply. </li>    <li>As <a href="http://paultebraak.wordpress.com/">Paul te Braak</a> notes in his blog, <a href="http://paultebraak.wordpress.com/2011/09/13/bism-%e2%80%93-tabular-security-gotcha-denied-permissions/">there is no concept of a strong deny</a>. By setting security permissions, you are defining what the user in a particular role is allowed to see. </li>    <li>A user with process permission cannot process the database in SSMS. This is because the user is not allowed to see the metadata for the database. The user with process permission can only process via automation. See <a href="http://blogs.msdn.com/b/cathyk/archive/2011/09/12/managing-tabular-models.aspx">my management post</a> for details on automation options. </li>    <li>To “secure” a table for a user, type =FALSE() as the DAX filter and then hide the table from view in the client tools. Note that hiding the table hides the table for all users in all rows. If you want the table itself to be visible in the field list so other users in other roles can manipulate the table, the user with the =FALSE() restriction will still be able to see the table metadata in the field list. </li>    <li>Only Windows authenticated users can be added to roles. </li>    <li>Security works best when you are using domain users, and not individual users on a local machine. Analysis Services just works best in a domain environment, and you may get strange results when trying to test out security in Excel or in the “cube browser” when working with users on a local machine. </li> </ul>]]></content:encoded>
    </item>
    <item>
      <title>Changing your font and keyboard shortcuts in the tabular designer</title>
      <link>https://docs.microsoft.com/archive/blogs/cathyk/changing-your-font-and-keyboard-shortcuts-in-the-tabular-designer</link>
      <pubDate>Thu, 17 Nov 2011 10:17:55 GMT</pubDate>
      <dc:creator><![CDATA[Cathy Dumas -]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/cathyk/2011/11/17/changing-your-font-and-keyboard-shortcuts-in-the-tabular-designer/</guid>
      <description><![CDATA[If you look carefully, you can see my roots showing. No, not my hair – you can see my old job...]]></description>
      <content:encoded><![CDATA[<p>If you look carefully, you can see my roots showing. No, not my hair – you can see my old job showing. When I came to work on the Analysis Services team, we had to design an “environmentally friendly” Visual Studio package in a hurry using the <a href="http://msdn.microsoft.com/en-us/library/xc52cke4.aspx">Visual Studio extensibility framework</a>, same as everybody else. You know who else did this? Workflow. I leveraged my experience (re: reused old designs and specs from my old friends) and you can see chunks of this in the tabular designer.</p>  <p>For example, to change your font in the tabular designer? <a href="http://blogs.msdn.com/b/cathyk/archive/2010/04/01/least-discoverable-feature-changing-the-workflow-designer-fonts-and-colors.aspx">Change the environment font</a>. Same method as described in my previous article, also have to restart VS for changes to apply. Now, the DAX formula editor is not the hostable editor, it’s a component built in to the tabular designer, so unlike the hostable editor it uses the environment font. That’s the only difference. </p>  <p>And keyboard shortcuts? Just like the Workflow Designer, which has all its keyboard shortcuts in its own context (in its case, WorkflowDesigner.*), the tabular designer has all of its keyboard shortcuts in its own context (AnalysisServices.*). Just like everybody else in VS, you can remap all the keyboard shortcuts using the Tools-&gt;Options dialog. The default keyboard shortcuts in the tabular designer are pretty much the <a href="http://technet.microsoft.com/en-us/library/ff452142.aspx">same shortcuts as PowerPivot</a>, except that F5 follows VS rules and “starts debugging” (which in our case, builds and deploys).</p>  <p>Finally, toggling between View Code and View Designer. Just like in Workflow, you’re not supposed to be hand editing the underling code (Analysis Services has XMLA, Workflow has XAML, it only took a few months to stop making typos). But just like in Workflow, some people like to look at XML. And just like in Workflow, <a href="http://blogs.msdn.com/cathyk/archive/2010/01/07/least-discoverable-feature-f7-and-shift-f7-to-toggle-code-view.aspx">you can use F7 to switch to code view</a>. (Shift+F7 doesn’t work, much to my chagrin.)</p>  <p>But of course, there are differences. Unlike Workflow, when you change to a high contrast mode color scheme in the tabular designer, the changes take effect right away. So they did teach this old dog one new trick. </p>]]></content:encoded>
    </item>
    <item>
      <title>Using Edit Table Properties on a partitioned tabular model</title>
      <link>https://docs.microsoft.com/archive/blogs/cathyk/using-edit-table-properties-on-a-partitioned-tabular-model</link>
      <pubDate>Thu, 10 Nov 2011 11:45:21 GMT</pubDate>
      <dc:creator><![CDATA[Cathy Dumas -]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/cathyk/2011/11/10/using-edit-table-properties-on-a-partitioned-tabular-model/</guid>
      <description><![CDATA[In PowerPivot, the Edit Table Properties dialog box is used for a few things. It is used to add...]]></description>
      <content:encoded><![CDATA[<p>In PowerPivot, the <a href="http://technet.microsoft.com/en-us/library/gg399179.aspx">Edit Table Properties</a> dialog box is used for a few things. It is used to add columns to a table, remove columns from a table, and adjust the set of rows included in the table. This works great for PowerPivot. All the data in the PowerPivot model is stored in a single partition, so there is no ambiguity as to what goes where. As soon as you change the table definition in the Edit Table Properties dialog, the partition definition for the table is modified, the table is reprocessed, the new data is shown, and all is well.</p>  <p>In the tabular designer things are a bit more complicated. Tables can have many partitions. Therefore, the set of rows included in the table must be defined in the Partition Manager for each individual partition, not in Edit Table Properties for the entire table. However, there is still a need to have a single definition of the set of columns in the table (the data source view). This can’t be handled at the partition level, as it is impossible to mash together all the partition definition queries for the table and come up with a coherent column set. What to do?</p>  <p>In the end, we decided to keep the Edit Table Properties dialog. For a table with a single partition, the Edit Table Properties dialog works the same as in PowerPivot. If you make a change to Edit Table Properties, the partition definition is automatically updated, the new data is fetched, and all is well. In a table with two or more partitions, the behaviour is different in three ways, as I describe below.</p>  <p><strong>Editing the row set</strong>: Editing the row set in Edit Table Properties has no effect on a partitioned table. Even though you see the filter in the Edit Table Properties dialog, it is disregarded at processing time. The individual partition definition queries are used to fetch the data instead.</p>  <p><strong>Adding a column</strong>: To add a column to a table, you must add the column using the Edit Table Properties dialog. However, for a partitioned table, just using Edit Table Properties is not sufficient. When you try to process this model after adding the column, you would get the error “The operation failed because the source does not contain the requested column. You can fix this problem by updating the column mappings.” To solve this problem, you must open the Partition Manager and update each individual partition definition to add the column you want. Once you have fixed up both Edit Table Properties and the partition definitions, you can then re-process your model and get the data.</p>  <p><strong>Removing a column:</strong> You can remove a column using the Edit Table Properties dialog. This gets rid of the column in the column set, so you no longer see it in table and you can no longer query it. However, for a partitioned model, it is a good idea to modify the partition definition query and get rid of the column there as well to avoid unnecessary data coming down the wire during processing.</p>  <p>This information about having to use both the Edit Table Properties and Partition Manager dialog box to adjust the column set appears in the MSDN documentation, as a note in the <a href="http://msdn.microsoft.com/en-us/library/hh230963(v=SQL.110).aspx">Add Columns to a Table</a> topic. Also there’s a little warning in the Edit Table Properties dialog for partitioned models, which tells you about both the column and the row behaviours. </p>  <p>If you miss the docs, you might think that Edit Table Properties is buggy. After all, the row set you see in Edit Table Properties is not necessarily the row set you get when you process. Because of the long winded explanation I gave above, the Edit Table Properties behaviour one of those things that we on the product team call “by design” (a resolution that must be the bane of many bug filers on Connect). Hopefully after this post you can now understand what is going on, and you can now add or remove rows or columns from partitioned models with impunity.</p>  <p>All that said, I would be interested in hearing from you if you consider the current design to be a bug, instead of a design feature. <a href="http://sqlblog.com/blogs/alberto_ferrari/default.aspx">Alberto Ferrari</a> filed a <a href="https://connect.microsoft.com/SQLServer/feedback/details/687043/bids-table-properties-window-need-to-be-forced-to-query-editor-if-table-has-partitions-defined">Connect item on Edit Table Properties</a> that you can use. If you think the design should change, feel free to upvote that item and add some comments about what you would consider the correct behaviour to be. Thanks     </p>]]></content:encoded>
    </item>
    <item>
      <title>Impersonation in tabular models</title>
      <link>https://docs.microsoft.com/archive/blogs/cathyk/impersonation-in-tabular-models</link>
      <pubDate>Mon, 07 Nov 2011 17:33:46 GMT</pubDate>
      <dc:creator><![CDATA[Cathy Dumas -]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/cathyk/2011/11/07/impersonation-in-tabular-models/</guid>
      <description><![CDATA[Here is a pop quiz on impersonation when connecting to a data source for tabular models.  Question...]]></description>
      <content:encoded><![CDATA[<p>Here is a pop quiz on <a href="http://msdn.microsoft.com/en-us/library/gg492180(v=SQL.110).aspx">impersonation</a> when connecting to a data source for tabular models.</p>  <p><strong>Question 1:</strong> How many impersonation options are supported for tabular models?</p>  <ol style="list-style-type: lower-alpha">   <li>2, as shown in the tabular designer </li>    <li>3 </li>    <li>4, as shown in SSMS </li> </ol>  <p><strong>Question 2: </strong>My impersonation credentials are validated in the Import Wizard.</p>  <ol style="list-style-type: lower-alpha">   <li>True </li>    <li>False </li> </ol>  <p><strong>Question 3:</strong> If I see data in the Preview and Filter pane in the Import Wizard, then the user specified in the impersonation page has access to the data source and my data will be imported.</p>  <ol style="list-style-type: lower-alpha">   <li>True </li>    <li>False </li> </ol>  <p><strong>Question 4:</strong> The account that I select for the impersonation option on the data source is always used when the engine connects to the data source to fetch data.</p>  <ol style="list-style-type: lower-alpha">   <li>True </li>    <li>False </li> </ol>  <p>Got your answers? Good. The correct (and possibly surprising) answer is b for all. Let’s review our answers.</p>  <p>On question 1, the number of impersonation options. Tabular models support the following three options for connecting to a data source: impersonating a specific Windows user, impersonating the service account, and default (which for tabular models means inherit the credentials specified at the database level). </p>  <p>We only expose the first two options in the Import Wizard/Existing Connections dialog because we did not implement any UI that allowed users to enter the Data Source Impersonation Info property at the database level. Without a way to enter the database credentials, we figured it made no sense to show the default option in the Import Wizard since the option is useless at design time. This leaves us with the two options in the import wizard that you see today. </p>  <p>We expose four options in SSMS (impersonating the current user + the three supported options) because we share the impersonation option selection UI with the multidimensional and data mining projects. Since data mining projects support impersonating the current user when connecting to the data source, we show it in the dialog. We did not have time in Denali to implement a custom UI in SSMS for tabular models with only three options, so you’re stuck with the extra useless option.</p>  <p>On question 2, the tabular designer does not validate the impersonation credentials. The designer just passes the credentials along to the engine blindly. You won’t know that the credentials are bad until you try and fail to import the data.</p>  <p>On question 3, import can fail even after successful preview and filter. This is because preview and filter always uses the current user’s credentials when connecting to the data source. Why is this? Well, the tabular designer has to start the data provider itself so it can fetch the data for the preview and filter operation. We decided not to use the credentials on the impersonation page because you would not ever be able to preview and filter if you are impersonating the service account – the engine cannot share with us those credentials. Using the current user’s credentials was simpler.</p>  <p>On question 4, credentials used to connect to the data source. When your model is an in-memory (VertiPaq) model, yes the credentials specified on the data source are always used by the engine when connecting to the data source. However, when your model is a DirectQuery model, things get a bit trickier. There is an Impersonation Settings deployment property that determines the credentials used to connect to the data source. I will go over DirectQuery impersonation in another post. </p>]]></content:encoded>
    </item>
  </channel>
</rss>