More and more often the requirement comes up to create a "Real-Time Data" cube and SSAS provides several techniques to solve this. One step is, to frequently process dimension data to update them. If you are not using ROLAP storage mode (e.g. in Standard Edition) you could "Process update" the dimension, if it's possible.
For every SSAS database from a given list, this Powershell script loops through all dimensions, validates if the dimenson can be processed with option "Update" and by some predefined criteria, if it should be processed.
It validates:
 - If the dimension could be processed with option "Update".
 - If the dimension do have "rigid attribute relations"; then a process update would fail.
 - Basing on the estimated dimension key count and the last processing date if it should be updated.
   See PARAMETERS below how to configurate this.
With this script you can automatize the SSAS dimension update processing step e.g. without modifying a SSIS package to process cubes if you add or modify a dimension.
This script is doing only less validation and exception handling.
Works with SSAS 2005 and higher versions in all editions.
Requires permissions on the database to process dimensions.

PowerShell
Skript bearbeiten|Remove
<# 
  .SYNOPSIS 
    SSAS Dimension Process Update 
  .DESCRIPTION 
    More and more often the requirement comes up to create a "Real-Time Data" cube and SSAS provides several techniques to solve this. 
    One step is, to frequently process dimension data to update them. If you are not using ROLAP storage mode (e.g. in Standard Edition) 
    you could "Process update" the dimension, if it's possible. 
    For every SSAS database from a given list, this Powershell script loops through all dimensions, validates if the dimenson can be 
    processed with option "Update" and by some predefined criteria, if it should be processed. 
    It validates: 
    - If the dimension could be processed with option "Update". 
    - If the dimension do have "rigid attribute relations"; then a process update would fail. 
    - Basing on the estimated dimension key count and the last processing date if it should be updated. 
      See PARAMETERS below how to configurate this. 
    With this script you can automatize the SSAS dimension update processing step e.g. without modifying a SSIS package to process cubes 
    if you add or modify a dimension. 
    This script is doing only less validation and exception handling. 
    Works with SSAS 2005 and higher versions in all editions. 
    Requires permissions on the database to process dimensions. 
  .PARAMETERS 
    $servername:   The name of the SSAS instance where the databases are located. 
                   E.g. "Servername" for a default instance or "Servername\instance" for a named instance. 
    $databases:    A list of databases with the dimensions to process. You can add several more databases. 
                   The script validates if a database with that name exists before it starts processing. 
    $...EstCount:  The upper number of estimated count of dimension key for the low, mid and high range. 
    $...RecentMin: The number of minutes difference, since last processing before it's processed again. 
  .EXEMPLIFICATION 
    $lowEstCount = 1000 and $lowRecentMin = 60 means, that all dimensions with estimated 1,000 or less dimension keys 
    are processed, if the last processing date is more then 60 minutes ago. 
  .NOTES 
    Author  : Olaf Helper 
    Requires: PowerShell Version 1.0 
              AMO = Analysis Management Object (Microsoft.AnalysisServices) 
  .LINKS 
    AMO Download from "SQL Server Feature Pack" e.g. for SQL Server 2008 R2: 
        http://www.microsoft.com/download/en/details.aspx?id=16978 
    MSDN AMO: 
        http://msdn.microsoft.com/en-us/library/microsoft.analysisservices.aspx 
    AMO Concepts and Object Model: 
        http://msdn.microsoft.com/en-us/library/bb522603.aspx 
#> 
 
# Variable for configuration settings; please modify them for your requirement (see comments PARAMETERS). 
[string] $servername = "ServerName\InstanceName"; 
[Array]  $databases  = ("Adventure Works Cube", ` 
                        "XXX just to test", ` 
                        "AndAnOtherDatabase"); 
# Definition of the low, mid and high ranges. 
[int] $lowEstCount   =   1000;   # Dimension with equal or less then 1,000 keys ... 
[int] $lowRecentMin  =     60;   # ... should be processed at least all 60 min = hourly. 
[int] $midEstCount   =  10000;   # Dimension with equal or less then 10,000 keys ... 
[int] $midRecentMin  =    360;   # ... should be processed at least all 360 min = all 3 hours. 
[int] $highEstCount  = 100000;   # Dimension with equal or less then 100,000 keys ... 
[int] $highRecentMin =    720;   # ... should be processed at least all 360 min = all 6 hours. 
                                 # All dimensions with more keys are not processed by this script! 
 
# Load AMO assembly. 
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.AnalysisServices"| Out-Null; 
[Microsoft.AnalysisServices.Server] $srv = New-Object Microsoft.AnalysisServices.Server; 
 
# Connect to the server. 
$srv.Connect($servername); 
 
# Counter for an overview at the end. 
[int] $errors = 0; 
[int] $done = 0; 
[int] $skipped = 0; 
 
Write-Host ((Get-Date -format yyyy-MM-dd-HH:mm:ss) + ": Started ..."); 
foreach ($dbname in $databases) 
{ 
    Write-Host; 
    if ($srv.Databases.IndexOfName($dbname-le -1) 
    { 
        Write-Host ((Get-Date -format yyyy-MM-dd-HH:mm:ss) + ": $dbname not found; skipped." ) -BackgroundColor Red; 
        $errors += 1; 
        continue; 
    } 
 
    Write-Host ((Get-Date -format yyyy-MM-dd-HH:mm:ss) + ": Starting with $dbname ..."); 
    $db = $srv.Databases.Item($dbname); 
    # Loop trough all dimensions. 
    foreach ($dimension in $db.Dimensions) 
    { 
        # Validate if the dimension can be processed "update" at all. 
        if (!$dimension.CanProcess([Microsoft.AnalysisServices.ProcessType]::ProcessUpdate)) 
        { 
            Write-Host ((Get-Date -format yyyy-MM-dd-HH:mm:ss) + ": Dimension [" + $dimension.Name + "] can not be updated."-ForegroundColor DarkBlue; 
            $skipped += 1; 
            continue; 
        } 
 
        # Validate parameter of the dimension vs settings. 
        [long] $estKeyCount = $dimension.KeyAttribute.EstimatedCount; 
        [int] $minDiff = [DateTime]::Now.Subtract($dimension.LastProcessed).TotalMinutes; 
 
        if ((($estKeyCount -le $lowEstCount)  -and ($minDiff -lt $lowRecentMin)) ` 
            -or ` 
            (($estKeyCount -le $midEstCount)  -and ($minDiff -lt $midRecentMin)) ` 
            -or ` 
            (($estKeyCount -le $highEstCount-and ($minDiff -lt $highRecentMin)) ` 
            -or ` 
            ($estKeyCount -gt $highEstCount) 
           ) 
        { 
            Write-Host ((Get-Date -format yyyy-MM-dd-HH:mm:ss) + ": Dimension [" + $dimension.Name + "] skipped; keys = $estKeyCount."-ForegroundColor DarkBlue; 
            $skipped += 1; 
            continue; 
        } 
 
        [bool] $noRigids = $true; 
        # Loop through all attributes to check if a "rigid relation" exists. 
        foreach ($attribute in $dimension.Attributes) 
        { 
            foreach ($relation in $attribute.AttributeRelationships) 
            { 
                if ($relation.RelationshipType -eq [Microsoft.AnalysisServices.RelationshipType]::Rigid) 
                { 
                    $noRigids = $false; 
                    continue; 
                } 
            } 
 
            if (!$noRigids) 
            {   continue;   } 
        } 
 
        if ($noRigids) 
        { 
            try 
            { 
                Write-Host ((Get-Date -format yyyy-MM-dd-HH:mm:ss) + ": Processing dimension [" + $dimension.Name + "] started; keys = $estKeyCount ...!"); 
                $dimension.Process([Microsoft.AnalysisServices.ProcessType]::ProcessUpdate); 
                $done += 1; 
                Write-Host ((Get-Date -format yyyy-MM-dd-HH:mm:ss) + ": Processing dimension [" + $dimension.Name + "] finished!"-ForegroundColor DarkGreen; 
            } 
            catch 
            { 
                Write-Host $_.Exception.Message -ForegroundColor Red; 
                $errors += 1; 
            } 
        } 
        else 
        { 
            Write-Host ((Get-Date -format yyyy-MM-dd-HH:mm:ss) + ": Dimension [" + $dimension.Name + "] have rigid relations."-ForegroundColor DarkBlue; 
            $skipped += 1; 
        } 
 
        $dimension.Dispose(); 
    } 
 
    $db.Dispose(); 
} 
 
$srv.Disconnect(); 
$srv.Dispose(); 
 
Write-Host ("`n" + (Get-Date -format yyyy-MM-dd-HH:mm:ss) + ": $done dimension(s) processed, $skipped skipped."); 
if ($errors -ne 0) 
{   Write-Host ((Get-Date -format yyyy-MM-dd-HH:mm:ss) + ": $errors error(s) occured, please check the log."-ForegroundColor Red  }; 
Write-Host ("`n" + (Get-Date -format yyyy-MM-dd-HH:mm:ss) + ": Finished");