SQL Server - Azure SQL Database への Access アプリケーションのリンク (AccessToSQL)
SQL Server で既存の Access アプリケーションを使用する場合は、移行された SQL Server または SQL Azure テーブルに元の Access テーブルをリンクできます。 リンクによって Access データベースが変更され、クエリ、フォーム、レポート、およびデータ アクセス ページで、Access データベース内のデータではなく SQL Server または Azure SQL Database のデータが使用されるようになります。
Note
Access テーブルは Access に残りますが、SQL Server または SQL Azure の更新プログラムと共に更新されません。 テーブルをリンクして機能を確認したら、Access テーブルを削除できます。
Access テーブルと SQL Server テーブルのリンク
Access テーブルを SQL Server または SQL Azure テーブルにリンクすると、Jet データベース エンジンは接続情報とテーブル メタデータを格納しますが、データは SQL Server または SQL Azure に格納されます。 このリンクにより、実際のテーブルとデータが SQL Server または SQL Azure にある場合でも、Access アプリケーションは Access テーブルに対して操作できます。
Note
SQL Server 認証を使用する場合、パスワードはリンクされた Access テーブルのクリア テキストに格納されます。 可能な限り、Windows 認証を使用することが推奨されます。
テーブルをリンクするには
Access メタデータ エクスプローラーで、リンクするテーブルを選択します。
[テーブル] を右クリックし、[リンク] を選択します。
SQL Server Migration Assistant (SSMA) for Access は、元の Access テーブルをバックアップし、リンク テーブルを作成します。
テーブルをリンクすると、SSMA のテーブルが小さなリンク アイコンと共に表示されます。 Access では、テーブルは "リンク" アイコンと共に表示されます。アイコンは、矢印が付いた地球儀です。
Access でテーブルを開くと、キーセット カーソルを使用してデータが取得されます。 その結果、大きなテーブルでは、すべてのデータが一度に取得されません。 ただし、テーブルを参照すると、必要に応じて追加のデータが取得されます。
重要
アクセス テーブルを Azure データベースにリンクするには、SQL Server Native Client (SNAC) バージョン 10.5 以降が必要です。
SNAC の最新バージョンは、Microsoft® SQL Server 2008 R2 Feature Pack で入手できます。
Access テーブルのリンク解除
SQL Server または SQL Azure テーブルから Access テーブルのリンクを解除すると、SSMA は元の Access テーブルとそのデータを復元します。
テーブルのリンクを解除するには
Access メタデータ エクスプローラーで、リンクを解除するテーブルを選択します。
[テーブル] を右クリックし、[リンクを解除] を選択します。
テーブルを別のサーバーにリンクする
Access テーブルを 1 つの SQL Server インスタンスにリンクしていて、後でリンクを別のインスタンスに変更する場合は、テーブルを再リンクする必要があります。
テーブルを別のサーバーにリンクするには
Access メタデータ エクスプローラーで、リンクを解除するテーブルを選択します。
[テーブル] を右クリックし、[リンクを解除] を選択します。
[SQL Server に再接続] ボタンをクリックします。
Access テーブルをリンクする SQL Server または SQL Azure のインスタンスに接続します。
Access メタデータ エクスプローラーで、リンクするテーブルを選択します。
[テーブル] を右クリックし、[リンク] を選択します。
リンク テーブルの更新
SQL Server または SQL Azure のテーブル定義が変更された場合は、このトピックで前述した手順を使用して、SSMA のテーブルのリンクを解除してから再リンクできます。 Access を使用してテーブルを更新することもできます。
Access を使用してリンク テーブルを更新するには
Access データベースを開きます
[オブジェクト] の一覧で 、[テーブル] をクリックします。
リンク テーブルを右クリックし、[リンク テーブル マネージャー] を選択 します。
追加する各リンク テーブルの横のチェック ボックスをオンにしてから [OK] をクリックします。
移行後に発生する可能性のある問題
次のセクションでは、Access から SQL Server または SQL Azure にデータベースを移行し、テーブルを原因と解決策と共にリンクした後に、既存の Access アプリケーションで発生する可能性がある問題の一覧を示します。
リンク テーブルのパフォーマンスが低下する
原因: 次の理由により、アップサイズ後に一部のクエリが遅くなる可能性があります:
アプリケーションは、SQL Server または SQL Azure に存在しない関数に依存するため、Jet はテーブルをローカルにプルして SELECT クエリを実行します。
多数の行を更新または削除するクエリは、各行のパラメーター化されたクエリとして Jet によって送信されます。
解決策: 実行速度の遅いクエリをパススルー クエリ、ストアド プロシージャ、またはビューに変換してください。 パススルー クエリへの変換には、次の問題があります:
パススルー クエリは変更できません。 クエリ結果の変更や新しいレコードの追加は、クエリにバインドされたフォームに明示的な [変更] または [追加] ボタンを設定するなど、別の方法で行う必要があります。
一部のクエリではユーザー入力が必要ですが、パススルー クエリではユーザー入力がサポートされていません。 ユーザー入力は、パラメーターの入力を求める Visual Basic for Applications (VBA) コード、または入力コントロールとして使用されるフォームによって取得できます。 どちらの場合も、VBA コードは、ユーザー入力を含むクエリをサーバーに送信します。
自動インクリメント列が、レコードが更新されるまで更新されない
原因: Jet で RecordSet.AddNew を呼び出した後、レコードが更新される前に自動インクリメント列が使用できるようになっているため。 これは、SQL Server または SQL Azure では当てはまりません。 ID 列の新しい値は、新しいレコードを保存した後でのみ使用できます。
解決策: ID フィールドにアクセスする前に、次の Visual Basic for Applications (VBA) コードを実行してください:
Recordset.Update
Recordset.Move 0,
Recordset.LastModified
新しいレコードが使用できない
原因: VBA を使用して SQL Server または SQL Azure テーブルにレコードを追加するときに、テーブルの一意のインデックス フィールドに既定値があり、そのフィールドに値を割り当てない場合、SQL Server または SQL Azure でテーブルを再度開くまで、新しいレコードは表示されません。 新しいレコードから値を取得しようとすると、次のエラー メッセージが表示されます:
Run-time error '3167' Record is deleted.
解決策: VBA コードを使用して SQL Server または SQL Azure テーブルを開くときに、次の例のようにdbSeeChanges
オプションを含めてください。
Set rs = db.OpenRecordset("TestTable", dbOpenDynaset, dbSeeChanges)
移行後、一部のクエリでユーザーが新しいレコードを追加できなくなる
原因: クエリに一意のインデックスに含まれるすべての列が含まれていない場合、クエリを使用して新しい値を追加することはできません。
解決策: 少なくとも 1 つの一意のインデックスに含まれるすべての列がクエリの一部であることを確認してください。
Access を使用してリンク テーブル スキーマを変更することができない
原因: データの移行とテーブルのリンク後、ユーザーは Access でテーブルのスキーマを変更できません。
解決策: SQL Server Management Studio を使用してテーブル スキーマを変更し、Access でリンクを更新してください。
データの移行後にハイパーリンク機能が失われる
原因: データを移行すると、列内のハイパーリンクの機能が失われ、単純な nvarchar(max) 列になります。
解決策: [なし] :
一部の SQL Server データ型が、Access でサポートされない
原因: 後から SQL Server または SQL Azure テーブルを更新して、Access でサポートされていないデータ型を含めた場合は、Access でテーブルを開くことができません。
解決策: サポートされているデータ型を持つ行のみを返す Access クエリを定義してください。