
sec.createRole( role-name as String, description as String?, role-names as String[], permissions as element(sec.permission)[], collections as String[], [compartment as String?], [external-names as String[]], [queries as Object] ) as (Number|String)
  Creates a new role in the system database for the context 
  database.
  If $role-name is not unique, an error is returned.
 
  If one of the $role-names does not identify a role, an error
  is returned.
 
  If the current user is limited to granting only his/her roles,
  and $role-names is not a subset of the current user's roles, then an 
  error is returned.
  Returns the role-id.
  
http://marklogic.com/xdmp/privileges/create-role or create-data-rolehttp://marklogic.com/xdmp/privileges/grant-all-roles orhttp://marklogic.com/xdmp/privileges/grant-my-roleshttp://marklogic.com/xdmp/privileges/role-set-queries
  This function must be executed against the security database.
// execute this against the security database.
declareUpdate(); 
const sec = require('/MarkLogic/security.xqy');
sec.createRole(
    "Temporary",
    "Temporary worker access",
    ["filesystem-access"],
    [],
    ["testDocument"])
   
// Creates a new role, named "Temporary," with the default collection, 
// named testDocument.   
  
// execute this against the security database.
declareUpdate(); 
const sec = require('/MarkLogic/security.xqy');
    
sec.createRole(
  "region-NA", 
  "Can see NA documents.",
  [], [], [], "compartment-region", [], 
  {
    "read":cts.elementQuery(xs.QName("metadata"), 
      cts.elementWordQuery(xs.QName("region"), "region-NA"))
  }
) 
// Creates a new role, named "region-NA", and with compartment 
// "compartment-region". "region-NA" has role queries which allow any users with
// this role to read documents that have "region-NA" in the metadata.  
  
Stack Overflow: Get the most useful answers to questions from the MarkLogic community, or ask your own question.