Programmazione di oggetti di protezione AMO

Per programmare oggetti di protezione o per eseguire applicazioni che utilizzano oggetti di protezione AMO in Microsoft SQL Server Analysis Services, è necessario essere un membro del gruppo di amministratori del server o del database. Tali gruppi rappresentano i livelli di accesso dispoonibili in SQL Server Analysis Services.

In Analysis Services l'utente può accedere a un oggetto tramite la combinazione di ruoli e autorizzazioni assegnati all'oggetto specifico. Per ulteriori informazioni, vedere Classi di protezione AMO.

Oggetti Role e Permission

I ruoli del server contengono esclusivamente un ruolo nella raccolta, ovvero il ruolo Administrators. Non è possibile aggiungere nuovi ruoli alla raccolta dei ruoli del server. L'appartenenza al ruolo Administrators consente l'accesso completo a ogni oggetto presente nel server

Gli oggetti Role vengono creati a livello di database. Per la gestione del ruolo è necessario solo aggiungere o rimuovere membri dal ruolo nonché aggiungere o eliminare ruoli dall'oggetto Database. Non è possibile eliminare un ruolo se è presente un qualsiasi oggetto Permission associato al ruolo stesso. Per eliminare un ruolo, è necessario ricercare tutti gli oggetti Permission presenti nell'oggetto Database e rimuovere l'oggetto Role dalle autorizzazioni, prima che l'oggetto Role possa essere eliminato dall'oggetto Database.

Le autorizzazioni definiscono le azioni abilitate sull'oggetto in cui viene fornita l'autorizzazione. Le autorizzazioni possono essere fornite negli oggetti Database, DataSource, Dimension, Cube, MiningStructure e MiningModel. La gestione delle autorizzazioni comporta la concessione o la revoca dell'accesso abilitato dalla proprietà di accesso corrispondente. Per ogni accesso abilitato, è disponibile una proprietà che può essere impostata sul livello di accesso desiderato. L'accesso può essere definito per le operazioni Process, ReadDefinition, Read, Write e Administer. L'amministrazione dell'accesso viene definita solo nell'oggetto Database. Il livello di protezione di amministratore di database viene ottenuto quando il ruolo viene concesso con l'autorizzazione relativa al database Administer.

Nell'esempio seguente vengono creati quattro ruoli, ovvero Database Administrators, Processors, Writers e Readers.

Gli appartenenenti al ruolo Database Administrators possono amministrare il database fornito.

Gli appartenenti al ruolo Processors possono elaborare tutti gli oggetti in un database e verificare i risultati. Per verificare i risultati, è necessario abilitare in modo esplicito l'accesso in lettura all'oggetto database per il cubo fornito poiché le autorizzazioni di lettura non vengono applicate agli oggetti figlio.

Gli appartenenti al ruolo Writers possono leggere e scrivere nel cubo fornito e l'accesso alla cella è limitato alla dimensione "United States" relativa al cliente.

Gli appartenenti al ruolo Readers possono leggere nel cubo fornito e l'accesso alla cella è limitato alla dimensione "United States" relativa al cliente.

        static public void CreateRolesAndPermissions(Database db, Cube cube)
        {
            Role role;
            DatabasePermission dbperm;
            CubePermission cubeperm;

            #region Create the Database Administrators role

            // Create the Database Administrators role.
            role = db.Roles.Add("Database Administrators");
            role.Members.Add(new RoleMember("")); // e.g. domain\user
            role.Update();

            // Assign administrative permissions to this role.
            // Members of this role can perform any operation within the database.
            dbperm = db.DatabasePermissions.Add(role.ID);
            dbperm.Administer = true;
            dbperm.Update();

            #endregion

            #region Create the Processors role

            // Create the Processors role.
            role = db.Roles.Add("Processors");
            role.Members.Add(new RoleMember("")); // e.g. myDomain\johndoe
            role.Update();

            // Assign Read and Process permissions to this role.
            // Members of this role can process objects in the database and query them to verify results.
            // Process permission applies to all contained objects, i.e. all dimensions and cubes.
            // Read permission does not apply to contained objects, so we must assign the permission explicitly on the cubes.
            dbperm = db.DatabasePermissions.Add(role.ID);
            dbperm.Read = ReadAccess.Allowed;
            dbperm.Process = true;
            dbperm.Update();

            cubeperm = cube.CubePermissions.Add(role.ID);
            cubeperm.Read = ReadAccess.Allowed;
            cubeperm.Update();

            #endregion

            #region Create the Writers role

            // Create the Writers role.
            role = db.Roles.Add("Writers");
            role.Members.Add(new RoleMember("")); // e.g. redmond\johndoe
            role.Update();

            // Assign Read and Write permissions to this role.
            // Members of this role can discover, query and writeback to the Adventure Works cube.
            // However cell access and writeback is restricted to the United States (in the Customer dimension).
            dbperm = db.DatabasePermissions.Add(role.ID);
            dbperm.Read = ReadAccess.Allowed;
            dbperm.Update();

            cubeperm = cube.CubePermissions.Add(role.ID);
            cubeperm.Read = ReadAccess.Allowed;
            cubeperm.Write = WriteAccess.Allowed;
            cubeperm.CellPermissions.Add(new CellPermission(CellPermissionAccess.Read, "[Customer].[Country-Region].CurrentMember is [Customer].[Country-Region].[Country-Region].&[United States]"));
            cubeperm.CellPermissions.Add(new CellPermission(CellPermissionAccess.ReadWrite, "[Customer].[Country-Region].CurrentMember is [Customer].[Country-Region].[Country-Region].&[United States]"));
            cubeperm.Update();

            #endregion

            #region Create the Readers role

            // Create the Readers role.
            role = db.Roles.Add("Readers");
            role.Members.Add(new RoleMember("")); // e.g. redmond\johndoe
            role.Update();

            // Assign Read permissions to this role.
            // Members of this role can discover and query the Adventure Works cube.
            // However the Customer dimension is restricted to the United States.
            dbperm = db.DatabasePermissions.Add(role.ID);
            dbperm.Read = ReadAccess.Allowed;
            dbperm.Update();

            cubeperm = cube.CubePermissions.Add(role.ID);
            cubeperm.Read = ReadAccess.Allowed;
            Dimension dim = db.Dimensions.GetByName("Customer");
            DimensionAttribute attr = dim.Attributes.GetByName("Country-Region");
            CubeDimensionPermission cubedimperm = cubeperm.DimensionPermissions.Add(dim.ID);
            cubedimperm.Read = ReadAccess.Allowed;
            AttributePermission attrperm = cubedimperm.AttributePermissions.Add(attr.ID);
            attrperm.AllowedSet = "{[Customer].[Country-Region].[Country-Region].&[United States]}";
            cubeperm.Update();

            #endregion
        }