2009-04-20 6 views
0

私はアプリケーション用のAccess mdbファイルと同じテーブルのコピーを含むMySQLスキーマの間の同期化を管理する方法を探しています。これは、アプリケーションがバックエンドとしてMySQLをサポートしていないという事実から生じましたが、最初のアプリケーションが生成するデータを使用して、他の社内アプリケーションにMySQLを利用する方法を探しています。mdbファイルとMySQLサーバースキーマの類似テーブル間のデータの同期化

いくつかのギブンス:

1>私たちは、最初のアプリケーションを放棄することはできません、それは家のデータへのバックエンドサーバとしてのMicrosoft SQL Serverとのみ互換性があります。

2>私たちはMicrosoft SQL Serverを使用しているわけではありませんが、ライセンス料は大きな問題です。また、リンクテーブルと別個のmdbファイルを使用するように作成された他のAccessアプリケーションも書き直します。

3>内部企業のイントラウェブ用の将来の拡張プロジェクトでは、データベースサーバーが「PHPフレンドリ」である必要があります。

4>企業ネットワークの外部からアクセスする必要はなく、アクセスする必要もありません。

私はあまりにもあいまいではないと思っていますが、確信を崩したがっていません。私はかなりきついロープを歩こうとしています。誰かが助けることができれば、私は大いに感謝します。

答えて

3

両方のデータベースを更新可能にする必要がある場合、2つのデータベースの同期は非常に複雑です。一方が他方の奴隷であれば、それほど難しくはありません。私は、Accessを使ってこの種の同期を一度だけプログラムしました。ウェブサーバ上のMDBを使って一度だけローカルデータMDBと同期させる必要がありました(データをウェブサイトで編集するようにしました。一方的な同期ではあるが、Web以外の側で編集内容をマージする必要がある)、ウェブサイト上のMySQLとマスター(MySQL)/スレーブ(アクセス)関係の間の同期を一度プログラミングする必要がある。

ウェブサイトでは、各テーブルのデータのダンプをテキストファイルにプログラムします。レコードが作成され更新された時期を知るために、MySQLテーブルにタイムスタンプフィールドを持たせると便利です。これにより、最後のデータダンプ以降にダンプするレコードを選択することができます(これにより、Access側のデータの同期化がはるかに簡単になります)。

テキストファイルを適切にインデックスを作成し、フロントエンドのAccessアプリケーションにリンクしたステージングテーブルにインポートする方法をプログラミングしました。データダンプをステージングテーブルにインポートしたら、次の3つのタスクがあります。

  1. 新しいレコードを見つけてAccessデータストアに追加します。これは、外部結合で簡単に実行できます。

  2. を削除します。これについては後で詳しく説明しますが、それはよく、複雑です。

  3. 更新されたレコードを処理します。このために、私は列ごとのSQLステートメントを書くDAOコードを書いた。このような

何か:今

UPDATE LocalTable 
SET LocalTable.Field1 = DownloadTable.Field2, LocalTable.Updated = DownloadTable.Updated 
WHERE LocalTable.Field1 <> DownloadTable.Field2 

は、明らかに、WHERE句は少し複雑よりも(あなたがNULLで対処しなければならない、とあなたが適切にフォーマットされた基準を使用する必要がなければなりませんすなわち、データ型、 ""と##、それぞれテキストと日付の場合、数値データの区切り文字はありません)、それを行うためのコードを書くのは簡単です。私が言ったように、複雑な部分は、各SQL文のWHERE句を書いているが、それは把握するのは簡単ですが、今

Dim db As DAO.Database 
    Dim rsFields As DAO.Recordset 
    Dim fld As DAO.Field 
    Dim strSQL As String 

    Set rsFields = db.OpenRecordset("SELECT TOP 1 Field1, Field2, Field3 FROM LocalTable;") 
    For Each fld in rsFields 
    [write your SQL statement and execute it] 
    Next fld 
    Set fld = Nothing 
    rsFields.Close 
    Set rsFields = Nothing 
    Set db = Nothing 

スケルトンコードは次のようになります。また、rsFieldsレコードセット(更新したいフィールドを歩き回るためだけに使用されます)では、更新可能なフィールドのみを含めるので、CREATEDフィールドとPKフィールド(およびあなたが更新したくない他のフィールド)。

ここで、DELETESの場合。

リモートテーブルにないローカルテーブルのレコードを削除することをお勧めします。それが実際にスレーブデータベースであれば正常に動作しますが、もともとスレーブであったものが独自の編集を終了することがよくあります。その場合、ではなく、マスターMySQLデータベースからレコードを削除し、削除されたレコードを示すDELETEフラグを設定する必要があります。レコードの日付スタンプを使用している場合は、LastUpdatedタイムスタンプで削除されたすべてのレコードを削除することができます。< =最後にデータをダンプしたり、AccessアプリケーションがAccessデータストアから正常に削除されたレコードのリストを使用してサーバーにテキストファイルを送信させることもできます。 Accessデータストアに編集内容がある場合は、MySQLの「マスター」データベースから削除されたレコードを編集するロジックが必要になります。要約すると

:あなたは真のマスター/スレーブの関係を持っている場合は

は、それは些細なのです。真剣にそれをやりたければ、すべてのMySQLデータテーブル全体をテキストファイルにダンプし、Accessデータストア内のすべてのレコードを削除し、テキストファイルをインポートするだけです。

あなたは純粋なマスター/スレーブの関係から出発する必要があるので、私はそれをしない傾向があります。ホースを締めて、すべてを最初から書き直す必要があります。

上記の概要は、マスター/スレーブの場合は非常にきれいに動作しますが、「スレーブ」データベースにプライベートなフィールドがいくつかある場合やスレーブには存在し、マスター(私が働いていた状況です)。

関連する問題