Access インベントリのエクスポート (AccessToSQL)

複数の Access データベースがあり、SQL Server に移行するデータベースがわからない場合は、プロジェクト内のすべての Access データベースのインベントリをエクスポートします。 インベントリ メタデータを確認してクエリを実行して、移行するデータベース内のデータベースとオブジェクトを決定できます。 このインベントリは、次の一覧のような質問に対する回答をすばやく見つけるのに役立ちます。

  • 最大のデータベースは何ですか?
  • ほとんどのデータベースを所有しているのは誰ですか?
  • 同じテーブルを含むデータベースはどれですか?
  • 過去 6 か月間に変更されなかったデータベースはどれですか?
  • どのデータベースに個人情報が含まれていますか?

これらの質問に回答するクエリの例については、この記事の最後で説明します。

エクスポートされたメタデータ

SQL Server Migration Assistant (SSMA) は、Access データベース、テーブル、列、インデックス、外部キー、クエリ、レポート、フォーム、マクロ、モジュールに関するメタデータをエクスポートします。 SSMA は、これらの項目の各カテゴリに関するメタデータを個別のテーブルにエクスポートします。 これらのテーブルのスキーマについては、「 インベントリ スキーマへのアクセス」を参照してください。

インベントリ データをエクスポートする

Access インベントリをエクスポートするには、まず SSMA プロジェクトを開くか作成します。 次に、分析する Access データベースを追加します。 SSMA プロジェクトにデータベースを追加した後、それらのデータベースに関するメタデータを指定された SQL Server データベースとスキーマにエクスポートします。 必要に応じて、SSMA はメタデータを格納するテーブルを作成します。 SSMA は、Access データベースに関するメタデータを SQL Server データベースに追加します。

注

Access データベースは、複数のファイル (クエリ、フォーム、レポート、マクロ、モジュール、ショートカットを含むテーブルとフロントエンド データベースを含むバックエンド データベース) に分割できます。 分割データベースを SQL Server に移行する場合は、フロントエンド データベースを SSMA に追加します。

次の手順では、プロジェクトの作成、プロジェクトへのデータベースの追加、SQL Server への接続、インベントリ データのエクスポートを行う方法について説明します。

プロジェクトを作成する

  1. SSMA for Access を開きます。

  2. [ファイル] メニューの [新しいプロジェクト] を選択します。

    [ 新しいプロジェクト ] ダイアログ ボックスが表示されます。

  3. [ 名前 ] ボックスに、プロジェクトの名前を入力します。

  4. [ 場所 ] ボックスで、プロジェクトのフォルダーを入力または選択します。

  5. [ 移行先 ] コンボ ボックスで、移行先のターゲット バージョンを選択し、[ OK] を選択します。

プロジェクトの作成の詳細については、「プロジェクトの 作成と管理」を参照してください。

データベースの検索と追加

  1. [ ファイル ] メニューの [ データベースの検索] を選択します。

  2. データベースの検索ウィザードで、検索するドライブ、ファイル パス、または UNC パスを入力します。 または、[ 参照 ] を選択してドライブまたはネットワーク フォルダーを選択します。

  3. [ 追加] を選択して、リスト ボックスに場所を追加します。

    前の 2 つの手順を繰り返して、検索場所をさらに追加します。

  4. 必要に応じて、検索条件を追加して、返されるデータベースの一覧を絞り込みます。

    Important

    ファイル名テキスト ボックスのすべてまたは一部では、ワイルドカード文字はサポートされていません。

  5. [ スキャン] を選択します。

    [ スキャン] ページが表示されます。 このページには、ツールで見つかったデータベースと検索の進行状況が表示されます。 検索を停止するには、[停止] を選択 します。

  6. [ ファイルの選択 ] ページで、プロジェクトに追加する各データベースを選択します。

    一覧の上部にある [ すべて選択 ] ボタンと [すべてクリア ] ボタンを使用して、すべてのデータベースを選択またはクリアできます。 Ctrl キーを押しながら複数の行を選択したり、Shift キーを押しながら行の範囲を選択したりすることもできます。

  7. [次へ] を選択します。

  8. [ 確認 ] ページで、[ 完了] を選択します。

プロジェクトへのデータベースの追加の詳細については、「 Access データベース ファイルの追加と削除」を参照してください。

SQL Server への接続

  1. [ ファイル ] メニューの [ SQL Server への接続] を選択します。

  2. [接続] ダイアログ ボックスで、SQL Server のインスタンスの名前を入力または選択します。

    • ローカル コンピューター上の既定のインスタンスに接続する場合は、 localhost またはドット (.) を入力します。

    • 別のコンピューターの既定のインスタンスに接続する場合は、コンピューターの名前を入力します。

    • 名前付きインスタンスに接続する場合は、コンピューター名、円記号、インスタンス名を入力します。 たとえば、 MyServer\MyInstanceと指定します。

  3. [ データベース ] ボックスに、エクスポートされたメタデータのターゲット データベースの名前を入力します。

  4. 既定以外のポートで接続を受け入れるように SQL Server のインスタンスが構成されている場合は、[サーバー ポート] ボックスに SQL Server 接続に使用される ポート 番号を入力します。 SQL Server の既定のインスタンスの場合、既定のポート番号は 1433 です。 名前付きインスタンスの場合、SSMA は SQL Server Browser サービスからポート番号を取得しようとします。

  5. [ 認証 ] ドロップダウン リストで、接続に使用する認証の種類を選択します。 現在の Windows アカウントを使用するには、[ Windows 認証] を選択します。 SQL Server ログインを使用するには、[ SQL Server 認証] を選択し、ユーザー名とパスワードを指定します。

SQL Server への接続の詳細については、「 SQL Server への接続」を参照してください。

インベントリ情報をエクスポートする

  1. Access メタデータ エクスプローラーで、 Access-metabase を展開します。

  2. [ データベース] の横にあるチェック ボックスをオンにします。

    個々のデータベースまたはデータベース オブジェクトを省略するには、[ データベース ] フォルダーを展開し、データベースまたはデータベース オブジェクトの横にあるチェック ボックスをオフにします。

  3. [ データベース ] を右クリックし、[ スキーマのエクスポート] を選択します。

  4. [ エクスポートするスキーマの選択 ] ダイアログ ボックスで、エクスポートされたメタデータのターゲット スキーマを選択し、[ OK] を選択します。

メタデータをエクスポートするたびに、SSMA によってインベントリにデータが追加されます。 インベントリ内の既存のデータは更新または削除されません。

エクスポートされたメタデータのクエリを実行する

Access データベースに関するメタデータをエクスポートした後、メタデータのクエリを実行できます。 次の手順では、SQL Server Management Studio の [クエリ エディター] ウィンドウを使用してクエリを実行する方法について説明します。

クエリ メタデータ

  1. [スタート] メニューから SQL Server Management Studio に移動します。

  2. [ サーバーへの接続 ] ダイアログ ボックスで、設定を確認し、[ 接続] を選択します。

  3. Management Studio ツール バーで、[ 新しいクエリ ] を選択してクエリ エディターを開きます。

  4. [クエリ エディター] ウィンドウで、クエリを入力します。 次のセクションでは、いくつかの例を示します。

  5. F5 キーを押してクエリを実行します。

クエリのサンプル

次のいずれかのクエリを実行する前に、 USE database_name クエリを実行して、エクスポートされたメタデータを含むデータベースに対してクエリが実行されていることを確認します。 たとえば、 MyAccessMetadata という名前のデータベースにメタデータをエクスポートした場合、Transact-SQL コードの先頭に次のステートメントを追加します。

USE MyAccessMetadata;
GO

次の例はすべて、 dbo スキーマを使用します。 メタデータを別のスキーマにエクスポートした場合は、これらのクエリを実行するときにスキーマを変更してください。

これらのデータベースに含まれるテーブルと列は何ですか?

次のクエリは、列、テーブル、およびデータベースのメタデータを含むテーブルを結合し、列名で並べ替えられたすべてのデータベース、テーブル、および列の名前を返します。

SELECT DatabaseName,
       TableName,
       ColumnName
FROM dbo.SSMA_Access_InventoryColumns AS C
     INNER JOIN dbo.SSMA_Access_InventoryTables AS T
         ON C.TableId = T.TableId
     INNER JOIN dbo.SSMA_Access_InventoryDatabases AS D
         ON T.DatabaseId = D.DatabaseId
ORDER BY ColumnName;

最大のデータベースは何ですか?

次のクエリは、各 Access データベース内のデータベース名、ファイル サイズ、テーブル数をファイル サイズで並べ替え、返します。

SELECT DatabaseName,
       FileSize,
       TablesCount
FROM dbo.SSMA_Access_InventoryDatabases
ORDER BY FileSize DESC;

ほとんどのデータベースを所有しているのは誰ですか?

次のクエリは、各 Access データベースのデータベース名と所有者を所有者別に並べ替え、返します。

SELECT DatabaseName,
       FileOwner
FROM dbo.SSMA_Access_InventoryDatabases
ORDER BY FileOwner;

同じテーブルを含むデータベースはどれですか?

次のクエリでは、サブクエリを使用して、テーブルの一覧に複数回出現するすべてのテーブル名を検索します。 次に、このテーブルの一覧を使用してデータベース名を取得します。 結果はデータベース名とテーブル名として返され、テーブル名で並べ替えられます。

SELECT DatabaseName,
       TableName
FROM dbo.SSMA_Access_InventoryTables AS T
     INNER JOIN dbo.SSMA_Access_InventoryDatabases AS D
         ON D.DatabaseId = T.DatabaseId
WHERE TableName IN (SELECT TableName
                    FROM dbo.SSMA_Access_InventoryTables
                    GROUP BY TableName
                    HAVING COUNT(*) > 1)
ORDER BY TableName;

過去 6 か月間に変更されなかったデータベースはどれですか?

次のクエリでは、現在の日付を取得し、6 か月前の月の値を取得した後、変更日が 6 か月前を超えるデータベースの一覧を返します。

SELECT DatabaseName,
       DateModified
FROM dbo.SSMA_Access_InventoryDatabases
WHERE DATEDIFF(MONTH, DateModified, GETDATE()) > 6
ORDER BY DateModified;

どのデータベースに個人情報が含まれていますか?

Access データベースには、機密情報または個人情報が含まれている場合があります。 これらのデータベースを SQL Server に移動して、そのセキュリティ機能を利用したい場合があります。 機密データを含む列に特定の名前があることがわかっている場合、または特定の文字が含まれている場合は、クエリを使用してその情報を含むすべての列を検索します。 たとえば、文字列 salaryを含むすべての列を検索できます。 その後、クエリはデータベース名、テーブル名、および列名を返します。

SELECT DatabaseName,
       TableName,
       ColumnName
FROM dbo.SSMA_Access_InventoryColumns AS C
     INNER JOIN dbo.SSMA_Access_InventoryTables AS T
         ON C.TableId = T.TableId
     INNER JOIN dbo.SSMA_Access_InventoryDatabases AS D
         ON T.DatabaseId = D.DatabaseId
WHERE ColumnName LIKE '%salary%';

列名がわからない場合は、このクエリから WHERE 句を削除して、すべての列を返すクエリを記述します。