Resources & Cost
A Role
A role is a skill; not RSRC; not MSP Generic; staff later

What a planner means
Oracle: roles are personnel job titles or skills (architect, general laborer, engineer). You build a standard hierarchy, assign roles to labor and nonlabor resources and to activities, and set multiple price/unit rates and units/time limits. The roles on an activity are its skill requirements.
You can assign one or more roles to a resource, with a proficiency and exactly one primary role (the main role that resource is performing). Oracle’s example: Joe is 1 – Master as software engineer, but his primary role is manager at 3 – Skilled.
Assign roles to activities the way you assign resources while the plan is still a skill request. When staffing is known, replace the role with a resource. A role-only assignment is not a named person.
A preference can make the role limit include limits of resources who have that role as primary (and whether inactive resources count). Default: role limits from the primary resource’s limit, which “may not accurately reflect a role’s planned allocation.” You can instead define custom limits over time (unique effective date per row). API: max units/time “should correspond to the number of people who can fill this role.”
This is not RSRC, not OBS, and not an activity code.
XER
ROLES
| Column | Oracle label |
|---|---|
role_id | Unique ID |
role_short_name | Role ID |
role_name | Role Name |
parent_role_id | Parent Role |
role_descr | Responsibilities |
seq_num | Sort Order |
cost_qty_type | Price Time Units |
def_cost_qty_link_flag | Calculate costs from units |
RSRCROLE (resource ↔ role)
| Column | Oracle label |
|---|---|
rsrc_id | Resource |
role_id | Role |
skill_level | Proficiency |
rsrc_role_id | Role (map repeats a Role label — do not invent which is primary) |
Stored proficiency tokens are not listed. Oracle’s UI example uses “1 – Master” / “3 – Skilled”. Do not invent SL_* codes.
ROLELIMIT
| Column | Oracle label |
|---|---|
rolelimit_id | Unique ID |
role_id | Role ID |
max_qty_per_hr | Max Units / Time |
start_date | Effective Date |
ROLERATE — role prices; see RSRC / TASKRSRC (and Roles / Prices). RSRC.role_id is the resource’s Primary Role. TASKRSRC.role_id is the Role on the assignment. An assignment can point at a resource, a role, or both — exact UI pairing when one is blank is unverified.
Microsoft Project
There is no role dictionary. A Generic resource is a Yes/No flag on a resource (“identified by skill rather than by name”). You later replace that resource with a named one (Resource Substitution Wizard in enterprise). Same planning idea. Not the same object. A P6 role is a hierarchy with rates, limits, and proficiency. Generic is one checkbox on RSRC-equivalent.
Don't
- Treat ROLES as RSRC, or
role_idasrsrc_id. - Treat a role assignment as a named person, or a generic MSP resource as a P6 role row.
- Treat OBS Responsible Manager as a role.
- Invent
skill_leveltokens, or assumersrc_role_idis primary without a citation. - Collapse role-only TASKRSRC rows into named resources without saying the person was invented.
Sources
- Oracle About Roles [27 Aug 2026]
- Oracle Assigning a Resource to a Role [27 Aug 2026]
- Oracle Assigning Roles to an Activity [27 Aug 2026]
- Oracle Define role limits over time [27 Aug 2026]
- Oracle RoleLimit API [27 Aug 2026]
- Oracle XER ROLES / RSRCROLE / ROLELIMIT [27 Aug 2026]
- Microsoft Generic [27 Aug 2026]