Ik wist dat dimension security in Analysis Services niet moeilijk was. Maar als het niet moeilijk is, waarom kostte het me dan zoveel dagen om het werkend te krijgen? Dat komt doordat je veel kleine instellingen moet doen, en bij dimension security maak je snel een klein foutje. En SSAS heeft ook nog eens heel veel instellingen en tabbladen! Doe je de dingen in de verkeerde volgorde, dan werkt het gewoon niet zoals je wilt. In dit artikel beschrijf ik hoe je dynamische dimension security in SSAS bouwt. Lees eerst alle stappen voordat je het zelf doet. Zo voorkom je fouten.
SSAS bestaat uit dimensies en feiten. Feiten zijn alles wat je kunt meten, en dimensies zijn kijkrichtingen op de data. Het basismechanisme voor security in SSAS werkt met rollen. Je geeft een rol security-instellingen en voegt members aan die rol toe. De security-instellingen moeten dynamisch zijn. Als er nieuwe mensen bij het bedrijf beginnen of als iemand van functie wisselt, moet de security op de OLAP-cube vanzelf meeveranderen. Bouw je een cube voor 5 gebruikers, dan kun je de instellingen gewoon met de hand doen. Heb je geen security nodig, sla dit artikel dan ook over:-)
Je kunt security op veel manieren instellen. Misschien wil je de rechten op organisatie-eenheden beperken, zodat gebruikers alleen hun eigen organisatie-eenheid zien. Of je wilt measures als marge of winst afschermen voor een grote groep gebruikers. Ik beschrijf beide opties: cel/rij-security en measure security.
Ik wil measures beveiligen
Deze is vrij makkelijk te bouwen. Ik zocht op internet en vond veel artikelen met ingewikkelde MDX. Zoals je weet houd ik het graag simpel. Security op een measure in SSAS is eenvoudig. De eerste stap: maak een rol en zet de gebruikers of gebruikersgroepen die security nodig hebben in die rol. Ik noem deze rol “RestrictedUsers.role”. Ga naar het tabblad “Dimension Data” en scrol omlaag naar de cube die je wilt beveiligen.
Hier vind je een dimensie met de naam “Measures Dimension”. In deze dimensie staan alle measures. Calculated measures vind je niet op dit tabblad. Dit werkt alleen goed als je cube op echte, fysieke databasetabellen is gebouwd.
Zet nu het vinkje uit bij alle measures die je wilt afschermen voor de gebruikers in deze rol.
Gebruik je calculated measures, dan kun je die niet verbergen. Een andere manier is ze als 0 te tonen. Kijk op de blog van SqlJason voor meer informatie. Ik heb die methode getest en die werkt. Alleen niet voor mijn klant, want daar MOETEN de measures verborgen zijn.
Ik wil dimension members beveiligen
Deze is wat ingewikkelder. Je moet wat voorbereiden om het werkend te krijgen, en je hebt ook een MDX-statement nodig (arghhh). Je hebt een paar databasetabellen nodig met de security-instellingen per gebruiker. Laten we in dit voorbeeld “Organisatie” nemen. Je wilt de organisatietabel beveiligen, zodat gebruikers alleen de data van hun eigen organisatie zien.
Stap 1 - Maak een Organisation_User-tabel
In de SQL Server-database maak en vul je een tabel of view met de security-data. Stel dat je een Organisation-tabel en een User-tabel hebt. Dan heb je een Organisation_User-tabel nodig met de juiste combinaties. Misschien heeft je organisatie een HR-systeem met verborgen security. Ik bedoel: het weet welke gebruiker op welke afdeling werkt. Die informatie heb je nodig. Haal die informatie eruit en sla ze op in de Organisation_User-tabel.
Je tabellen zien er ongeveer zo uit:
User-tabel: UserID, LoginName; Loginname = Domain + \ + Active Directory-naam. Bijvoorbeeld: NL\Your.Name. Deze is belangrijk.
Organisation-tabel: unieke ID, alle andere attributen
Organisation_User: UserID, OrganisationID
De User-tabel ziet er ongeveer zo uit:

Mijn BI-oplossing is Nederlands, dus in dit voorbeeld gebruik ik andere namen: “Werknemer”, “Branch” en “Branch_Werknemer”.
De volgende stap is de tabellen aan de SSAS Data Source View toevoegen:
** Let op: ik heb ook een NTUserName aan de koppeltabel toegevoegd. Die is niet nodig om dit werkend te krijgen.
Sleep een relatie van de koppeltabel naar werknemer en branch. Je ziet ook nog een lijn naar branch. Die lijn komt van de feitentabel die je wilt beveiligen.
Stap 2 - Maak een dimensie
Maak een dimensie van de User-tabel (werknemer in mijn voorbeeld). Je kunt deze dimensie later verbergen. Dat doe je in de cube: ga naar het tabblad “Dimension usage”, klik met rechts op de dimensie en klik op Properties. Zet dan “Visible” op false.
Stap 3 - Maak een measure group
Ga naar je cube, tabblad Cube Structure. Maak een measure group op de tabel Branch_Werknemer. Noem die “Security” en noem de measure “Security Count”. Verberg de member. Omdat de measure group maar één member heeft, is de hele measure group in Excel verborgen.

Koppel op het tabblad “Dimension usage” de Branch-dimensie en de “Werknemer”-dimensie aan de nieuwe measure group.
Stap 4 - Maak een rol en zet MDX op de dimensie
Net als aan het begin van het artikel heb je een rol nodig om te beveiligen. Voeg een rol “RestrictedUsers” toe en wijs de gebruikers of gebruikersgroep toe. Ik raad Windows-groepen aan, dat houdt het simpel. Laat je IT-afdeling die beheren.
Ga naar het tabblad “Dimension Data”. Je ziet een keuzelijst. Scrol omlaag tot je de cube ziet. Klik niet bovenaan: dat zijn de databasedimensies en niet de cube.
Controleer twee keer dat je de CUBE-DIMENSIE kiest en niet de databasedimensie.
Kies de dimensie die je wilt beveiligen. Ik heb de tabel “Branch” gebruikt voor een dimensie met de naam “Organisation”, dus ik wil mijn organisatietabel beveiligen. 10 cm lager klik je op “Advanced”. Kies het attribuut dat je wilt beveiligen. Nu komt de grote truc waar ik flink hoofdpijn van kreeg :-)
MDX-code:
EXISTS(
{[Organisatie].[Branch Code].Members},
STRTOSET(“[DimWerknemer].[LoginNaam].&[” + username() + “]”),
“Security”
)
Wat betekent dit? Eerst geef je de naam van de dimensie en de hiërarchie die je wilt beveiligen. Het tweede argument is de dimensie met de gebruiker en de loginnaam. De username, die “NL\Your.Name” uit de eerste stap teruggeeft, moet bestaan. SSAS controleert dat via de beveiligde tabel die we hebben gemaakt. De hiërarchie [LoginNaam] is een veld in mijn tabel met de waarden Domain\UserName.
Wil je alleen totalen van de beveiligde members tonen, zet dan onderaan het scherm het vinkje “Enable Visual Totals” aan.

Je moet een MDX maken voor elk attribuut dat je wilt beveiligen
Nu kun je testen of het werkt. Vraag een gebruiker die aan de rol is toegewezen om de cube in Excel te bekijken. Je kunt de security ook controleren door de cube als een andere gebruiker te bekijken.
Een paar dingen om op te letten:
- Process de cube als er iets verandert. Je moet eerst alle dimensies en feiten processen voordat je de rol kunt wijzigen
- Zet de MDX-formule op alle attributen die security nodig hebben
- Werk met Windows-groepen en voeg die aan de rol toe
- Gebruik geen hard-coded dimension security op attributen
- Houd het simpel
Ik hoop dat dit artikel je helpt bij het bouwen van dynamische dimension security in Analysis Services. In de nieuwere versie van SSAS kun je het Tabular-model gebruiken.
Veelgestelde vragen
Hoe verberg ik een measure voor een rol in SSAS?
Maak een rol, open het tabblad Dimension Data en zoek de Measures Dimension van je cube. Zet het vinkje uit bij de measures die je wilt beveiligen. Dit werkt alleen voor measures op fysieke databasetabellen.
Kan ik calculated measures verbergen met measure security in SSAS?
Nee. Calculated measures staan niet in de Measures Dimension op het tabblad Dimension Data, dus daar kun je ze niet verbergen. Je kunt ze als 0 tonen, maar dat werkt niet als de measures echt verborgen moeten zijn.
Hoe zet ik dynamische dimension security op in SSAS?
Bouw een koppeltabel met de gebruiker en de organisatie, zet die in de data source view, maak een dimensie en een verborgen measure group, en voeg aan de rol een MDX-expressie met username() toe.
Welke MDX-expressie gebruik ik voor dynamische dimension security in SSAS?
Gebruik EXISTS op de members van het attribuut dat je beveiligt, met STRTOSET op de loginnaam uit username(). Het derde argument is de naam van de security measure group.
Wat controleer ik als dimension security in SSAS niet werkt?
Kies de cube-dimensie, niet de databasedimensie. Zet de MDX op elk attribuut dat je beveiligt. Process alle dimensies en feiten voordat je de rol wijzigt. Gebruik Windows-groepen in de rol en geen hard-coded security op attributen.







1 reactie
Hi,
I followed your guide in order to implement OLAP security on my cubes.
It works filtering a dimension involved in a Regular Relationship with Measure Groups, but (with a Referenced dimension) it doesn't work.
A simple schema for Dimension Usage below:
dim = dimension
sec = security table
mg = measure group
x = Regular dimension
R = Referenced dimension (between Region and Customer)
mg Sales mg sec Product mg sec Region
dim Product x: Product ID x: Product ID
dim Customer x: Customer ID
dim Region R: Customer ID x: Region ID
sec Product x: Security ID
sec Region x: Security ID
Please let me know if you need further details.
Thanks,
Antonio
Gerelateerde blogs
SSAS OLAP geeft verkeerde resultaten
SSAS: Hoe formatteer je een dimensie-attribuut?
Hierarchieën in Analysis Services 2005