<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Role based security as input paramenter, data read from oracle db on demand in Developers</title>
    <link>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63715#M3233</link>
    <description>Hi Paul,&lt;BR /&gt;
Thanks for that. I actually did not go any further after I got the "invalid syntax" error.&lt;BR /&gt;
When I try to add a permission table with a library that uses the SAS ACCESS engine and press Next then&lt;BR /&gt;
nothing seems to happen. Do permisson tables work with a libraray that uses the SAS Access (Oracle) engine?&lt;BR /&gt;
Creating a new library did not help either. I use sas olap studio 4.2 M2. - I think there is a &lt;B&gt;hotfix&lt;/B&gt; for that&lt;BR /&gt;
&lt;BR /&gt;
Why do you think permission tables make it more flexible? I am worried that the format of the table and providing the data in that format will be a big job.&lt;BR /&gt;
Thanks,&lt;BR /&gt;
Bob

Message was edited by: metalray</description>
    <pubDate>Fri, 21 Jan 2011 08:57:06 GMT</pubDate>
    <dc:creator>metalray</dc:creator>
    <dc:date>2011-01-21T08:57:06Z</dc:date>
    <item>
      <title>Role based security as input paramenter, data read from oracle db on demand</title>
      <link>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63706#M3224</link>
      <description>Hi guys,&lt;BR /&gt;
&lt;BR /&gt;
I am thinking about security in the moment.&lt;BR /&gt;
We have about 3000+ end users that all have access to their data.&lt;BR /&gt;
Setting all those permissions in the management studio will take forever so&lt;BR /&gt;
I need to have some kind of general rule that all users (single sign on/LDAP) &lt;BR /&gt;
have access to their own OLAP cube member "myname" on the dimension "dim_names" and the other dimensions&lt;BR /&gt;
do not matter. how would you do it?&lt;BR /&gt;
&lt;BR /&gt;
some of those users are team leads and they actually can access the data of other people.&lt;BR /&gt;
the whole security model is maintained in an oracle table. my plan was&lt;BR /&gt;
to populate some prompts with only those member that are actually accessible to the end user in some cases&lt;BR /&gt;
It will be a very small prompt with just "myname" but some actually show a couple of names&lt;BR /&gt;
or a whole team.&lt;BR /&gt;
&lt;BR /&gt;
my idea is that:&lt;BR /&gt;
&lt;BR /&gt;
web report - &amp;gt; stored process - &amp;gt; sql pass through get user accessible members based on user session role -&amp;gt;&lt;BR /&gt;
populate prompt&lt;BR /&gt;
&lt;BR /&gt;
Is that possible? can the user role (login) be passed to a stored process.&lt;BR /&gt;
How would that work if a thousand people do it at the same time? would the&lt;BR /&gt;
sql pass through collapse?&lt;BR /&gt;
I can not put all "mynames" in one group because then they could access each other data and I cant put all 3000+ "mynames" in 3000+ different groups that I all have to assign - hence I think reading it from the oracle db and having a little logic in a STP for the prompts will do it.</description>
      <pubDate>Tue, 18 Jan 2011 15:56:18 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63706#M3224</guid>
      <dc:creator>metalray</dc:creator>
      <dc:date>2011-01-18T15:56:18Z</dc:date>
    </item>
    <item>
      <title>Re: Role based security as input paramenter, data read from oracle db on demand</title>
      <link>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63707#M3225</link>
      <description>Do you already have credentials for your 3,000+ users loaded into SAS metadata, and can they successfully log into the system?&lt;BR /&gt;
&lt;BR /&gt;
Vince DelGobbo&lt;BR /&gt;
SAS R&amp;amp;D</description>
      <pubDate>Tue, 18 Jan 2011 19:39:02 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63707#M3225</guid>
      <dc:creator>Vince_SAS</dc:creator>
      <dc:date>2011-01-18T19:39:02Z</dc:date>
    </item>
    <item>
      <title>Re: Role based security as input paramenter, data read from oracle db on demand</title>
      <link>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63708#M3226</link>
      <description>Hi Vince,&lt;BR /&gt;
&lt;BR /&gt;
yes, its imported from the LDAP. so they can login&lt;BR /&gt;
but how do I do member level security for 3000+users on 3000+ OLAP dimension members. maintaining&lt;BR /&gt;
that manually will take forever so I have this plan:&lt;BR /&gt;
&lt;BR /&gt;
1. dont show them anythink in the selection prompts that they are not allowed to&lt;BR /&gt;
select (the selection is retrieved with a sql pass through in a stored process that has&lt;BR /&gt;
somehow taken the user rolee or ID as an input)</description>
      <pubDate>Wed, 19 Jan 2011 09:41:20 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63708#M3226</guid>
      <dc:creator>metalray</dc:creator>
      <dc:date>2011-01-19T09:41:20Z</dc:date>
    </item>
    <item>
      <title>Re: Role based security as input paramenter, data read from oracle db on demand</title>
      <link>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63709#M3227</link>
      <description>Hi,&lt;BR /&gt;
&lt;BR /&gt;
Have you considered using an Identity Driven Property in your MDX filter expression so that you have 1 or a few permission conditions rather than 3000+?&lt;BR /&gt;
&lt;BR /&gt;
There is more info at:&lt;BR /&gt;
* How to Assign an OLAP Permission Condition (http://support.sas.com/documentation/cdl/en/bisecag/61133/HTML/default/a003139257.htm)&lt;BR /&gt;
* Identity-Driven Properties (http://support.sas.com/documentation/cdl/en/bisecag/61133/HTML/default/a003250936.htm#a003250949)&lt;BR /&gt;
&lt;BR /&gt;
Cheers&lt;BR /&gt;
Paul</description>
      <pubDate>Wed, 19 Jan 2011 11:39:23 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63709#M3227</guid>
      <dc:creator>PaulHomes</dc:creator>
      <dc:date>2011-01-19T11:39:23Z</dc:date>
    </item>
    <item>
      <title>Re: Role based security as input paramenter, data read from oracle db on demand</title>
      <link>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63710#M3228</link>
      <description>Hi Paul,&lt;BR /&gt;
that sounds very promising! I give it ago. Thanks a lot.&lt;BR /&gt;
&lt;BR /&gt;
Cheers,&lt;BR /&gt;
Bob</description>
      <pubDate>Wed, 19 Jan 2011 12:37:20 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63710#M3228</guid>
      <dc:creator>metalray</dc:creator>
      <dc:date>2011-01-19T12:37:20Z</dc:date>
    </item>
    <item>
      <title>Re: Role based security as input paramenter, data read from oracle db on demand</title>
      <link>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63711#M3229</link>
      <description>Hello Paul,&lt;BR /&gt;
I read on the website provided that I can implement&lt;BR /&gt;
it with SAS OLAP Server using MDX expressions/query. the&lt;BR /&gt;
link to the document "How to Assign an OLAP Permission Condition" shows me where to click in the management console as well but I dont know how to write the MDX query that effects all bottom level members and only gets those where the salesid = =&amp;amp;SAS.Userid;&lt;BR /&gt;
&lt;BR /&gt;
SalesPersonID is the bottom level member.&lt;BR /&gt;
&lt;BR /&gt;
[SalesPersonID].[All Members].where the salesid = =&amp;amp;SAS.Userid;&lt;BR /&gt;
&lt;BR /&gt;
Do I have to write an MDX query with a SELECT clause or is an MDX "expression" sufficient? I think an expression is without a select.</description>
      <pubDate>Wed, 19 Jan 2011 15:54:45 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63711#M3229</guid>
      <dc:creator>metalray</dc:creator>
      <dc:date>2011-01-19T15:54:45Z</dc:date>
    </item>
    <item>
      <title>Re: Role based security as input paramenter, data read from oracle db on demand</title>
      <link>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63712#M3230</link>
      <description>See also:&lt;BR /&gt;
&lt;BR /&gt;
&lt;A href="http://support.sas.com/documentation/cdl/en/olapug/59574/HTML/default/viewer.htm#a003212372.htm#a003212373" target="_blank"&gt;http://support.sas.com/documentation/cdl/en/olapug/59574/HTML/default/viewer.htm#a003212372.htm#a003212373&lt;/A&gt;&lt;BR /&gt;
&lt;BR /&gt;
The section "Applying Batch Security with Permission Tables" talks about using a "Permissions Table" that contains the cube access controls.  If you can create this SAS table programmatically it could save you some typing.&lt;BR /&gt;
&lt;BR /&gt;
Vince DelGobbo&lt;BR /&gt;
SAS R&amp;amp;D</description>
      <pubDate>Wed, 19 Jan 2011 15:59:47 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63712#M3230</guid>
      <dc:creator>Vince_SAS</dc:creator>
      <dc:date>2011-01-19T15:59:47Z</dc:date>
    </item>
    <item>
      <title>Re: Role based security as input paramenter, data read from oracle db on demand</title>
      <link>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63713#M3231</link>
      <description>hi Vince, thanks for that. I will keep it as an option. before I move to it I want to see if the MDX idea work but I just noticed that clicking on tools-&amp;gt;manage permission tables and providing the information results in OLAP Cube Studio not doing anything when clicking on "next". &lt;BR /&gt;
&lt;BR /&gt;
back to the query, I can not restrict the query by any selection of the other dimensiosn apart from the sales channel so I hoped that someting like:&lt;BR /&gt;
&lt;BR /&gt;
[SalesPersonID].[All Members].where the salesid =&amp;amp;SAS.Userid;&lt;BR /&gt;
&lt;BR /&gt;
would be sufficient but that just gives me an error.&lt;BR /&gt;
&lt;BR /&gt;
I found this great tutorial but it is not LEVEL specific rather member specific and it does not show how the final query with the member definition and identity driven property looks, it almost seems the author had not clue how the final query would look either &lt;span class="lia-unicode-emoji" title=":slightly_smiling_face:"&gt;🙂&lt;/span&gt;&lt;BR /&gt;
&lt;BR /&gt;
&lt;A href="http://support.sas.com/documentation/cdl/en/olapug/59574/HTML/default/viewer.htm#a003212399.htm" target="_blank"&gt;http://support.sas.com/documentation/cdl/en/olapug/59574/HTML/default/viewer.htm#a003212399.htm&lt;/A&gt;</description>
      <pubDate>Thu, 20 Jan 2011 11:00:34 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63713#M3231</guid>
      <dc:creator>metalray</dc:creator>
      <dc:date>2011-01-20T11:00:34Z</dc:date>
    </item>
    <item>
      <title>Re: Role based security as input paramenter, data read from oracle db on demand</title>
      <link>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63714#M3232</link>
      <description>Hi Bob,&lt;BR /&gt;
&lt;BR /&gt;
I tested this on a cube here and it worked for me.  In the MDX expression filter window I used the following:&lt;BR /&gt;
&lt;BR /&gt;
{[DimSalesPerson].[All Sales People].[SUB::SAS.Userid]}&lt;BR /&gt;
&lt;BR /&gt;
(Note: it complains about invalid syntax but if you keep clicking through the OK buttons it will be saved and it does work)&lt;BR /&gt;
&lt;BR /&gt;
... and when I logged in as sasdemo I only saw the subset corresponding to:&lt;BR /&gt;
&lt;BR /&gt;
{[DimSalesPerson].[All Sales People].[SASDEMO@MYDOMAIN]}&lt;BR /&gt;
&lt;BR /&gt;
Notice that the userid is normalized to the uppercase format with domain suffix.&lt;BR /&gt;
&lt;BR /&gt;
Applying this to your question it looks like you could use:&lt;BR /&gt;
&lt;BR /&gt;
{[SalesPersonID].[All Members].[SUB::SAS.Userid]}&lt;BR /&gt;
&lt;BR /&gt;
This will only work though if your SalesPersonID values are in the normalized form USER@DOMAIN.&lt;BR /&gt;
&lt;BR /&gt;
Thanks to Vince for pointing out the permission tables - I haven't tried them yet - I suspect they will be a lot more manageable/flexible.&lt;BR /&gt;
&lt;BR /&gt;
Cheers&lt;BR /&gt;
Paul&lt;BR /&gt;
&lt;A href="http://platformadmin.com/" target="_blank"&gt;http://platformadmin.com/&lt;/A&gt;</description>
      <pubDate>Thu, 20 Jan 2011 15:37:50 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63714#M3232</guid>
      <dc:creator>PaulHomes</dc:creator>
      <dc:date>2011-01-20T15:37:50Z</dc:date>
    </item>
    <item>
      <title>Re: Role based security as input paramenter, data read from oracle db on demand</title>
      <link>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63715#M3233</link>
      <description>Hi Paul,&lt;BR /&gt;
Thanks for that. I actually did not go any further after I got the "invalid syntax" error.&lt;BR /&gt;
When I try to add a permission table with a library that uses the SAS ACCESS engine and press Next then&lt;BR /&gt;
nothing seems to happen. Do permisson tables work with a libraray that uses the SAS Access (Oracle) engine?&lt;BR /&gt;
Creating a new library did not help either. I use sas olap studio 4.2 M2. - I think there is a &lt;B&gt;hotfix&lt;/B&gt; for that&lt;BR /&gt;
&lt;BR /&gt;
Why do you think permission tables make it more flexible? I am worried that the format of the table and providing the data in that format will be a big job.&lt;BR /&gt;
Thanks,&lt;BR /&gt;
Bob

Message was edited by: metalray</description>
      <pubDate>Fri, 21 Jan 2011 08:57:06 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63715#M3233</guid>
      <dc:creator>metalray</dc:creator>
      <dc:date>2011-01-21T08:57:06Z</dc:date>
    </item>
    <item>
      <title>Re: Role based security as input paramenter, data read from oracle db on demand</title>
      <link>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63716#M3234</link>
      <description>Hi Bob,&lt;BR /&gt;
&lt;BR /&gt;
I haven't tried to use a SAS/ACCESS library for a permission table (not as yet anyway).  I initially had trouble with a base engine library because it had a relative path.  Then I saw &lt;I&gt;Problem Note 40424: Permissions tables for use with member-level security are not supported for UNIX libraries or for libraries that use relative paths&lt;/I&gt; (http://support.sas.com/kb/40/424.html).  After applying SAS OLAP Cube Studio 4.2 M2 Hotfix D06001 the relative base engine library worked.  The hotfix doc doesn't say anything about SAS/ACCESS libraries but if it were me I would give it a try anyway.&lt;BR /&gt;
&lt;BR /&gt;
I only say that permission tables might be more flexible because they should be easy to manage, can be programmatically generated even including programmatically generated MDX expressions (with the full power of Base SAS behind it).  It should be a whole lot easier than point and click when you have more than a handful of permission conditions.&lt;BR /&gt;
&lt;BR /&gt;
BTW - I will be posting a blog article on the identity driven member level security example if you are interested in taking a look.  I am also thinking of doing a post on the format of the permission table.  I can't find much documentation for it so have been investigating the table and the generated SAS code that reads/writes the metadata permission conditions to get a better idea of how the table should be populated.&lt;BR /&gt;
&lt;BR /&gt;
Cheers&lt;BR /&gt;
Paul&lt;BR /&gt;
&lt;A href="http://platformadmin.com/" target="_blank"&gt;http://platformadmin.com/&lt;/A&gt;</description>
      <pubDate>Tue, 25 Jan 2011 13:34:35 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63716#M3234</guid>
      <dc:creator>PaulHomes</dc:creator>
      <dc:date>2011-01-25T13:34:35Z</dc:date>
    </item>
    <item>
      <title>Re: Role based security as input paramenter, data read from oracle db on demand</title>
      <link>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63717#M3235</link>
      <description>Hello Paul,&lt;BR /&gt;
&lt;BR /&gt;
I used the example you described but this did not work well: {[SalesPersonID].[All Members].[SUB::SAS.Userid]}&lt;BR /&gt;
I got the syntax error but additionally the web report could not display anything in the cube (so I think the invalid syntax broke it). &lt;BR /&gt;
&lt;BR /&gt;
n error occurred in processing the report element. Please refresh the page to try again. Contact your administrator if this problem persists.&lt;BR /&gt;
[a12962322664760.05642803333271551_0_0] Error Rendering the Report&lt;BR /&gt;
Unable to access the OLAP server for cube DEV_MLS_CUBE_V2.&lt;BR /&gt;
&lt;BR /&gt;
Returning to fix my syntax and using EG 4.2 as a inspiration I was unable to make out how to apply a filter to a bottom level or any level that is not the top one (whole dimension).&lt;BR /&gt;
&lt;BR /&gt;
WHERE ([SALESPERSON_ID].[All Members])&lt;BR /&gt;
WHERE ([DIM_SALES].[SALESPERSON_ID].[All Members])&lt;BR /&gt;
Both cause the error:&lt;BR /&gt;
"Invalid Dimension Name was encountered in the MDX statement"&lt;BR /&gt;
&lt;BR /&gt;
Back to permission tables:&lt;BR /&gt;
I tried what you did (also using D06001) but failed creating a permission table with the error 76: LINE and COLUMN cannot be determined.&lt;BR /&gt;
Assuming that my SAS/ACCESS Library has the permission to create an Oracle table in a&lt;BR /&gt;
Oracle Schema for developers (which is already very unlikely and I dont even know how to grant such a right to create tables in&lt;BR /&gt;
other schemas) I could still not imagine how this permission table would be represented on the SAS side. Would it be a SAS VIEW&lt;BR /&gt;
that SAS created by itself to show me in SAS the Oracle talbe it created seconds before?&lt;BR /&gt;
&lt;BR /&gt;
Having an empty permission table seems like a lot of work to fill manually.&lt;BR /&gt;
I dont see that it has a benefit over the approach via member level permission in that respect.&lt;BR /&gt;
I see howerver, the high potential of reusability. is that correct?&lt;BR /&gt;
&lt;BR /&gt;
Thanks for your reply and your brilliant blog! What you wrote should go in the SAS documentation.&lt;BR /&gt;
&lt;BR /&gt;
Bob</description>
      <pubDate>Thu, 27 Jan 2011 16:24:20 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63717#M3235</guid>
      <dc:creator>metalray</dc:creator>
      <dc:date>2011-01-27T16:24:20Z</dc:date>
    </item>
    <item>
      <title>Re: Role based security as input paramenter, data read from oracle db on demand</title>
      <link>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63718#M3236</link>
      <description>Hi Bob,&lt;BR /&gt;
&lt;BR /&gt;
Regarding the MDX error:&lt;BR /&gt;
&lt;BR /&gt;
With the OLAP cube open in SAS Enterprise Guide did you drag the appropriate dimension to the slicer, drill down on it to a specific user and then view the generated MDX? You shouldn't see an &lt;I&gt;Invalid Dimension Name&lt;/I&gt; error if that was the case. Can you show us an example of the MDX generated by SAS Enterprise Guide?&lt;BR /&gt;
&lt;BR /&gt;
Regarding permission tables:&lt;BR /&gt;
&lt;BR /&gt;
Do you have the log containing that &lt;I&gt;"LINE and COLUMN cannot be determined"&lt;/I&gt; error message?  I would be interested in seeing it in context.&lt;BR /&gt;
&lt;BR /&gt;
&lt;I&gt;If&lt;/I&gt; it is possible to use a permission table via a SAS/ACCESS Interface to Oracle library (I don't know for sure it is) then you would need appropriate permissions to create the table in the Oracle schema - your Oracle DBA should be able to help you with that.  There would be no view within SAS as the Oracle table would be used directly - just like if you assigned a library in a SAS program pointing to the Oracle database.  Is there any specific need for the permission table itself to be kept in Oracle vs keeping it in SAS?  Once the table is registered its contents could always be dynamically created from the contents of Oracle tables.&lt;BR /&gt;
&lt;BR /&gt;
The permissions table seems to have a fixed format with specific columns that enables OLAP Cube Studio to apply all of the permission conditions via the generated batch code.  Here is an example permissions table which just has 2 rows to apply geographic based security on the DimGeog dimension.  Users in the US group can only see US data and users in the AU group can only see Australian data.&lt;BR /&gt;
&lt;BR /&gt;
fullname, olapschema, cube, dimension, permission, perm_type, mdx_condition&lt;BR /&gt;
-----------------------------------------------------------------------------------------------------------------------------------------------------&lt;BR /&gt;
US Users Group, SASApp - OLAP Schema, MyCube, DimGeog, Read, GD, {[DimGeog].[All Countries].[U.S.A.], Descendants([DimGeog].[All Countries].[U.S.A.])}&lt;BR /&gt;
AU Users Group, SASApp - OLAP Schema, MyCube, GimGeog, Read, GD, {[DimGeog].[All Countries].[Australia], Descendants ([DimGeog].[All Countries].[Australia])}&lt;BR /&gt;
&lt;BR /&gt;
I have left out the items and remove_ace columns as they are blank in this example.&lt;BR /&gt;
&lt;BR /&gt;
If you were going to fill the table out manually then the advantages over manually applying the rules with point and click methods are somewhat lessened but there are still benefits.  With a table it is easy to re-apply them if the cube was deleted and recreated for example.  I see the biggest benefit from a dynamically generated permissions table - imagine a SAS program that queries an LDAP directory (or an Oracle database) to determine what user groups are available and what those groups have access to, then generates a permissions table containing hundreds of rows - much faster than point and click and much easier to reapply when the rules change.&lt;BR /&gt;
&lt;BR /&gt;
Hope that helps.&lt;BR /&gt;
&lt;BR /&gt;
Cheers&lt;BR /&gt;
Paul&lt;BR /&gt;
&lt;A href="http://platformadmin.com/" target="_blank"&gt;http://platformadmin.com/&lt;/A&gt;</description>
      <pubDate>Sun, 30 Jan 2011 08:24:00 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63718#M3236</guid>
      <dc:creator>PaulHomes</dc:creator>
      <dc:date>2011-01-30T08:24:00Z</dc:date>
    </item>
    <item>
      <title>Re: Role based security as input paramenter, data read from oracle db on demand</title>
      <link>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63719#M3237</link>
      <description>Hi Paul,&lt;BR /&gt;
I agree on your permission table analysis.&lt;BR /&gt;
Regarding the Member-Level Permission I am still not where I want to be:&lt;BR /&gt;
&lt;BR /&gt;
If I drill down to the Salesperson_ID, using a filter on the sales person ID, the MDX Query generated looks like this:&lt;BR /&gt;
&lt;BR /&gt;
SELECT&lt;BR /&gt;
    CrossJoin({ [DIM_PERIOD].[All DIM_PERIOD].Children }, { [MEASURES].[FACTSUM] }) ON COLUMNS,&lt;BR /&gt;
    Hierarchize(Filter({ [DIM_Sales].[All DIM_Sales].[HeadOffice].[Specialoffice].[212302].[A3213502].[3213S202].[       ].Children }, ([DIM_Sales].[DIM_Sales].CurrentMember.Level.Ordinal &amp;lt; [DIM_Sales].[SalesPerson_ID].Ordinal OR Intersect(Ancestors([DIM_Sales].[DIM_Sales].CurrentMember, [DIM_Sales].[SalesPerson_ID]), Filter(Generate({ [DIM_Sales].[All DIM_Sales].[HeadOffice].[Specialoffice].[212302].[A3213502].[3213S202].[       ].Children  }, Ancestors([DIM_Sales].[DIM_Sales].CurrentMember, [DIM_Sales].[SalesPerson_ID])), kindex(kupcase([DIM_Sales].[DIM_Sales].CurrentMember.Properties("CAPTION")), kupcase("040347788")) &amp;lt;&amp;gt; 0)).Count &amp;gt; 0))) ON ROWS&lt;BR /&gt;
FROM&lt;BR /&gt;
    [DEV_MLS_CUBE_V2]&lt;BR /&gt;
&lt;BR /&gt;
If I dont use a filter and do a right click "Isolate 040347788", then the query looks like this:&lt;BR /&gt;
&lt;BR /&gt;
SELECT&lt;BR /&gt;
    CrossJoin({ [DIM_PERIOD].[All DIM_PERIOD].Children }, { [MEASURES].[FACTSUM] }) ON COLUMNS,&lt;BR /&gt;
    { [DIM_Sales.[All DIM_Sales].[HeadOffice].[Specialoffice].[212302].[A3213502].[3213S202].[       ].[040347788] } ON ROWS&lt;BR /&gt;
FROM&lt;BR /&gt;
    [DEV_MLS_CUBE_V2]&lt;BR /&gt;
&lt;BR /&gt;
In both cases its a valid query but no WHERE clause I can use to specify an Member-Level Permission MDX expression.&lt;BR /&gt;
&lt;BR /&gt;
--error , invalid member name at SALESPERSON_ID&lt;BR /&gt;
SELECT&lt;BR /&gt;
    CrossJoin({ [DIM_PERIOD].[All DIM_PERIOD].Children }, { [MEASURES].[FACTSUM] }) ON COLUMNS,&lt;BR /&gt;
    { [DIM_SALES].[All DIM_SALES].Children } ON ROWS&lt;BR /&gt;
FROM&lt;BR /&gt;
    [DEV_MLS_CUBE_V2]&lt;BR /&gt;
WHERE [DIM_SALES].[SALESTEAM].[SALESPERSON_ID].[All Members].['johnsmith']&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
--error , invalid dimension name at SALESPERSON_ID&lt;BR /&gt;
SELECT&lt;BR /&gt;
    CrossJoin({ [DIM_PERIOD].[All DIM_PERIOD].Children }, { [MEASURES].[FACTSUM] }) ON COLUMNS,&lt;BR /&gt;
    { [DIM_SALES].[All DIM_SALES].Children } ON ROWS&lt;BR /&gt;
FROM&lt;BR /&gt;
    [DEV_MLS_CUBE_V2]&lt;BR /&gt;
WHERE [SALESPERSON_ID].[All Members].['johnsmith']&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
Thanks for your help,&lt;BR /&gt;
Bob</description>
      <pubDate>Mon, 31 Jan 2011 11:53:02 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63719#M3237</guid>
      <dc:creator>metalray</dc:creator>
      <dc:date>2011-01-31T11:53:02Z</dc:date>
    </item>
    <item>
      <title>Re: Role based security as input paramenter, data read from oracle db on demand</title>
      <link>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63720#M3238</link>
      <description>Hi Bob,&lt;BR /&gt;
&lt;BR /&gt;
It looks like the MDX you posted in the forum thread has been mangled along the way.  The forum watch email I received has much more MDX in it than I can see here on this page.&lt;BR /&gt;
&lt;BR /&gt;
Is the SalesPerson_ID (040347788) the same as the userid?  Is your SAS OLAP server on a UNIX or a Windows platform?  Watch out for the fact that the user id that will be substituted into the SUB::SAS.Userid placeholder will be normalized - upcased and including a domain suffix on Windows (like 040347788@YOURDOMAIN).&lt;BR /&gt;
&lt;BR /&gt;
It looks like your userid / SalesPerson_ID level has a number of parent levels above it in the DIM_Sales dimension.  One of the difficulties is to express the filter in terms of the lowest level userid member without using/knowing the values of its parent members.  You cant use '[DIM_Sales].[All DIM_Sales].[HeadOffice].[Specialoffice].[212302].[A3213502].[3213S202].[       ].[SUB::SAS.Userid] because whilst that might work for 040347788 it probably wont for many other user ids that have different parents members in that dimension - ie. something other than [DIM_Sales].[All DIM_Sales].[HeadOffice].[Specialoffice].[212302].[A3213502].[3213S202].[       ]&lt;BR /&gt;
&lt;BR /&gt;
One way of expressing the filter - if the userid is a leaf (has no descendants) and it's member name doesn't also appear elsewhere in the tree under different parents is to use something like:&lt;BR /&gt;
&lt;BR /&gt;
Filter( [DIM_Sales].AllMembers, [DIM_Sales].CurrentMember.Name = '040347788' and [DIM_Sales].CurrentMember.Level.Name = 'SalesPerson_ID' )&lt;BR /&gt;
&lt;BR /&gt;
.. that results in a set (hopefully of 1).  The SAS OLAP server complains about sets in a slicer (WHERE) so you can use the Head() function in an MDX WHERE clause variation to only take the first item in the set (assuming you know there are no duplicates):&lt;BR /&gt;
&lt;BR /&gt;
WHERE Head( Filter( [DIM_Sales].AllMembers, [DIM_Sales].CurrentMember.Name = '040347788' and [DIM_Sales].CurrentMember.Level.Name = 'SalesPerson_ID') ) )&lt;BR /&gt;
&lt;BR /&gt;
You can test this out in SAS Enterprise Guide by adding it as a slicer to an existing table that has no slicer - just make sure that table doesn't already include the DIM_Sales dimension in its rows/columns already since you can't use a dimension in the slicer and in rows/columns at the same time.  If you want to use the DIM_Sales dimension in the body of the table then you will need to integrate a filter into the rows/columns components instead of using WHERE (just like in the EG generated MDX you posted).  I just find working on a filter I can readily cut/paste into a permission condition easier to do from the slicer.&lt;BR /&gt;
&lt;BR /&gt;
If you get that working then you could try it in a member level security filter expression by replacing 040347788 with SUB::SAS.Userid (assuming 040347788 is actually the normalized form of the user id), so you end up with something like this:&lt;BR /&gt;
&lt;BR /&gt;
Filter( [DIM_Sales].AllMembers, [DIM_Sales].CurrentMember.Name = 'SUB::SAS.Userid' and [DIM_Sales].CurrentMember.Level.Name = 'SalesPerson_ID' )&lt;BR /&gt;
&lt;BR /&gt;
Hope this gets you a bit further.&lt;BR /&gt;
&lt;BR /&gt;
Cheers&lt;BR /&gt;
Paul&lt;BR /&gt;
&lt;A href="http://platformadmin.com/" target="_blank"&gt;http://platformadmin.com/&lt;/A&gt;</description>
      <pubDate>Wed, 02 Feb 2011 05:43:37 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63720#M3238</guid>
      <dc:creator>PaulHomes</dc:creator>
      <dc:date>2011-02-02T05:43:37Z</dc:date>
    </item>
    <item>
      <title>Re: Role based security as input paramenter, data read from oracle db on demand</title>
      <link>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63721#M3239</link>
      <description>Hello Paul,&lt;BR /&gt;
&lt;BR /&gt;
You are right, the MDX was altered by the forum engine while posting it.&lt;BR /&gt;
Yes, SalesPerson_ID (040347788) is the user ID and before going into&lt;BR /&gt;
identity drive properties I wanted to see if I can set some kind of filter on &lt;BR /&gt;
a LEVEL basis in the first place. We use SAS OLAP Server on a Windows platform.&lt;BR /&gt;
&lt;BR /&gt;
Your assumption is correct, userid / SalesPerson_ID level has a number of parent levels above it and its&lt;BR /&gt;
a ragged hierarchy as well. Specifying a fixes member name in the MDX will be of no use to me.&lt;BR /&gt;
&lt;BR /&gt;
The userid / SalesPerson_ID appears only onces in a hierarchy and is the bottom level at this tage&lt;BR /&gt;
but there might be a point later in time when this sales person will have a LEVEL below&lt;BR /&gt;
it like sales_contracts.&lt;BR /&gt;
&lt;BR /&gt;
If I add a filter using the EG4.2 add filter function that says only select SALESPERSON_ID where&lt;BR /&gt;
it matches exactly 040347788 then EG4.2 generates a lot of MDX:&lt;BR /&gt;
&lt;BR /&gt;
-----------------MDX CODE-------------------&lt;BR /&gt;
&amp;gt;SELECT&lt;BR /&gt;
&amp;gt;   CrossJoin({ [DIM_PERIOD].[All DIM_PERIOD].Children }, { [MEASURES].&lt;BR /&gt;
&amp;gt; [FACTSUM] }) ON COLUMNS,&lt;BR /&gt;
&amp;gt;    Hierarchize&lt;BR /&gt;
&amp;gt; (Filter({ [DIM_SALES].[All].AllMembers }, ([DIM_SALES].&lt;BR /&gt;
&amp;gt; [DIM_SALES].CurrentMember.Level.Ordinal &amp;lt; [DIM_SALES].&lt;BR /&gt;
&amp;gt; [SALESPERSON_ID].Ordinal OR Intersect(Ancestors([DIM_SALES].&lt;BR /&gt;
&amp;gt; [DIM_SALES].CurrentMember, [DIM_SALES].[SALESPERSON_ID]), &lt;BR /&gt;
&amp;gt; Filter(Generate({ [DIM_SALES].[All].AllMembers }, Ancestors([DIM_SALES].&lt;BR /&gt;
&amp;gt; [DIM_SALES].CurrentMember, [DIM_SALES].[SALESPERSON_ID])), kupcase&lt;BR /&gt;
&amp;gt; ([DIM_SALES].[DIM_SALES].CurrentMember.Properties("CAPTION")) = &lt;BR /&gt;
&amp;gt; kupcase("040347788"))).Count &amp;gt; 0))) ON ROWS&lt;BR /&gt;
&amp;gt; FROM&lt;BR /&gt;
&amp;gt; [DEV_MLS_CUBE_V2]&lt;BR /&gt;
--------------------------------------------&lt;BR /&gt;
&lt;BR /&gt;
There is not a single WHERE clause generated (I actually never managed that the EG4.2 MDX contains a WHERE clause).&lt;BR /&gt;
What kind of EG do you have that does that for you?&lt;BR /&gt;
&lt;BR /&gt;
Anyway, I have done it manually and the suggested WHERE clause worked as&lt;BR /&gt;
a MDX expression in the management console for the dimension DIM_SALES&lt;BR /&gt;
&lt;BR /&gt;
Filter( [DIM_SALES].AllMembers, [DIM_Vertrieb].CurrentMember.Name = '040347788' and [DIM_SALES].CurrentMember.Level.Name = '040347788' )&lt;BR /&gt;
&lt;BR /&gt;
Then I added the cube to a info map without applying any filters and opened that info map&lt;BR /&gt;
in web report studio to see if it actually works. I logged in as user 040347788 and it worked.&lt;BR /&gt;
unfortunately it seems to be too restrictive. Do I need to specify that all other Dimensions and members (such&lt;BR /&gt;
as the period) are allowed to be seen by the user?&lt;BR /&gt;
&lt;BR /&gt;
WRS Error:&lt;BR /&gt;
Formula error - Access to member is not allowed - in the "NONEMPTYCROSSJOIN" function&lt;BR /&gt;
&lt;BR /&gt;
or&lt;BR /&gt;
&lt;BR /&gt;
Formula error - Access to member is not allowed&lt;BR /&gt;
(depending which dimension I include in the report)&lt;BR /&gt;
&lt;BR /&gt;
No Query example given and the user does have access to all other dimension (management console)&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
Many thanks for your help. Its a real contribution. What you have written should get into the offical SAS documentation because I think it is an usufull way to write a filter expression rather than the simple ones one finds in the standard documentation provided.</description>
      <pubDate>Wed, 02 Feb 2011 10:16:04 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63721#M3239</guid>
      <dc:creator>metalray</dc:creator>
      <dc:date>2011-02-02T10:16:04Z</dc:date>
    </item>
    <item>
      <title>Re: Role based security as input paramenter, data read from oracle db on demand</title>
      <link>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63722#M3240</link>
      <description>The following MDX eleminated the errors but does not result in anything being shown in Web Report Studio.&lt;BR /&gt;
&lt;BR /&gt;
&amp;gt;{[DIM_PERIOD].defaultmember}&lt;!--CONDITION--&gt;&lt;BR /&gt;
&amp;gt;{[DIM_KPI].defaultmember}&lt;!--CONDITION--&gt;&lt;BR /&gt;
&amp;gt;{[DIM_SALES].defaultmember}&lt;!--CONDITION--&gt;&lt;BR /&gt;
&amp;gt;Filter( [DIM_SALES].AllMembers, [DIM_SALES].CurrentMember.Name &amp;gt;= '040347788' and [DIM_SALES].CurrentMember.Level.Name = '040347788' )&lt;BR /&gt;
&lt;BR /&gt;
Removing [DIM_SALES].defaultmember}&lt;!--CONDITION--&gt; leads again to Formula error - Access to member is not allowed - in the "NONEMPTYCROSSJOIN" function</description>
      <pubDate>Thu, 03 Feb 2011 09:28:54 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63722#M3240</guid>
      <dc:creator>metalray</dc:creator>
      <dc:date>2011-02-03T09:28:54Z</dc:date>
    </item>
    <item>
      <title>Re: Role based security as input paramenter, data read from oracle db on demand</title>
      <link>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63723#M3241</link>
      <description>Hi Bob,&lt;BR /&gt;
&lt;BR /&gt;
It's great to hear that you are starting to get something working now - albeit not yet complete.  The MDX filter that I provided as an example before was quite simple.  As I mentioned in my blog post, in practice, filters usually need to be more complex to handle the security requirements.  I like to start with something simple first to get it working and then add layers of complexity on top testing as I go until I get the results I need. In your case you need to provide access to the levels/members above the level that the user id member is contained in.  Down the track if the userid is no longer a leaf you will need to provide access to the descendants of that member too.  There are MDX functions to help you with this and you can find out more by reading the SAS 9.2 OLAP Server MDX Guide (http://support.sas.com/documentation/cdl/en/mdxag/59575/HTML/default/titlepage.htm) - if you are not already reading it. You may end up with something that looks like the MDX generated for you by Enterprise Guide. One way to get more examples of the functions in action is to use the point and click facilities in SAS Enterprise Guide and then view the MDX that it generates.&lt;BR /&gt;
&lt;BR /&gt;
I modified my demo cube so that my DimSalesPerson dimension has levels above and below the user id level,  Here is an example permission condition filter I used to enable me to drill down the entire range of the dimension but only those paths that include the member that matches the user's userid (with an assumption that the member will only occur once in the tree):&lt;BR /&gt;
&lt;BR /&gt;
Ancestors(Head(Filter([DimSalesPerson].AllMembers,[DimSalesPerson].CurrentMember.Level.Name = 'SalesPersonId' and [DimSalesPerson].CurrentMember.Name = 'SUB::SAS.UserId')).Item(0))&lt;BR /&gt;
&lt;BR /&gt;
So in your case I expect it would be something like this:&lt;BR /&gt;
&lt;BR /&gt;
Ancestors(Head(Filter([DIM_SALES].AllMembers,[DIM_SALES].CurrentMember.Level.Name = 'SALESPERSON_ID' and [DIM_SALES].CurrentMember.Name = 'SUB::SAS.UserId')).Item(0))&lt;BR /&gt;
&lt;BR /&gt;
Please let me know how you go with that variation.&lt;BR /&gt;
&lt;BR /&gt;
I noticed in the latest MDX filter that you posted that you specified both the member name and level name as 040347788 - this seems a bit odd to me - is the level name not SALESPERSON_ID?&lt;BR /&gt;
&lt;BR /&gt;
BTW To see the MDX where clause in action in SAS Enterprise Guide, instead of adding a filter, drag and drop a dimension onto the slicer item just above the table and drill down on that slicer to the member that you want.&lt;BR /&gt;
&lt;BR /&gt;
I am guessing at some point you are also going to want to have filters whereby management level users will be able to see wider subsets of the tree encompassing groups of other users?&lt;BR /&gt;
&lt;BR /&gt;
Cheers&lt;BR /&gt;
Paul</description>
      <pubDate>Thu, 03 Feb 2011 14:17:55 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63723#M3241</guid>
      <dc:creator>PaulHomes</dc:creator>
      <dc:date>2011-02-03T14:17:55Z</dc:date>
    </item>
    <item>
      <title>Re: Role based security as input paramenter, data read from oracle db on demand</title>
      <link>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63724#M3242</link>
      <description>Hi Paul,&lt;BR /&gt;
&lt;BR /&gt;
Many thanks for your detailed post again.&lt;BR /&gt;
Well spotted, my level naming was wrong - I just tried things out because it was not working how I wanted it.&lt;BR /&gt;
I used the following now (including the part you suggested but extended with the CONDITION statement)&lt;BR /&gt;
&lt;BR /&gt;
{[DIM_PERIOD].defaultmember}&lt;!--CONDITION--&gt;&lt;BR /&gt;
{[DIM_KPI].defaultmember}&lt;!--CONDITION--&gt;&lt;BR /&gt;
{[DIM_SALES].defaultmember}&lt;!--CONDITION--&gt;&lt;BR /&gt;
Ancestors(Head(Filter([DIM_SALES].AllMembers,[DIM_SALES].CurrentMember.Level.Name = 'SALESPERSON_ID' and [DIM_SALES].CurrentMember.Name = '040347788')).Item(0))&lt;BR /&gt;
&lt;BR /&gt;
Without the CONDITIONS for the other dimension I get the usual error: Formula error - Access to member is not allowed&lt;BR /&gt;
I dont see how it can work for you without those.&lt;BR /&gt;
&lt;BR /&gt;
When I use this MDX filter in WRS (via an Information Map) and I only have the Period and KPI dimension selected as data to display it works&lt;BR /&gt;
fine but as soon as I add the DIM_SALES dimension the page refreshes and I can see a message tellingm me that for this table no values have been returned.&lt;BR /&gt;
&lt;BR /&gt;
I have not spotted a slicer item on my OLAP View in EG 4.2 the only way to create a slice is doing a right-click on the cube and selecting "Create Slice".&lt;BR /&gt;
The following window does not allow a drill down by clicking on a table row.&lt;BR /&gt;
&lt;BR /&gt;
Your guess is right, at some point I am also going to want to have filters for management level users.&lt;BR /&gt;
&lt;BR /&gt;
You said that the EG4.2 generated MDX queries might be of use later.&lt;BR /&gt;
In EG4.2 I have opened the cube, added SALESPERSON_ID to the rows out of the memebr/level selection panel between the left hand process flow&lt;BR /&gt;
view and the right hand OLAP Query result. This resulted in all the bottom level SALESPERSON_ID's being displayed (around 3500).&lt;BR /&gt;
When I then click on one and select add SALESPERSON_ID to filter, then specify that the member caption should ="040347788" and confirm it then takes&lt;BR /&gt;
a long time for EG4.2 to process this step. I leave it running during the night and see tomorrow in hope&lt;BR /&gt;
that this generated MDX query will be usefull. &lt;BR /&gt;
&lt;BR /&gt;
Here is th result, its seems the "Generate" was taking the longest, generating a set of all bottom level members:&lt;BR /&gt;
&lt;BR /&gt;
Filter(Generate({ [DIM_SALES].[SALESPERSON_ID].AllMembers }, Ancestors([DIM_SALES].[DIM_SALES].CurrentMember, [DIM_SALES].[SALESPERSON_ID])), kupcase([DIM_SALES].[DIM_SALES].CurrentMember.Properties("CAPTION")) = kupcase("040347788"))).Count &amp;gt; 0)))&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
Finally, Paul, I tried it with your query again and I must have made a mistake last time because this time it wors perfectly:&lt;BR /&gt;
&lt;BR /&gt;
Ancestors(Head(Filter([DIM_SALES].AllMembers,[DIM_SALES].CurrentMember.Level.Name = 'SALESPERSON_ID' and [DIM_SALES].CurrentMember.Name = 'SUB::SAS.UserId')).Item(0))&lt;BR /&gt;
&lt;BR /&gt;
Thanks a lot! &lt;BR /&gt;
&lt;BR /&gt;
Regards,&lt;BR /&gt;
Bob&lt;BR /&gt;
&lt;BR /&gt;
Message was edited by: metalray</description>
      <pubDate>Thu, 03 Feb 2011 17:01:36 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63724#M3242</guid>
      <dc:creator>metalray</dc:creator>
      <dc:date>2011-02-03T17:01:36Z</dc:date>
    </item>
    <item>
      <title>Re: Role based security as input paramenter, data read from oracle db on demand</title>
      <link>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63725#M3243</link>
      <description>Hi Bob,&lt;BR /&gt;
&lt;BR /&gt;
Glad to hear you have it working. &lt;BR /&gt;
&lt;BR /&gt;
I learnt something new today - I hadn't seen &lt;!--CONDITION--&gt; before (it looked like an XML comment to me) so I went looking for an explanation.  I couldn't find it in any of the SAS docs but eventually tracked it down to a couple of SAS notes.&lt;BR /&gt;
&lt;BR /&gt;
* SAS Sample 37136: Applying member-level security to a cube dimension that has more than one hierarchy (http://support.sas.com/kb/37/136.html)&lt;BR /&gt;
* SAS Problem Note 13557: MDX restriction of default member may cause error when viewing cube (http://support.sas.com/kb/13/557.html)&lt;BR /&gt;
&lt;BR /&gt;
Is this where you found out about it too, or do you have any other documentation references you could share?&lt;BR /&gt;
&lt;BR /&gt;
The condition thing seems to be required when you are applying member level security to a dimension that has more than 1 hierarchy.  My test cube only had 1 hierarchy in the DimSalesPerson dimension so I didn't need to use it.  I am guessing that your cube has 2 or more hierarchies in your DIM_SALES dimension - is this right? The 37136 note does make me wonder if you will need to provide filters for each of the hierarchies - if it were me I would include testing to make sure my users are limited no matter which hierarchy is used in the query.&lt;BR /&gt;
&lt;BR /&gt;
Best of luck with the rest of your member level security MDX work.&lt;BR /&gt;
&lt;BR /&gt;
Cheers&lt;BR /&gt;
Paul</description>
      <pubDate>Fri, 04 Feb 2011 10:29:21 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Developers/Role-based-security-as-input-paramenter-data-read-from-oracle-db/m-p/63725#M3243</guid>
      <dc:creator>PaulHomes</dc:creator>
      <dc:date>2011-02-04T10:29:21Z</dc:date>
    </item>
  </channel>
</rss>

