Sempre più spesso i clienti mi chiedono come fare a limitare l’uso di misure a determinati gruppi di utenti con Analysis Services.

La risposta è semplice: usa i ruoli e definisci un “Allowed Member Set” sulla dimensione delle misure.

Purtroppo questa scelta volte a ripercussioni indesiderate, ed oggi vi illustro cosa può capitare in presenza di misure calcolate che utilizzano la clausola di “NON_EMPTY_BEHAVIOR”.

Il “NON_EMPTY_BEHAVIOR” è utilizzato (ed a volte in maniera inesatta) in AS 2005 per sfruttare determinate caratteristiche particolare del motore e velocizzare il calcolo. Questa clausola verrà rimossa (deprecata) in AS 2008:

Category Deprecated Feature Comments

MDX

NON_EMPTY_BEHAVIOR query optimizer hint was turned on by default

The NON_EMPTY_BEHAVIOR query optimizer hint will be turned off by default in a future release. It is an MDX optimization hint that can produce incorrect results when it is not used correctly.

Prendiamo il database di esempio “Adventure Works DW” e definiamo un Ruolo in questo modo:

image_thumb

nella pagina Membership aggiungete un utente che non è amministratore:

image1_thumb

Nella pagina “Cubes” aggiungete il diritto di lettura (Read) al cubo “Adventure Works”:

image51_thumb

nella pagina “Dimension data”, espandete la lista “Dimension” in modo da selezionare la dimensione delle Misure:

image9_thumb

a questo punto andate sul tab Advanced ed inserite la funzione MEASUREGROUPMEASURES("Internet Sales")  nei “Allowed Member Set”:

image17_thumb

premete OK e salvata il ruolo.

Aprite Management studio ed eseguite questa query:

Select

[Measures].[Internet Sales Amount] on 0 from [Adventure Works]

che ritornerà il seguente risultato:

image21_thumb

Ora eseguite Management Studio (è l’eseguibile sqlwb.exe) con l’utente utilizzato nel ruolo:

runas /user:mytest2008\ausko sqlwb.exe

Eseguite la stessa query e questa volta avrete come risultato un bell’errore:

MdxScript(‘Adventure Works DW’) (1997, 24) The dimension '[Reseller Sales Amount]' was not found in the cube when the string, [Reseller Sales Amount], was parsed.

Il motivo di questo errore è dovuto al fatto che nel Calculation Script presente nel cubo Adventure works è utilizzato la clausola “NON_EMPTY_BEHAVIOR” che fanno riferimento a misure che non sono permesse all’utente in oggetto.

In fatti se si commenta tutto il Calculation Script dalla riga 150 in poi tutto funziona bene.

Una contro prova può essere quella di lasciare la seguente misura calcolata non commentata:

/*-----------------------------------------------------------------------------
| Reseller Sales Calculations |

-----------------------------------------------------------------------------*/

Create Member CurrentCube.[Measures].[Reseller Gross Profit]


 As [Measures].[Reseller Sales Amount]

    -

    [Measures].[Reseller Total Product Cost], 

Format_String = "Currency"

,

Non_Empty_Behavior =

{

   [Reseller Sales Amount],

   [Reseller Total Product Cost]

}

;

e togliere la clausola di Non_Empty_Behavior:

/*-----------------------------------------------------------------------------

| Reseller Sales Calculations |

-----------------------------------------------------------------------------*/

Create Member CurrentCube.[Measures].[Reseller Gross Profit]


 As [Measures].[Reseller Sales Amount]

    -

    [Measures].[Reseller Total Product Cost],


Format_String
= "Currency"

//,

//Non_Empty_Behavior =

// {

//   [Reseller Sales Amount],

//   [Reseller Total Product Cost]

// }

in questo modo la query

Select[Measures].[Internet Sales Amount] on 0 from [Adventure Works]

funziona correttamente.

 

Un ulteriore metodo è quello di configurare a livello di cube design la proprietà:
ScriptErrorHangling = IngoreAll

in questo modo qualsiasi errore riportato dall’Engine a causa di problemi con il Calculation Script verranno ignorati.

Il suggerimento finale per questo problema è di stare sempre attenti quando volete definire una restrizione nell’accesso alle misure tramite un ruolo.

Buon Lavoro

Saluti

Andrea Uggetti
Support Escalation Engineer
Microsoft Enterprise SQL Support