Consultar Roles De Seguridad Desde SQL en AX 2012

!
Warning: This post is over 365 days old. The information may be out of date.

No es algo común pero en algún caso nos puede venir bien consultar qué roles de seguridad tiene un usuario consultando la base de datos. Lo ideal sería utilizar servicios web o algo parecido, utilizando un código X++ parecido al siguiente (código extraído del capítulo 10: “Licencia, Configuración y Seguridad” de mi libro):

static void QueryRoles(Args _args) { SecurityRole securityRole; SecurityUserRole securityUserRole;

while select securityUserRole
        where securityUserRole.User == 'admin'
    join securityRole 
        where securityRole.RecId == securityUserRole.SecurityRole
{
    info(strFmt("%1", SysLabel::labelId2String(securityRole.Name)));
}

}

Si insistimos en hacer esta consulta desde SQL Server nos vamos a llevar una sorpresa. La tabla SecurityUserRole que almacena los roles asignados a cada usuario existe en la base de datos transaccional de AX, pero la tabla SecurityRole, que almacena los roles en si, no existe. Sería lógico pensar que, a lo mejor, la tabla existe en la base de datos modelo (_model), pero tampoco la encontramos ahí.

Tras recurrir al truco que comentaba unos cuantos post atrás, nos encontramos con que la tabla está efectivamente en la base de datos modelo, pero abstraída tras un procedimiento almacenado, y tiene esta pinta:

[cc_tsql]SELECT T1.NAME, T1.ALLOWPASTRECORDS, … FROM [XXXX_model].[dbo].SECURITYROLE_INLINEFUNC(N’en_us’) T1[/cc_tsql]

Por tanto, jugando un poco con la consulta, podemos obtener el mismo resultado que consultando desde X++:

SecurityUserRole X++

Pero desde SQL Server, y por tanto desde cualquier aplicación externa:

SecurityUserRole SQL

Utilizar con cuidado ;)