web-dev-qa-db-ja.com

Nodeアクセステーブルが空になります

現在、複数のレコードをnode = saveを使用してDrupalに挿入しています。通常、一度に数百個です。何らかの理由で、node_accessテーブルが空になり、結果としてユーザーに「表示される」データが削除されました。

誰が何が起こっているのかを知っていますか?

Node_saveコードを確認しましたが、node_access_acquire_grants($node)を介してnode_accessテーブルを再構築するための呼び出しを実行しています。現在、node_accessフックを実装するモジュールはありません。

挿入が終わったら、node_access_rebuild()を呼び出すだけだと思っていました。また、プロセスを1時間に数回実行します。

補足:Drupalは、一括挿入とボリュームに適したシステムではない可能性がありますが、これはこの質問についての説明ではありません。

1
lordg

ノードアクセステーブルが空になる可能性があるのは、 node_access_write_grants() (または node_access_rebuild() )がテーブルのコンテンツを削除してから、データを再設定するときだけです。
node_access_write_grants()の場合、テーブルにノードのアクセスデータが含まれている場合にのみ、テーブルが空になる可能性があります。 node_access_rebuild()の場合、テーブルは常に空になります。

node_access_acquire_grants() が関数に引数として渡されたノードのアクセスレコードを返さなかった場合にのみエントリを追加するため、allエントリが消えることがあります。node_access_rebuild()モジュールがアクセスレコードを返さなかった場合は、そのエントリを追加します。

また、node_access_write_grants()に渡された_$realm_が_$grant['realm']_に含まれている値と一致しない場合(関数に渡されたすべての付与について)、node_access_write_grants()は、引数として渡されたノードのアクセスレコードを削除しますが、アクセスレコードは保存しません。

_// Only perform work when node_access modules are active.
if (count(module_implements('node_grants'))) {
  foreach ($grants as $grant) {
    if ($realm && $realm != $grant['realm']) {
      continue;
    }
    // Only write grants; denies are implicit.
    if ($grant['grant_view'] || $grant['grant_update'] || $grant['grant_delete']) {
      db_query("INSERT INTO {node_access} (nid, realm, gid, grant_view, grant_update, grant_delete) VALUES (%d, '%s', %d, %d, %d, %d)", $node->nid, $grant['realm'], $grant['gid'], $grant['grant_view'], $grant['grant_update'], $grant['grant_delete']);
    }
  }
}
_

モジュールが_$delete_のデフォルト値を使用してnode_access_write_grants()を呼び出し、hook_node_grants()を実装するモジュールがない場合も、同じことが起こります。
これらの場合、node_access_write_grants()に引数として渡されたノードのデータのみがテーブルに含まれていると、ノードアクセステーブルが空になる可能性があります。

1
kiamlaluno