1 node.module node_access_rebuild($batch_mode = FALSE)

Rebuilds the node access database.

This rebuild is occasionally needed by modules that make system-wide changes to access levels. When the rebuild is required by an admin-triggered action (e.g module settings form), calling node_access_needs_rebuild(TRUE) instead of node_access_rebuild() lets the user perform his changes and actually rebuild only once he is done.

Note: As of Drupal 6, node access modules are not required to (and actually should not) call node_access_rebuild() in hook_enable/disable anymore.


$batch_mode: (optional) Set to TRUE to process in 'batch' mode, spawning processing over several HTTP requests (thus avoiding the risk of PHP timeout if the site has a large number of nodes). hook_update_N() and any form submit handler are safe contexts to use the 'batch mode'. Less decidable cases (such as calls from hook_user(), hook_taxonomy(), etc.) might consider using the non-batch mode.

See also


Related topics


core/modules/node/node.module, line 3346
The core module that allows content to be submitted to the site.


function node_access_rebuild($batch_mode = FALSE) {
  // Only recalculate if the site is using a node_access module.
  if (count(module_implements('node_grants'))) {
    if ($batch_mode) {
      $batch = array(
        'title' => t('Rebuilding content access permissions'),
        'operations' => array(
          array('_node_access_rebuild_batch_operation', array()),
        'finished' => '_node_access_rebuild_batch_finished'
    else {
      // Try to allocate enough time to rebuild node grants

      // Rebuild newest nodes first so that recent content becomes available quickly.
      $nids = db_query("SELECT nid FROM {node} ORDER BY nid DESC")->fetchCol();
      foreach ($nids as $nid) {
        $node = node_load($nid, NULL, TRUE);
        // To preserve database integrity, only acquire grants if the node
        // loads successfully.
        if (!empty($node)) {
  else {
    // Not using any node_access modules. Add the default grant.
        'nid' => 0,
        'realm' => 'all',
        'gid' => 0,
        'grant_view' => 1,
        'grant_update' => 0,
        'grant_delete' => 0,

  if (!isset($batch)) {
    backdrop_set_message(t('Content permissions have been rebuilt.'));