アドホック名を使用したデータ ソースの識別

リンク サーバーを構成するほど頻繁には参照しない OLE DB データ ソースの場合は、アドホック名をテーブル参照に使用できます。SQL Server では、OPENROWSET 関数と OPENDATASOURCE 関数を使用してアドホック名を指定できます。

特定のデータ ソースへのアクセスの制御は、リンク サーバーを経由してのみ可能です。アドホック名にはこの制御を行えないので、既定では、SQL Server Native Client OLE DB プロバイダを除くすべての OLE DB プロバイダでアドホック名が無効になります。

重要な注意事項重要

SQL Server のインスタンスごとに、sysadmin 固定サーバー ロールのメンバが DisallowAdhocAccess プロバイダ オプションと Ad Hoc Distributed Queries サーバー構成オプションを使用して、OLE DB プロバイダのアドホック コネクタ名の使用を有効または無効にできます。アドホック アクセスが有効になっている場合、そのインスタンスにログオンしているユーザーは、アドホック コネクタ名を含む SQL ステートメントを実行できます。このアドホック コネクタ名は、その OLE DB プロバイダを使用してアクセスできるネットワーク上のデータ ソースを参照します。sysadmin ロールのメンバは、データ ソースへのアクセスを制御するために、その OLE DB プロバイダに対するアドホック アクセスを無効にできます。その結果、ユーザーは管理者が定義したリンク サーバー名で参照されるデータ ソースのみに制限されます。既定では、SQL Server Native Client OLE DB プロバイダではアドホック アクセスが有効になっていて、他のすべての OLE DB プロバイダでは無効になっています。

OPENROWSET と OPENDATASOURCE はどちらも、アドホック接続情報を提供します。これらの関数を使用して、OLE DB データ ソースにアクセスするために必要なすべての情報を指定できますが、OPENROWSET と OPENDATASOURCE は交換できません。

  • OPENROWSET は、テーブル名 (またはビュー名) を指定するか、行セットを返すクエリを指定することで、OLE DB プロバイダが行セットを返す場所ならどこでも使用できます。OPENROWSET は、Transact-SQL ステートメントのテーブル名やビュー名の代わりに使用できます。

  • プロバイダが行セットを公開し、catalog**.schema.object 表記を使用する場合のみ、OPENDATASOURCE を使用してください。OPENDATASOURCE は、Transact-SQL 構文内のリンク サーバー名を指定する位置で使用できます。したがって、catalog.schema.**object 表記では、テーブルまたはビューを参照する 4 つの部分で構成される名前の最初の部分に OPENDATASOURCE を使用できます。

OPENROWSET と OPENDATASOURCE は、パーマネント リンク サーバーを構成できないときにアドホック名で外部データにアクセスするためにのみ使用してください。OPENROWSET と OPENDATASOURCE は、ログインのマッピングの管理、リンク サーバーのメタデータにクエリを実行する機能、タイムアウト値などのさまざまな接続設定を構成する機能など、リンク サーバーで使用可能な機能をすべて提供するわけではありません。

セキュリティに関する注意セキュリティに関する注意

データ ソースに接続する場合、SQL Server は Windows 認証ログインでは適切なログインの権限を借用しますが、SQL Server は SQL Server 認証ログインを借用できません。したがって、SQL Server 認証ログインの場合、SQL Server は、SQL Server サービスを実行している Windows アカウントのセキュリティ コンテキストを使用して、ファイルや Active Directory のようなリレーショナルでないデータ ソースなど、別のデータ ソースにアクセスできます。この場合、SQL Server サービスを実行しているアカウントには権限がありますが、権限のない他のデータ ソースにこのようなログイン アクセスを許可してしまう可能性があります。SQL Server 認証ログインを使用している場合は、この可能性を考慮する必要があります。

OPENROWSET と OPENDATASOURCE の引数は変数をサポートしません。引数は文字列リテラルとして指定する必要があります。変数を引数として渡す必要がある場合、変数が含まれているクエリ文字列を動的に作成し、EXECUTE ステートメントを使用して実行できます。