Access オブジェクトへの設計変更を保存するには、排他ロックが必要です

元の KB 番号: 283228

注:

高度な機能: 高度なコーディング、相互運用性、マルチユーザー スキルが必要です。 この記事は、Microsoft Access データベース (.mdb と .accdb) にのみ適用されます。

現象

ツール バーをカスタマイズしたり、デザイン ビューで Microsoft Access フォーム、レポート、マクロ、またはモジュールを開こうとすると、次のメッセージが表示されます。

現時点では、データベースへの排他的アクセス権はありません。 変更を続行すると、後で保存できない場合があります。

Access フォーム、レポート、マクロ、またはモジュールに対して行ったデザイン変更を保存しようとすると、次のメッセージが表示されます。

現時点では、データベースへの排他的アクセス権はありません。 デザインの変更は保存されません。

新しいデータ アクセス ページを保存しようとすると、次のメッセージが表示されます。

データベースを排他的にロックできないため、このデータ アクセス ページへのリンクを作成できませんでした。

原因

  • デザイン ビューでフォーム、レポート、マクロ、モジュール、またはコマンド バーを開こうとしています。
  • 他のユーザーが同じデータベースを開いている間に、これらのオブジェクトの種類または新しいページ リンクのいずれかにデザイン変更を保存しようとしています。

これらのオブジェクトの種類に対する設計変更を保存するには、Access がデータベースの排他ロックを取得できる必要があります。

解決方法

複数の開発者が Access アプリケーションを同時に設計している場合は、Microsoft Access 用の Microsoft Visual SourceSafe アドインを使用してソース コード管理を実装する必要があります。 または、データベースのローカル作業コピーを各開発者に配布する必要があります。 これらの各オプションについて説明します。

ソース コード管理の実装

Microsoft Access Visual SourceSafe Add-Inを使用すると、開発中に Access アプリケーションをソース コード管理下に置くことができます。 アプリケーションをソース コード管理下に置くと、アプリケーションに加えられた変更を追跡して保存することができます。 Microsoft Visual SourceSafeを使用すると、オブジェクトの履歴を確認し、以前のバージョンのオブジェクトに戻すことができます。 Microsoft Access アプリケーションでオブジェクトをチェックしたり、変更したり、ローカル コピーに新しいオブジェクトを作成したりしてから、ソース コード管理下のメイン データベースにチェックできます。 Microsoft Access Visual SourceSafe Add-Inは、Microsoft Office XP Developer で入手できます。 Microsoft Access Visual SourceSafe アドインを使用するには、Microsoft Visual SourceSafeもインストールする必要があります。これは、Microsoft Office XP Developer でも使用できます。

個々の作業データベースの使用

実装できるもう 1 つのオプションは、データベース アプリケーションのマスター コピーを一元化された場所に保持し、各開発者のコンピューターでデータベースの個々の作業コピーを使用することです。 各開発者は、データベースのローカル作業コピー内のアプリケーションの個々の部分を開発します。 開発者がデータベース アプリケーション内のオブジェクトに変更を加えたい場合は、マスター データベースからローカル作業データベースにオブジェクトをインポートします。 その後、開発者はローカル作業データベース内のオブジェクトに必要な変更を加え、オブジェクトを保存します。 開発者がマスター データベースに変更をコミットする準備ができたら、オブジェクトをマスター データベースにエクスポートし、元のオブジェクトを上書きします。

この方法を使用する場合の欠点の 1 つは、複数の開発者が同じオブジェクトに対して同時に作業しているかどうかをローカルで判断する方法がないということです。 開発者がオブジェクトをマスター データベースにエクスポートすると、開発者は、別の開発者がマスター データベースにコミットした変更を知らないうちに上書きできます。

詳細情報

フォーム、レポート、新しいページ リンク、マクロ、モジュール、コマンド バーなどの Access 固有のオブジェクトに対する設計変更を保存するには、Access 2002 は 保存 操作中にのみデータベースをロックできる必要があります。 テーブル、クエリ、リレーションシップは、Microsoft Jet 固有のオブジェクトであるため、この制限に該当しません。 Microsoft では、いくつかの理由で Access 2002 でこの要件を使用します。

  • 他の Visual Basic Environment クライアント アプリケーションとの整合性を提供します。
  • Jet データベース エンジンへの依存関係を停止します。
  • アクセス固有のオブジェクトの安定性が向上します。

他の Visual Basic 環境クライアント アプリケーションとの整合性を提供します

Access 2002 では Visual Basic 環境がホストされるため、Microsoft Access で使用される保存モデルは、Visual Basic 環境をホストする他のアプリケーションと一致している必要があります。 Visual Basic 環境では、ソース コード管理下にない Visual Basic プロジェクトの排他的な編集と保存のみが許可されます。 これは、Visual Basic 6.0、および Visual Basic 環境をホストするすべての Office アプリケーションにも当てはまります。

Jet データベース エンジンへの依存関係を停止する

Access では、Microsoft Access プロジェクト (.adp) ファイルと Microsoft Access データベース (.mdb) を作成できます。 Access プロジェクトを使用すると、開発者は Microsoft Jet の別のデータベース エンジンとして Microsoft SQL Serverを使用できます。 以前は、すべての Access 固有のオブジェクト (フォーム、レポート、マクロ、モジュール、およびコマンド バー) は、ストレージ用の Jet データベース エンジンに依存していました。 これらのオブジェクトは、Microsoft Jet データベースの Access 固有のシステム テーブルに格納されました。 Access が Microsoft Jet の代わりに Microsoft SQL Server を使用できるため、Microsoft は Jet データベース エンジンに依存しない Access 固有のオブジェクトのストレージ メカニズムを開発する必要がありました。

アクセス固有オブジェクトの安定性を向上させる

プロジェクト ストレージ モデルを使用すると、Access 固有のオブジェクトと Visual Basic プロジェクトの安定性が向上します。 Visual Basic for Applicationsでは、ソース コード管理なしで Visual Basic プロジェクトのマルチユーザー編集を許可したことがない。 Microsoft Access 95 と Microsoft Access 97 は、マルチユーザー環境で行われたプロジェクトの変更をVisual Basic for Applicationsから非表示にし、後でプロジェクトにマージすることで、この制限を回避する可能性があります。 ただし、これは Visual Basic プロジェクトの安定性に影響を与える可能性がありました。 そのため、Microsoft Access では、プロジェクトにエディターが 1 つだけであることを確認するために、Access 固有のオブジェクトを設計するときに排他的ロックが必要です。

マルチユーザー環境での Access オブジェクトの編集

ユーザーは排他的または共有用にデータベースを開く可能性があるため、Access によって表示される保存動作は、ユーザーがデータベースを開いた方法と、複数のユーザーが現在アクセスしているかどうかによって異なります。

開発者が排他的に使用するためにデータベースを開いた場合、開発者は、読み取り/書き込みアクセス用にデータベースを開き、オブジェクトのデザインを変更するための適切なアクセス許可を持っている場合に限り、Access 固有のオブジェクトの設計を保存できます。

ユーザーが共有用にデータベースを開いた場合、ユーザーは、読み取り/書き込みアクセス用にデータベースを開き、オブジェクトのデザインを変更するための適切なアクセス許可を持ち、Access がデータベースの排他ロックを取得できる限り、アクセス固有のオブジェクトの設計を保存できます。

ロックの昇格

データベースの使用が排他的であることを確認するために、Access は Jet データベース エンジンの接続制御機能を使用して、ユーザーの共有ロックを排他に昇格させます。 Access は、ユーザーがデザイン ビューでフォーム、レポート、マクロ、またはコマンド バーを開くとすぐに、共有ロックを排他ロックに昇格しようとします。 Access では、この時点でロックの昇格が試行され、後でユーザーが排他的ロックを取得できないため、ユーザーが保存できないことが検出された場合にのみ、ユーザーが複数の設計変更を行うシナリオを防ぎます。 ユーザーがデザイン ビューでオブジェクトを開くとすぐにロックの昇格を試みることで、ユーザーがデザインを変更する前に排他ロックを取得できない場合にユーザーに警告できます。 デザイン ビューでモジュールを開くときに、アクセスはロック昇格を試みません。ただし、ユーザーがデータベース内のモジュールを編集するとすぐにロック昇格が試みられます。

Access は、ユーザーがダーティオブジェクトをすべて保存または破棄し、他のオブジェクトがデザイン ビューで開かなくなるまで、排他ロックを維持します。 この後、データベースが最初に共有で開かれた場合、Access はロックを共有に戻します。

ユーザーがデザイン ビューでオブジェクトを開いたときにロックを排他に昇格できない場合、Access はユーザーにメッセージを通知します。

現時点では、データベースへの排他的アクセス権はありません。 変更を続行すると、後で保存できない場合があります。

この警告メッセージに続いて、Access はデザイン ビューでオブジェクトを開き、ユーザーがデザインを変更できるようにします。 ユーザーがオブジェクトを保存しようとすると、Access は共有ロックを排他的に昇格しようとします。 ロックの昇格が成功した場合、ユーザーが他のすべてのダーティ オブジェクトを保存または破棄し、デザイン ビューでオブジェクトが開いたままになるまで、Access によってオブジェクトが保存され、排他ロックが維持されます。 ロック昇格が失敗した場合、ユーザーは次のメッセージを受け取ります。

現時点では、データベースへの排他的アクセス権はありません。 デザインの変更は保存されません。

ユーザーがダーティ オブジェクトを閉じて変更を保存しようとすると、Access は、オブジェクトを閉じ、それに加えられたデザインの変更を破棄するか、開いたままにして保存しないオプションをユーザーに求めます。

動作の再現手順

  1. 同じコンピューターで 2 つの Microsoft Access インスタンスを起動します。

  2. 両方のインスタンスでサンプル データベース Northwind.mdbを開きます。

  3. Microsoft Access の最初のインスタンスで、[デザイン] ビューで [顧客] フォームを開きます。

    次のメッセージが表示されます。

    現時点では、データベースへの排他的アクセス権はありません。 変更を続行すると、後で保存できない場合があります。

  4. [ OK] を クリックしてメッセージをクリアします。

    フォームがデザイン ビューで開きます。

  5. フォームにテキスト ボックス コントロールを追加します。

  6. [ファイル] メニューで [保存] をクリックします。

    次のメッセージが表示されます。

    現時点では、データベースへの排他的アクセス権はありません。 デザインの変更は保存されません。

  7. [ OK] を クリックしてメッセージをクリアします。

  8. コンピューター上の Access の 2 番目のインスタンスを閉じます。

  9. Access の最初のインスタンスで、フォームをもう一度保存してみてください。

    フォームは正常に保存されます。