But there is a difference to select statements inside display methods. Every select statement has activated Record Level Security if the command is in a scope inside a call stack with a display method root. But the current status is not really available trough the property recordLevelsSecurity. A call to this propery will return false, make you thinking Record Level Security is off - but it is not.
display showEmplName()
{
EmplTable emplTable;
EmplName name;
;
info(strfmt("%1", emplTable.recordLevelSecurity())); // this will return false, but actually it's true!
select firstonly Name from emplTable
where emplTable.EmplId == reportTable.emplId; // the record will use RLS (yeah, it's magic)
name = emplTable.Name;
return name;
}
Even here the Record Level Security is on, without explicit change to recordLevelSecurity property:
display showEmplName()
{
EmplName name;
;
name = EmplTable::find(reportTable.EmplId); // the select inside the find method will use RLS even you haven't activate this
return name;
}
If you want to ensure, that Record Level Security is really off, you need to touch the property explicit.
display showEmplName()
{
EmplTable emplTable;
EmplName name;
;
emplTable.recordLevelSecurity(false); // this will really free from RLS
select firstonly Name from emplTable
where emplTable.EmplId == reportTable.emplId;
name = emplTable.Name;
return name;
}
This Problem appears in AX 4.0. In AX 2009 this phenomen does not exists; Record Level Security stays off until you change it explicit.

No comments:
Post a Comment