code: @Nonnull
    public EChange assignRoleToUserGroup (@Nullable final String sUserGroupID, @Nonnull @Nonempty final String sRoleID)
    {
      // Resolve user group
      final UserGroup aUserGroup = getOfID (sUserGroupID);
      if (aUserGroup == null)
      {
        AuditHelper.onAuditModifyFailure (UserGroup.OT, sUserGroupID, "no-such-usergroup-id", "assign-role");
        return EChange.UNCHANGED;
      }
  
      m_aRWLock.writeLock ().lock ();
      try
      {
        if (aUserGroup.assignRole (sRoleID).isUnchanged ())
          return EChange.UNCHANGED;
  
        BusinessObjectHelper.setLastModificationNow (aUserGroup);
        internalUpdateItem (aUserGroup);
      }
      finally
      {
        m_aRWLock.writeLock ().unlock ();
      }
      AuditHelper.onAuditModifySuccess (UserGroup.OT, "assign-role", sUserGroupID, sRoleID);
  
      // Execute callback as the very last action
      m_aCallbacks.forEach (aCB -> aCB.onUserGroupRoleAssignment (aUserGroup, sRoleID, true));
  
      return EChange.CHANGED;
    }
docs: Assign the passed role ID to the user group with the passed ID.<br>
  Note: the role ID must not be checked for consistency
  
  @param sUserGroupID
  The ID of the user group to assign the role to.
  @param sRoleID
  The ID of the role to be assigned
  @return {@link EChange#CHANGED} if the passed user group ID was resolved,
  and the role ID was not already previously contained