Heute möchte ich ein aktuelles Beispiel aus einem Kundenprojekt vorstellen, da sicher einige Analysten vor einer ähnlichen Herausforderung stehen. Dazu entführe ich Sie kurz in die technischen Abgründe der Analysis Services auf dem Microsoft SQL-Server, genauer gesagt in die Row-Level-Security.
Im laufenden Projekt ergab sich die Anforderung, dass Daten für bestimmte User erst ab einem bestimmten Zeitpunkt im Cube sichtbar sein dürfen, nämlich wenn sie explizit freigegeben sind. Eine definierte Gruppe (z.B. beteiligte Analysten und Datenlieferenten) soll die Daten zuerst sehen und prüfen können, bevor diese z.B. auch von der Geschäftsführung und dem Management einsehbar sind. So wird verhindert, dass Verwirrungen entstehen oder falsche Entscheidungen getroffen werden.
So weit so gut, ich habe – wie schon in anderen Projekten auch – alles vorbereitet, um die Row-Level-Security für den Cube zu implementieren.
Nachdem die Vorbereitungen auf der relationalen Ebene abgeschlossen waren, bin ich im Cube hergegangen und habe die entsprechenden Rollen angelegt. Eine Superuser-Rolle, deren Mitglieder alles sehen darf und die User Rolle, welche nur die speziellen Daten sehen darf.
Die Superuser-Rolle war schnell erledigt, da diese gänzlich ohne Row-Level-Securtiy auskommt.
Als ich dann die User-Rolle angelegt hatte und die entsprechenden Attribute mit den MDX-Statements zur Securtiy versehen hatte, bekam ich beim Browsen im Cube die Fehlermeldung: „Das Attribut ‚XXX‘ in der Dimension ‚YYY‘ hat einen generierten Dimensionssicherheitsausdruck, der nicht gültig ist.“ (The ‘XXX’ attribute in the ‘YYY’ dimension has a generated dimension security expression that is not valid).
Nach einiger Recherche und Analyse stellte ich fest, dass die Security nicht in der Cube-Dimension, sondern auf der Datenbankdimension hinterlegt war. Die Datenbankdimensionen werden in der Darstellung zuerst angezeigt, anschließend erst die Cube Dimensionen, was mir hier zum „Verhängnis“ wurde.
Die Cube Dimension ist eine Instanz der Datenbank Dimension in einem speziellen Cube. Die Datenbank Dimension kann in mehreren Cubes oder in einem Cube mehrfach (Role-Playing Dimension) verwendet werden.
Die Darstellung in Visual Studio ist also etwas ungünstig. Teilweise hat man so viele Dimensionen in Einsatz, dass die Darstellung unübersichtlich wird und die zuunterst dargestellten leicht übersehen werden können.
Es gilt unbedingt zu beachten, die Row-Level-Security immer auf Cube-Ebene und nicht auf Datenbankebene zu setzen.
Es handelt sich hierbei zwar um ein recht triviales Problem, aber wie sooft ist die Fehlermeldung nicht sonderlich hilfreich, sodass man nicht sofort darauf kommt, dass die Sicherheit auf der falschen Ebene gesetzt wurde.