Если Вы работаете с SQL Server Analysis Services (SSAS), то должно быть Вы знакомы с Open source проектом Analysis Services Stored Procedure Project (ASSP). Это библиотека расширенных хранимых процедур, базирующихся на использовании серверной объектной модели SSAS. Это хороший образец для разработки собственных внешних хранимых процедур. В библиотеке ASSP немало полезных функций, часть из которых покажу как подключить к своему OLAP-проекту.
Проследуем на web-страницу проекта и скачаем его. Открываем проект в Microsoft Visual Studio, компилируем, а полученный ddl-файл укладываем где-нибудь рядом с папкой проекта OLAP.
Открываем среду SQL Server Management Studio (SSMS), подключаемся к серверу SSAS с полномочиями администратора, в контекстном меню (щелчок правой кнопкой мыши на узле сервера) выбираем пункт Facets (Аспекты) и проверяем / устанавливаем свойство UserDefinedFunctionsEnabled=True.
В среде Business Intelligence Management Studio (BIDS) открываем OLAP-проект, правой кнопкой мыши жмем на узел Assemblies и подключаем скомпилированную сборку, не забывая установить соответствующие свойства:
Сборку можно подключить прямо к серверу SSAS, а затем, открыв в SSMS окно нового MDX-запроса, удостовериться, что внешние процедуры работают:
CALL ASSP.Discover("DISCOVER_CONNECTIONS") ; CALL ASSP.discoverXmlMetaData("\Database\Cubes\Cube\MeasureGroups\MeasureGroup\Partitions\Partition") ;
Хорошо бы еще, чтобы подобные функции были доступны с OLAP-клиента, причем некоторые из них только администратору системы.
Создадим скрытое, непривязанное ни к одной размерной группе измерение "_Пользователи OLAP". Такие измерения я называю вспомогательными. В этом измерении ключевой атрибут сделаем неагрегируемым и добавим свойства атрибута "Роль пользователя OLAP" (возможные значения: администратор, начальник, рядовой, ...), "Состояние пользователя OLAP" (возможные значения: активный, заблокирован, уволен). Также, можно добавить другие атрибуты, для удобства создать пользовательские иерархии, наполнить измерение данными из Active Directory - исходя из Ваших реалий:
Переключаемся на вкладку "Calculations" в режиме "Script View" и создаем скрытую вычисляемую меру:
ALTER CUBE CURRENTCUBE UPDATE DIMENSION [_Пользователи OLAP], DEFAULT_MEMBER = StrToMember('[_Пользователи OLAP].[Пользователь OLAP].[' + UserName() + ']'); -- или устанавливаем явно: -- ALTER CUBE CURRENTCUBE UPDATE DIMENSION [_Пользователи OLAP], DEFAULT_MEMBER = -- StrToMember('[_Пользователи OLAP].[Пользователь OLAP].[конкретныйПользователь]'); CREATE MEMBER CURRENTCUBE.[MEASURES].[Тип пользователя сессии] AS [_Пользователи OLAP].[Пользователь OLAP].Properties("Состояние пользователя OLAP", typed) + "_" + [_Пользователи OLAP].[Пользователь OLAP].Properties("Роль пользователя OLAP", typed) ,ASSOCIATED_MEASURE_GROUP = 'Показатели' ,DISPLAY_FOLDER = 'Системные' ,VISIBLE = 0 ;
Переключаемся на вкладку "Acttions" и создаем возвращающие набор (Rowset) действия:
которые, благодаря условию: IIF([MEASURES].[Тип пользователя сессии]='активный_администратор', "True", "False") будут доступны только администратору системы.
Осталось только развернуть проект на сервере, подключиться клиентским OLAP-приложением, поддерживающим Actions (такие как, MS Excel, Office Web Components (OWC), ProClarity), и проверить работоспособность столь замечательных и полезных внешних процедур из проекта ASSP:
Надеюсь, Вам понравилось :)