Computes the field-permission rows an entity is missing and the ones it should no longer
have. Pure — no I/O, no entity objects, no provider. Everything comes off EntityInfo.
Snapshot defaults mirror entity-level permissions, so enabling field security on an
entity changes no behavior until an administrator tightens a specific field. A role that can
read the entity gets ReadAccess = 'Allow'; its Update and Create follow the entity-level
grants, defaulting to No Access.
A role without entity-level read gets no rows at all. The entity-level gate already
excludes it, so rows would be noise — and a row granting Update without Read would violate
the Read-required CHECK constraint anyway.
Unrestrictable fields (primary keys, __mj_ columns) get no rows. They are forced open
in the aggregation regardless, so rows for them are clutter that would also trip the
save-time guard.
No role is excluded — including the ones the MJ system user holds. Those rows are what
keeps the system user working now that the aggregation has no bypass for it: it holds the
standard roles (UI, Developer, Integration), which carry entity read on essentially
everything, so the snapshot grants them Allow here and the save-time guards refuse any
later Deny aimed at them. Access the server relies on is therefore visible in the data
rather than implied by an exemption in code.
Computes the field-permission rows an entity is missing and the ones it should no longer have. Pure — no I/O, no entity objects, no provider. Everything comes off
EntityInfo.Snapshot defaults mirror entity-level permissions, so enabling field security on an entity changes no behavior until an administrator tightens a specific field. A role that can read the entity gets
ReadAccess = 'Allow'; its Update and Create follow the entity-level grants, defaulting toNo Access.A role without entity-level read gets no rows at all. The entity-level gate already excludes it, so rows would be noise — and a row granting Update without Read would violate the Read-required CHECK constraint anyway.
Unrestrictable fields (primary keys,
__mj_columns) get no rows. They are forced open in the aggregation regardless, so rows for them are clutter that would also trip the save-time guard.No role is excluded — including the ones the MJ system user holds. Those rows are what keeps the system user working now that the aggregation has no bypass for it: it holds the standard roles (UI, Developer, Integration), which carry entity read on essentially everything, so the snapshot grants them
Allowhere and the save-time guards refuse any laterDenyaimed at them. Access the server relies on is therefore visible in the data rather than implied by an exemption in code.