Copy Planning Security to Essbase II

As we’ve seen in the last post, we have a list of users and their filter names as they exist in Planning. Continuing on, let’s take a look at what the documentation tells us about filters.

15_1_Filter_Doc1

It’s not evident at first glance, the importance of the section, “as FILTER-NAME”. If you dig one step deeper, we find that the filter-name object needs to be follow the syntax,  application_name.database_name.filter_name”.

15_2_Filter_Doc2

The part above, is what helps us in copying filters from one application to another. The pseudo-code MaxL required to do this might look like:

create or replace filter TargetApplication.TargetDatabase.FilterName as PlanningApplication.PlanningDatabase.FilterName;

The next step is to extract the list above to a file by calling SQLPlus (yes, this one’s on an Oracle database, not SQL Server).

:: Connect to the Planning repository to get filters
CMD /C sqlplus -S planapp/password@UNLKORA:1531/UNLK @"%HOMEDIR%\Definitions\Ext_Filters.sql" > "%OUTPUTDIR%\FilterList.txt"

The contents of “Ext_Filters.sql” looks like:

set heading off; 		-- turn off headings
set feedback off;		-- turns off items like “no of records” from the file
set pages 0;			-- suppresses page breaks, titles etc.
select  chr(39)|| 
        n.object_name || 
        chr(39) ||
        ',''f' ||
        n.object_name ||
        chr(39) filterName
from hsp_users u, hsp_object n
where u.user_id = n.object_id
and u.role in (1,2,4)
order by 1;
exit;

The code above extracts the filters into a usable format.

15_3_FilterList

Now, let’s set up some MaxL scripts to use the output above in an efficient manner. I chose to go with 2 individual scripts, one for copying filters and one for granting the user with the filter. The former might look like (ignore the fact that I am using encryption, this will work either way):

/*
Purpose:Copy filters from Planning to Essbase.
Variables:
$1=Essbase Server 
$2=Reporting Essbase Application Name
$3=Reporting Essbase DB Name
$4=Log Directory
*/
/* spool on to "$4\\Extract_Filter.log"; */
set timestamp on;

login $key 4511023520776288950029499341801077203000 $key 7604639300400586272058221904603835319641613487411156721167402358850821 on $1;

create or replace filter $2.$3.$5 as ScPLN.FINPLN.$5;

spool off;
Logout;
Exit;

And the latter might look like:

/*
Purpose:Grant filter to user.
Variables:
$1=Essbase Server 
$2=Reporting Essbase Application Name
$3=Reporting Essbase DB Name
$4=Log Directory
$5=Filter Name
$6=User Name
*/
/* spool on to "$4\\Grant_Filter.log"; */
set timestamp on;

login $key 4511023520776288950029499341801077203000 $key 7604639300400586272058221904603835319641613487411156721167402358850821 on $1;

grant filter $2.$3.$6 to $5;

spool off;
Logout;
Exit;

Finally, all we need is a little batch script to put all the pieces together.

:: *******************************************************
:: ** Name: Copy_Filters.bat				**
:: ** Purpose: Copies filters from FINPLN to RPTG	**
:: ** Created By: Unlocked Cube Associates              **		
:: ** Created On: 				        **
:: *******************************************************

:: Set up variables
SET HOMEDIR=D:\Admin
SET LOGDIR=%HOMEDIR%\Logs
SET ERRORDIR=%HOMEDIR%\Errors
SET MAXLDIR=%HOMEDIR%\MAXL
SET MAXL_UTILITY=D:\Oracle\Middleware\user_projects\epmsystem1\EssbaseServer\essbaseserver1\bin
SET OUTPUTDIR=%HOMEDIR%\Export\Filters
SET ESS_SERVER=UNLKESS

:: Start Filter extract process
ECHO ******************************************************* > %LOGDIR%\RPTG_Filter.log
ECHO Filter extract process started at %TIME% >> %LOGDIR%\RPTG_Filter.log
ECHO ******************************************************* >> %LOGDIR%\RPTG_Filter.log
ECHO. >> %LOGDIR%\RPTG_Filter.log

:: Connect to the Planning repository to get filters
CMD /C sqlplus -S planapp/password@UNLKORA:1531/UNLK @"%HOMEDIR%\Definitions\Ext_Filters.sql" > "%OUTPUTDIR%\FilterList.txt" 

:: Parse through each item on the list, create filters and assign them to the right users
FOR /f "tokens=1,2 delims=," %%a in (%OUTPUTDIR%\FilterList.txt) DO (
    CALL %MAXL_UTILITY%\startMaxL.bat -D %MAXLDIR%\Import_Filter.maxls 1248210469,1513054427 %ESS_SERVER% RPTG RPTG %LOGDIR% %%b >> %LOGDIR%\RPTG_Filter.log
    CALL %MAXL_UTILITY%\startMaxL.bat -D %MAXLDIR%\Grant_Filter.maxls 1248210469,1513054427 %ESS_SERVER% RPTG RPTG %LOGDIR% %%a %%b >> %LOGDIR%\RPTG_Filter.log
)

:: Filter extract process ends
ECHO. >> %LOGDIR%\RPTG_Filter.log
ECHO ******************************************************* >> %LOGDIR%\RPTG_Filter.log
ECHO Filter extract process ended at %TIME% >> %LOGDIR%\RPTG_Filter.log
ECHO ******************************************************* >> %LOGDIR%\RPTG_Filter.log

The “FOR” loop above will go through each item on the “FilterList.txt” file and process them individually. And that’s it, all I had to do was run the script and my filters were copied over. Though this does provide a quick way to copy filters from 1 app to another, you do still lose the controls you might get if these users were in groups. As I mentioned earlier, this is just a little POC.

About Vijay Kurian

Known as the Clem Fandango of EPM consulting, Vijay Kurian has been developing enterprise solutions for companies for the last 12 years (increment years if reading post-2015). Having worked with Essbase, Planning, DRM and other assorted technologies during that time, he’s made the frankly, average decision, to write about them. He is, surprisingly, an Oracle ACE Associate. He hopes to contribute frequently to US Weekly, People and Sensible Chuckle magazines on improving reporting solutions, creating master data management systems and zzz…

One Comment

  1. Merci pour le partage.

Leave a Reply