BULK INSERT または OPENROWSET(BULK...) を使用した一括データのインポート

このトピックでは、Transact-SQL の BULK INSERT ステートメントと INSERT...SELECT * FROM OPENROWSET(BULK...) ステートメントを使用して、データ ファイルから Microsoft SQL Server のテーブルにデータを一括インポートする方法の概要を説明します。また、BULK INSERT および OPENROWSET(BULK...) を使用する場合のセキュリティの注意点や、リモート データ ソースから一括インポートする方法についても説明します。

注意

BULK INSERT または OPENROWSET(BULK...) を使用する場合、SQL Server 2005 以降のバージョンで権限の借用がどのように処理されるかを理解しておくことが重要です。詳細については、後の「セキュリティの注意点」を参照してください。

BULK INSERT ステートメント

BULK INSERT では、データ ファイルからテーブルにデータが読み込まれます。この機能は、bcp コマンドの in オプションと似ていますが、データ ファイルが SQL Server プロセスによって読み取られる点が異なります。BULK INSERT の構文の説明については、「BULK INSERT (Transact-SQL)」を参照してください。

OPENROWSET(BULK...) 関数

OPENROWSET 一括行セット プロバイダーには、BULK オプションを指定して OPENROWSET 関数を呼び出すことによってアクセスします。OPENROWSET(BULK...) 関数では、OLE DB プロバイダー経由でデータ ファイルなどのリモート データ ソースに接続することで、リモート データにアクセスできます。

データを一括インポートするには、INSERT ステートメントの SELECT...FROM 句から OPENROWSET(BULK...) を呼び出します。データの一括インポートの基本構文は次のとおりです。

INSERT ...SELECT * FROM OPENROWSET(BULK...)

OPENROWSET(BULK...) を INSERT ステートメント内で使用する場合は、テーブル ヒントがサポートされます。BULK 句では、TABLOCK などの通常のテーブル ヒント以外に、特殊なテーブル ヒント IGNORE_CONSTRAINTS (CHECK 制約だけを無視)、IGNORE_TRIGGERS、KEEPDEFAULTS、KEEPIDENTITY を使用できます。詳細については、「テーブル ヒント (Transact-SQL)」を参照してください。

BULK オプションの上記以外の使い方の詳細については、「OPENROWSET (Transact-SQL)」を参照してください。

セキュリティの注意点

ユーザーが SQL Server ログインを使用する場合は、SQL Server プロセス アカウントのセキュリティ プロファイルが使用されます。これに対して、SQL Server ユーザーが Windows 認証を使用してログオンした場合、そのユーザーは SQL Server プロセスのセキュリティ プロファイルに関係なく、そのユーザー アカウントでアクセス可能なファイルのみを読み取ることができます。

たとえば、SQL Server のインスタンスに Windows 認証を使用してログインしたユーザーを考えます。ユーザーが BULK INSERT または OPENROWSET を使用してデータ ファイルから SQL Server テーブルにデータをインポートするには、アカウントにデータ ファイルの読み取りアクセス許可が与えられていなければなりません。データ ファイルへのアクセスで、SQL Server プロセスにそのファイルへのアクセス許可がなくても、ユーザーはそのファイルからテーブルにデータをインポートできます。SQL Server プロセスにファイル アクセス許可を与える必要はありません。

SQL Server および Microsoft Windows では、認証されている Windows ユーザーの資格情報を転送することで、SQL Server インスタンスから別の SQL Server インスタンスへ接続できるように構成することが可能です。この設定を、"権限借用" または "権限委譲" といいます。BULK INSERT または OPENROWSET を使用する場合は、SQL Server 2005 以降のバージョンによってユーザーの権限借用のセキュリティがどのように処理されるかを理解しておくことが重要です。ユーザーの権限を借用することで、SQL Server プロセスまたはユーザーのいずれかが使用しているコンピューターとは異なるコンピューターにデータ ファイルを常駐させることができます。たとえば、Computer_A 上のユーザーが Computer_B 上のデータ ファイルにアクセスでき、資格情報の委任が適切に設定されている場合、このユーザーは、Computer_C 上で実行されている SQL Server のインスタンスに接続して、Computer_B 上のデータ ファイルにアクセスし、そのファイルから Computer_C 上のテーブルにデータを一括インポートできます。詳細については、「権限借用について」を参照してください。

注意

SQL Server 2005 以降のバージョンにおけるファイルへのアクセス権の制御によって、Microsoft SQL Server 2000 およびそれ以前のバージョンにあったセキュリティの問題に対処できます。以前は、ユーザーの認証後、外部ファイルへのアクセス権は SQL Server プロセスのセキュリティ プロファイルに基づいていました。SQL Server プロセスにファイルの読み取りアクセス権がある場合、ユーザーにそのファイルへのアクセス権がなくても、bulkadmin 固定サーバー ロールのメンバーであれば、BULK INSERT を使用してファイルをインポートし、ファイルのコンテンツにアクセスできていました。

リモート データ ファイルからの一括インポート

BULK INSERT または INSERT...SELECT * FROM OPENROWSET(BULK...) を使用して別のコンピューターからデータを一括インポートするには、データ ファイルを 2 台のコンピューター間で共有している必要があります。共有データ ファイルを指定するには、UNC (汎用名前付け規則) 名を使用します。UNC 名の一般的な形式は、**\\Servername\Sharename\Path\**Filename です。また、データ ファイルへのアクセスに使用されるアカウントは、リモート ディスク上のファイルの読み取りに必要な権限を持っている必要があります。

たとえば、次の BULK INSERT ステートメントでは、newdata.txt というデータ ファイルから AdventureWorks2008R2 データベースの SalesOrderDetail テーブルにデータの一括インポートを行います。このデータ ファイルは、computer2 というシステムの salesforce というネットワーク共有ディレクトリの \dailyorders という共有フォルダーにあります。

BULK INSERT AdventureWorks2008R2.Sales.SalesOrderDetail
   FROM '\\computer2\salesforce\dailyorders\neworders.txt';
GO

BULK INSERT AdventureWorks2008R2.Sales.SalesOrderDetail
   FROM '\\computer2\salesforce\dailyorders\neworders.txt';
GO
注意

クライアントが読み取るファイルは SQL Server とは無関係であるため、bcp にはこの制限は適用されません。