5

マルチユーザーのフロントエンド/バックエンド MS Access 2010 アプリケーションがあります。圧縮や修復などのバックエンドで作業を行いたい場合に、リモート フロントエンドを閉じるプロセスを追加しました。これは、テーブル フィールドのタイマー ベースのチェックで、特定の値がある場合はアプリケーションを閉じます。

ユーザーがデータベースに接続しているかどうかを確認するために、次の 2 つのチェックを行います。

  • ログイン/ログアウトプロセスがあり、まだログインしている人を確認できます(フォームベースなので、フォームを閉じてもフロントエンドがまだ開いているなど、誤りがあります)。

  • .ldb ファイル ビューアーを使用して、何かがまだ接続されているかどうかを確認しました

2 つの質問:

  • LDBビューアで表示できなかった場合、backedへの接続が存在する可能性はありますか?

  • バックエンドからすべての接続を強制的に切断する100%確実な防弾方法はありますか?

4

4 に答える 4

6

修正プログラムが存在し、私が管理している MS-Access アプリケーション用に修正済みです。ただし、これは便利ではなく、実装も簡単ではありません。

最初に、ファイルのロックとロックされたファイルの背景について説明します。

ロック ファイルは便利なツールですが、実際のロックではなくインジケーターです。編集することはできますが、効果はありません。

ライブ MS-Access セッションは、データの編集、オブジェクトの変更 (例: テーブルのインデックス作成)、またはメンテナンス タスクの実行時に、.accdb または .mdb バックエンド データベース ファイルのファイル ロックを維持できます。そのリストの最後の 2 つの項目はめったにありません。セッションで開いたデータベース ファイル以外の別のデータベース ファイルに影響を与えるには多少の努力が必要ですが、実際に観察されることもありますが、これらのセッションを閉じるとロックが解放され、ほとんどの場合意思。

クラッシュした MS-Access セッションは、.accdb または .mdb バックエンド データベース ファイルのファイル ロックを維持できます。問題のあるマシンを強制的に再起動すると、ロックが解放されます。ほとんどの場合、解放されます。

ロック ファイル (.ldb または .laccdb) を使用してこれらを追跡できます。

Access データベースに対して ODBC または ADO を使用するサードパーティ レポート アプリケーションは、ファイルをロックできないように、接続を読み取り専用に設定する必要があります。運が良ければ、システム所有者はあなたが制御する dsn ファイルを使用し、その設定を見ることができます。

QLikView などの一部のレポート アプリは、完全なファイル名を要求する不透明なインターフェイスであり、次に何が起こるかは誰にもわかりません。あなたは知る方法がありません

一部のレポート アプリ (および Excel ピボット テーブル) はデータベースにリンクしている可能性があり、所有者は単にあなたに教えません。接続が正しく構成されていない場合、取得中にテーブルがロックされる可能性があります。また、クライアント セッションを終了すると、ロックがそのまま残る可能性があります。ピボットの「更新」が遅いのを見て退屈している Excel ユーザーは、常にこれを行っています。

さらに悪いことに、一部のサードパーティ システムではデータの書き込みが必要になる場合があります。これは避ける必要があります。Access クライアント アプリケーションを使用してください。-しかし、常にその決定を下せるわけではありません。

運が良ければ、接続オブジェクトが正しく構成されているため、マシン ID が接続文字列に含まれているため、ロック ファイルに確実に表示され、ロックされているマシンを見つけることができます...

多分彼らはそうしますが、しばしばそうしません。

...行ロック クエリ、ページ ロック クエリ、およびテーブル ロック クエリは、重要な問題に対して機能的に同じであることに注意してください。「ファイル」レベルで何か (圧縮や修復など) を行う必要がある場合は、ファイルはあなたに対してロックされています。そのロックが解除されるまで、あなたはロックアウトされます。

マシンを識別できる場合と識別できない場合があります。それらをネットワークから強制的に切断できる場合とできない場合があります。通常の操作ではロックを正常に解放する場合としない場合があり、クラッシュした場合はほぼ確実に解放されません。

だから:それはきれいな絵ではありません。

企業環境での最善の解決策は、データベース ファイルをロックしているユーザーを特定するための「finger」ツールを使用して、ネットワーク管理者に直接連絡し、ユーザーに連絡して、問題のセッションを切断することです。

障害のモードは次のとおりです。

  • もしあなたの組織構造がコミュニケーションのラインを確立することを許さないなら、あなたはうんざりしています。
  • 組織のネットワーク管理者が有効な時間枠内でそれを行う能力または権限を持っていない場合、あなたはうんざりしています.
  • 組織のネットワーク管理者がそれを行わないことを選択した場合、あなたはうんざりです.

ただし、MS-Access アプリケーションの修正は行っています。

私が使用する回避策は非常に積極的です。建物の電源にシャベルを通すか、人身御供を求めるシステム管理者の要求に屈するという「核のオプション」ではありませんが、実装するには非常に不快でばかげた量の作業が必要です。

  1. クライアント (MS-Access フロントエンド アプリケーション) を構成して、名前付きバックエンド データベースを簡単に切り替えることができます。
  2. 同様に、作成して他のアプリが使用できるようにした dsn ファイルは、'DBQ=' または 'Data Source=' 句を新しいファイル名に編集する既存のスクリプトからアクセスできる必要があります。
  3. データベース ファイルのコピーを取得し、必要なメンテナンス作業のためにローカルの一時フォルダーに移動し、新しい名前でアプリケーションの「Data」フォルダーに戻します。
  4. ここで、「バックエンドの変更」スクリプトまたは VBA 関数を実行します...
  5. …そして、ロックされた古いバックエンド ファイルを使用している他の誰かとは地獄です。

ヒント: フロントエンド アプリケーションを実装して、バックエンド データベース (または他のリソース、最悪の場合のシナリオは完全なロックアウト) を定期的にポーリングして、「Maintenance shutdown」または「Change database」命令を取得するのが賢明です。 「メインメニュー」フォームのタイマーイベントに入れます。

また、リンクされたテーブルのソース データベースの切り替えを自動化するコードもあります。

于 2016-03-17T12:22:44.300 に答える
3

LDBビューアで表示できなかった場合、backedへの接続が存在する可能性はありますか?

はい、バックエンドがロックされているにもかかわらず、ldb ビューアで何も表示されないという問題が何度も発生しました。これらのケースでは、ユーザーが DB にアクセスするマシンでハード シャットダウンを実行する結果にもなりました。ひどい解決策ですが、必要なときは必死になることがあります。

バックエンドからすべての接続を強制的に切断する100%確実な防弾方法はありますか?

いいえ、全員をバックエンド DB から追い出す 100% の方法を見つけることはできませんでした。私が完璧に近いと思ったのは、Utter Access にある Chris Symonds の Timeout-Force Out コードを使用することでした。

このデータベースは、いくつかのタスクを実行します。

  1. 開発者が db を使用して任意の PC に移動し、すべてのユーザーを分割 db から強制的に切り離して、開発者が db を排他的に開いて db を変更/維持できるようにします。
  2. 開発者が設定した指定時間内にユーザーが db を使用しなかった場合、ユーザーを db からキックします。
  3. 開発者は毎日時間を指定して、すべてのユーザーを強制的に分割データベースから切り離し、バックアップ、コンパイルなどのためにデータベースを閉じることができます。
  4. すべての関数はオプションであり、追加のコーディングなしでバイパスできます。各データベースに必要なものだけを使用してください。

私は彼のコードを実装し、ほぼ 99% の確率で動作しますが、MS Access が少し扱いに​​くくなる場合があり、DB がロックされている理由や全員を強制的に退出させている理由がわかりません。

于 2012-06-05T23:09:59.543 に答える
3

"ユーザーがデータベースに接続しているかどうかを確認するために 2 つのチェックを行います"

データベースを排他的に開く必要がある場合は、他のチェックをスキップして、それができるかどうかだけをチェックできます。

Public Function CheckExclusive(ByVal pFullPath As String) As Boolean
    Dim blnReturn As Boolean
    Dim cn As Object
    Dim strConnection As String

On Error GoTo ErrorHandler

    strConnection = "Provider=" & _
        CurrentProject.Connection.Provider & _
        ";Data Source=" & pFullPath & ";"
    Set cn = CreateObject("ADODB.Connection")
    cn.Mode = 12& ' adModeShareExclusive '
    cn.Open strConnection
    blnReturn = True
    cn.Close

ExitHere:
    On Error Resume Next
    Set cn = Nothing
    On Error GoTo 0
    CheckExclusive = blnReturn
    Exit Function

ErrorHandler:
    blnReturn = False
    GoTo ExitHere
End Function

次に、db ファイルへのフル パスを指定してその関数を呼び出します。

If CheckExclusive("C:\SomeFolder\YourDb.mdb") = True Then
    ' do what you need here which requires exclusive access: '
    '     make backup; compact; whatever '
End If
于 2012-06-05T23:58:14.527 に答える