SQL Server Express ユーザー インスタンスSQL Server Express User Instances

Microsoft SQL Server Express Edition (SQL Server Express) でサポートされる機能に、ユーザー インスタンスがあります。ユーザー インスタンスは、.NET Framework Data Provider for SQL Server (SqlClient) を使用している場合にしか利用できません。Microsoft SQL Server Express Edition (SQL Server Express) supports the user instance feature, which is only available when using the .NET Framework Data Provider for SQL Server (SqlClient). ユーザー インスタンスは、親インスタンスによって生成される SQL Server Express データベース エンジンの独立したインスタンスです。A user instance is a separate instance of the SQL Server Express Database Engine that is generated by a parent instance. ユーザー インスタンスを使用すると、ローカル コンピューターの管理者以外のユーザーが、SQL Server Express データベースにアタッチして接続できます。User instances allow users who are not administrators on their local computers to attach and connect to SQL Server Express databases. それぞれのインスタンスは、1 ユーザーあたり 1 インスタンスの原則に基づいて、個々のユーザーのセキュリティ コンテキストで実行されます。Each instance runs under the security context of the individual user, on a one-instance-per-user basis.

ユーザー インスタンスの機能User Instance Capabilities

Windows を LUA (最小限の特権しか持たないユーザー アカウント) で実行しているユーザーにとっては、ユーザー インスタンスは特に有効な手段です。なぜなら、各ユーザーには、そのコンピューター上で実行されているインスタンスに対して SQL Server システム管理者 (sysadmin) の権限が割り当てられ、Windows 管理者として実行する必要がないためです。User instances are useful for users who are running Windows under a least-privilege user account (LUA) because each user has SQL Server system administrator (sysadmin) privileges over the instance running on her computer without needing to run as a Windows administrator as well. SQL Server Express のユーザー インスタンスは、サービスではなく、そのユーザーの非管理者 Windows アカウントで実行されるため、ユーザー インスタンス上で実行されているソフトウェアは権限が限定され、システム全体に及ぶ変更を行うことはできません。Software executing on a user instance with limited permissions cannot make system-wide changes because the instance of SQL Server Express is running under the non-administrator Windows account of the user, not as a service. 各ユーザー インスタンスは、その親インスタンスや同じコンピューター上で実行されている他のユーザー インスタンスとは分離されます。Each user instance is isolated from its parent instance and from any other user instances running on the same computer. ユーザー インスタンスで実行されているデータベースは、シングル ユーザー モードでのみ開くことができ、複数のユーザーが同じユーザー インスタンス上のデータベースに接続することはできません。Databases running on a user instance are opened in single-user mode only, and it is not possible for multiple users to connect to databases running on a user instance. ユーザー インスタンスでは、レプリケーションと分散クエリも無効になります。Replication and distributed queries are also disabled for user instances.

詳細については、SQL Server オンライン ブックの「ユーザー インスタンス」を参照してください。For more information, see "User Instances" in SQL Server Books Online.

注意

既にコンピューターの管理者であるユーザーが、ユーザー インスタンスを使用する必要はありません。また、複数のデータベース ユーザーが関係する場合もユーザー インスタンスは不要です。User instances are not needed for users who are already administrators on their own computers, or for scenarios involving multiple database users.

ユーザー インスタンスの有効化Enabling User Instances

ユーザー インスタンスを生成するには、SQL Server Express の親インスタンスが実行されている必要があります。To generate user instances, a parent instance of SQL Server Express must be running. SQL Server Express がインストールされ、明示的に有効にしたりできますを実行するシステム管理者によって無効になっているときに、ユーザー インスタンスは既定で有効に、 sp_configure親インスタンス上のシステム ストアド プロシージャ。User instances are enabled by default when SQL Server Express is installed, and they can be explicitly enabled or disabled by a system administrator executing the sp_configure system stored procedure on the parent instance.

-- Enable user instances.  
sp_configure 'user instances enabled','1'   
  
-- Disable user instances.  
sp_configure 'user instances enabled','0'  

ユーザー インスタンスのネットワーク プロトコルは、ローカルの名前付きパイプにする必要があります。The network protocol for user instances must be local Named Pipes. ユーザー インスタンスを SQL Server のリモート インスタンスで開始することはできません。また、SQL Server ログインは許可されません。A user instance cannot be started on a remote instance of SQL Server, and SQL Server logins are not allowed.

ユーザー インスタンスへの接続Connecting to a User Instance

User InstanceAttachDBFilenameConnectionStringキーワードを使用する、SqlConnectionユーザー インスタンスに接続します。The User Instance and AttachDBFilenameConnectionString keywords allow a SqlConnection to connect to a user instance. ユーザー インスタンスは、SqlConnectionStringBuilderUserInstance プロパティおよび AttachDBFilename プロパティでもサポートされます。User instances are also supported by the SqlConnectionStringBuilderUserInstance and AttachDBFilename properties.

以下にサンプルの接続文字列を示します。次の点に注意してください。Note the following about the sample connection string shown below:

  • Data Source キーワードは、ユーザー インスタンスを生成している SQL Server Express の親インスタンスを指します。The Data Source keyword refers to the parent instance of SQL Server Express that is generating the user instance. 既定のインスタンスは、.\sqlexpress です。The default instance is .\sqlexpress.

  • Integrated Securitytrue に設定されます。Integrated Security is set to true. ユーザー インスタンスに接続するには Windows 認証が必要です。SQL Server ログインはサポートされません。To connect to a user instance, Windows Authentication is required; SQL Server logins are not supported.

  • User Instancetrue に設定されます。これにより、ユーザー インスタンスが呼び出されます。The User Instance is set to true, which invokes a user instance. 既定値は false です。(The default is false.)

  • プライマリ データベース ファイル (.mdf) にアタッチするには、AttachDbFileName 接続文字列キーワードで完全パス名を指定します。The AttachDbFileName connection string keyword is used to attach the primary database file (.mdf), which must include the full path name. また、AttachDbFileName は、SqlConnection 接続文字列内の "extended properties" キーおよび "initial file name" キーに対応しています。AttachDbFileName also corresponds to the "extended properties" and "initial file name" keys within a SqlConnection connection string.

  • パイプ記号で囲まれた |DataDirectory| の部分には、接続元のアプリケーションのデータ ディレクトリを表す文字列が入ります。データベース ファイルである .mdf と .ldf、およびログ ファイルの格納場所を相対パスで指定します。The |DataDirectory| substitution string enclosed in the pipe symbols refers to the data directory of the application opening the connection and provides a relative path indicating the location of the .mdf and .ldf database and log files. これらのファイルを別の場所に移す場合は、ファイルの完全パスを指定する必要があります。If you want to locate these files elsewhere, you must provide the full path to the files.

Data Source=.\\SQLExpress;Integrated Security=true;  
User Instance=true;AttachDBFilename=|DataDirectory|\InstanceDB.mdf;  
Initial Catalog=InstanceDB;  

注意

実行時に接続文字列を作成するために SqlConnectionStringBuilderUserInstance および AttachDBFilename プロパティを使用することもできます。You can also use the SqlConnectionStringBuilderUserInstance and AttachDBFilename properties to build a connection string at run time.

使用して、 |DataDirectory|置換文字列Using the |DataDirectory| Substitution String

ADO.NET 2.0 では、AttachDbFileName が拡張されて、|DataDirectory| というパイプ記号で囲まれた置換文字列が導入されました。AttachDbFileName was extended in ADO.NET 2.0 with the introduction of the |DataDirectory| (enclosed in pipe symbols) substitution string. DataDirectoryAttachDbFileName を組み合わせて使用することで、データ ファイルへの相対パスを指定でき、完全パスを使用する代わりに、データ ソースの相対パスに基づいて接続文字列を作成できます。DataDirectory is used in conjunction with AttachDbFileName to indicate a relative path to a data file, allowing developers to create connection strings that are based on a relative path to the data source instead of being required to specify a full path.

DataDirectory が表す物理的な場所は、アプリケーションの種類によって異なります。The physical location that DataDirectory points to depends on the type of application. 次の例では、アタッチする Northwind.mdf ファイルが、アプリケーションの \app_data フォルダーに格納されています。In this example, the Northwind.mdf file to be attached is located in the application's \app_data folder.

Data Source=.\\SQLExpress;Integrated Security=true;  
User Instance=true;  
AttachDBFilename=|DataDirectory|\app_data\Northwind.mdf;  
Initial Catalog=Northwind;  

DataDirectory を使用する場合、最終的なファイル パスが、必ずその置換文字列が表すディレクトリのサブディレクトリとなるように指定する必要があります。When DataDirectory is used, the resulting file path cannot be higher in the directory structure than the directory pointed to by the substitution string. たとえば、DataDirectory を展開した結果が C:\AppDirectory\app_data である場合、app_data は c:\AppDirectory よりも下位であるため、上の例の接続文字列は適切に動作します。For example, if the fully expanded DataDirectory is C:\AppDirectory\app_data, then the sample connection string shown above works because it is below c:\AppDirectory. しかし、DataDirectory を「|DataDirectory|\..\data」として指定すると、\data が \AppDirectory のサブディレクトリではないため、エラーが発生します。However, attempting to specify DataDirectory as |DataDirectory|\..\data will result in an error because \data is not a subdirectory of \AppDirectory.

接続文字列に指定した置換文字列の形式が正しくない場合、ArgumentException がスローされます。If the connection string has an improperly formatted substitution string, an ArgumentException will be thrown.

注意

置換文字列は、System.Data.SqlClient によってローカル コンピューターのファイル システムと照合されて完全パスに解決されます。System.Data.SqlClient resolves the substitution strings into full paths against the local computer file system. したがって、リモート サーバー、HTTP、および UNC のパス名はサポートされません。Therefore, remote server, HTTP, and UNC path names are not supported. サーバーがローカル コンピューター上に存在しない場合、接続を開こうとすると例外がスローされます。An exception is thrown when the connection is opened if the server is not located on the local computer.

SqlConnection を開くと、この接続文字列が、既定の SQL Server Express インスタンスから、実行時に開始された (呼び出し元のアカウントで実行される) インスタンスへとリダイレクトされます。When the SqlConnection is opened, it is redirected from the default SQL Server Express instance to a run-time initiated instance running under the caller's account.

注意

ユーザー インスタンスは、通常のインスタンスよりも読み込みに時間がかかる場合があります。その場合は、ConnectionTimeout の値を増やす必要があります。It may be necessary to increase the ConnectionTimeout value since user instances may take longer to load than regular instances.

次のコード フラグメントでは、新しい SqlConnection を開き、接続文字列をコンソール ウィンドウに表示した後、using コード ブロックを終了した時点で接続を閉じます。The following code fragment opens a new SqlConnection, displays the connection string in the console window, and then closes the connection when exiting the using code block.

Private Sub OpenSqlConnection()  
    ' Retrieve the connection string.  
    Dim connectionString As String = GetConnectionString()  
  
    Using connection As New SqlConnection(connectionString)  
        connection.Open()  
        Console.WriteLine("ConnectionString: {0}", _  
           connection.ConnectionString)  
    End Using  
End Sub  
private static void OpenSqlConnection()  
{  
    // Retrieve the connection string.  
    string connectionString = GetConnectionString();  
  
    using (SqlConnection connection =   
        new SqlConnection(connectionString))  
    {  
        connection.Open();  
        Console.WriteLine("ConnectionString: {0}",   
             connection.ConnectionString);  
    }  
}  

注意

SQL Server の内部で実行される共通言語ランタイム (CLR) コードでは、ユーザー インスタンスはサポートされません。User instances are not supported in common language runtime (CLR) code that is running inside of SQL Server. InvalidOperationException の接続文字列で Open を指定して SqlConnection を呼び出すと、User Instance=true がスローされます。An InvalidOperationException is thrown if Open is called on a SqlConnection that has User Instance=true in the connection string.

ユーザー インスタンスの接続の有効期間Lifetime of a User Instance Connection

SQL Server にはサービスとして実行されるバージョンもありますが、それらのバージョンとは異なり、SQL Server Express のインスタンスは、開始と停止を手動で行う必要はありません。Unlike versions of SQL Server that run as a service, SQL Server Express instances do not need to be manually started and stopped. 既に実行されている場合を除き、ユーザーがログインして接続するたびにユーザー インスタンスが開始されます。Each time a user logs in and connects to a user instance, the user instance is started if it is not already running. ユーザー インスタンス データベースには AutoClose オプションが用意されており、アクティブでない状態が一定期間続くとデータベースが自動的にシャットダウンされます。User instance databases have the AutoClose option set so that the database is automatically shut down after a period of inactivity. 開始された sqlservr.exe プロセスは、そのインスタンスに対する最後の接続が閉じられた後も、タイムアウトの期限が切れるまで引き続き実行されます。したがって、タイムアウトの期限が切れる前であれば、再開しなくても、新たに接続を開くことができます。The sqlservr.exe process that is started is kept running for a limited time-out period after the last connection to the instance is closed, so it does not need to be restarted if another connection is opened before the time-out has expired. タイムアウトの期限が切れるまでの間に新しい接続が開かれなかった場合、ユーザー インスタンスは自動的にシャットダウンされます。The user instance automatically shuts down if no new connection opens before that time-out period has expired. 親インスタンス上のシステム管理者を使用して、ユーザー インスタンスのタイムアウト期間を設定することができますsp_configureを変更する、ユーザー インスタンス タイムアウトオプション。A system administrator on the parent instance can set the duration of the time-out period for a user instance by using sp_configure to change the user instance timeout option. 既定値は、60 分です。The default is 60 minutes.

注意

接続文字列の Min Pool Size に 0 を超える値を指定した場合、接続プーラーは、開かれているいくつかの接続を常に保持するようになります。この場合、ユーザー インスタンスは自動的にはシャットダウンされません。If Min Pool Size is used in the connection string with a value greater than zero, the connection pooler will always maintain a few opened connections, and the user instance will not automatically shut down.

ユーザー インスタンスの動作How User Instances Work

最初に、各ユーザーのユーザー インスタンスが生成された時点、マスターmsdbシステム データベースは、ユーザーのローカル アプリケーション データ リポジトリの下のパスに、Template Data フォルダーからコピーされますユーザー インスタンスによって排他的に使用のディレクトリです。The first time a user instance is generated for each user, the master and msdb system databases are copied from the Template Data folder to a path under the user's local application data repository directory for exclusive use by the user instance. 通常、このパスは C:\Documents and Settings\<UserName>\Local Settings\Application Data\Microsoft\Microsoft SQL Server Data\SQLEXPRESS です。This path is typically C:\Documents and Settings\<UserName>\Local Settings\Application Data\Microsoft\Microsoft SQL Server Data\SQLEXPRESS. ユーザー インスタンスの起動時に、 tempdb、ログ、およびトレース ファイルは、このディレクトリにも書き込まれます。When a user instance starts up, the tempdb, log, and trace files are also written to this directory. ユーザー インスタンスには、ユーザーごとに一意の名前が生成されます。A name is generated for the instance, which is guaranteed to be unique for each user.

既定では、Windows Builtin\Users グループのすべてのメンバーには、ローカル インスタンスへの接続のほか、SQL Server プログラム ファイルの読み取りと実行のための権限が付与されます。By default all members of the Windows Builtin\Users group are granted permissions to connect on the local instance as well as read and execute permissions on the SQL Server binaries. ユーザー インスタンスをホストする呼び出し元ユーザーの資格情報が検証されると、そのユーザーは、そのインスタンスの sysadmin になります。Once the credentials of the calling user hosting the user instance have been verified, that user becomes the sysadmin on that instance. ユーザー インスタンスに対して有効になるのは共有メモリだけです。つまり、ローカル コンピューター上の操作以外は実行できません。Only shared memory is enabled for user instances, which means that only operations on the local machine are possible.

ユーザーには、接続文字列で指定された .mdf ファイルと .ldf ファイルについて、読み取りと書き込みの両方の権限が付与されている必要があります。Users must be granted both read and write permissions on the .mdf and .ldf files specified in the connection string.

注意

.mdf ファイルと .ldf ファイルは、それぞれデータベース ファイルおよびログ ファイルを表します。The .mdf and .ldf files represent the database and log files, respectively. この 2 つのファイルはペアで存在するため、バックアップや復元操作を行う際は注意が必要です。These two files are a matched set, so care must be taken during backup and restore operations. データベース ファイルには、ログ ファイルの正確なバージョンについての情報が格納されており、間違ったログ ファイルとペアになっていると、データベースを開くことはできません。The database file contains information about the exact version of the log file, and the database will not open if it is coupled with the wrong log file.

データの破損を防ぐため、ユーザー インスタンスのデータベースは排他アクセスで開かれます。To avoid data corruption, a database in the user instance is opened with exclusive access. 同じコンピューター上の同じデータベースを 2 つの異なるユーザー インスタンスで共有する場合は、一方のインスタンスのユーザーがデータベースを閉じる必要があります。データベースを閉じない限り、もう一方のインスタンスでそのデータベースを開くことはできません。If two different user instances share the same database on the same computer, the user on the first instance must close the database before it can be opened in a second instance.

ユーザー インスタンスのシナリオUser Instance Scenarios

データベース アプリケーションの開発者は、ユーザー インスタンスを使用することで、開発コンピューター上に自分の管理者アカウントがなくても、SQL Server のデータ ストアを自由に利用できるようになります。User instances provide developers of database applications with a SQL Server data store that does not depend on developers having administrative accounts on their development computers. ユーザー インスタンスは Access/Jet モデルをベースとしています。つまり、データベース アプリケーションは単にファイルにアクセスするだけです。ユーザーには、すべてのデータベース オブジェクトに対する完全な権限が自動的に割り当てられます。システム管理者に権限を付与してもらう必要はありません。User instances are based on the Access/Jet model, where the database application simply connects to a file, and the user automatically has full permissions on all of the database objects without needing the intervention of a system administrator to grant permissions. サーバー コンピューターまたはローカル コンピューター上の管理特権を持たず、LUA (最小限の特権しか持たないユーザー アカウント) を使用しているユーザーが、データベース オブジェクトやアプリケーションを作成するケースもあります。ユーザー インスタンスには、こうした作業が想定されています。It is intended to work in situations where the user is running under a least-privilege user account (LUA) and does not have administrative privileges on the server or local machine, yet needs to create database objects and applications. ユーザー インスタンスを使って実行時にインスタンスを作成することで、より高い特権を持つシステム サービスのセキュリティ コンテキストではなく、そのユーザー自身のセキュリティ コンテキストでインスタンスを実行できます。User instances allow users to create instances at run time that run under the user's own security context, and not in the security context of a more privileged system service.

重要

ユーザー インスタンスは、それを使用するすべてのアプリケーションが完全に信頼できる場合以外は使用しないでください。User instances should only be used in scenarios where all the applications using it are fully trusted.

ユーザー インスタンスのシナリオUser instance scenarios include:

  • データの共有を必要としないシングル ユーザー アプリケーション。Any single-user application where sharing data is not required.

  • ClickOnce 配置。ClickOnce deployment. .NET Framework 2.0 以降および SQL Server Express が既にターゲット コンピューターにインストールされている場合、管理者以外のユーザーでも、ClickOnce アクションの結果としてダウンロードされたインストール パッケージをインストールして使用できます。If the .NET Framework 2.0 (or later) and SQL Server Express are already installed on the target computer, the installation package downloaded as a result of a ClickOnce action can be installed and used by non-administrator users. ただし、SQL Server Express がセットアップの一部として含まれている場合は、管理者が SQL Server Express をインストールする必要があります。Note that an administrator must install SQL Server Express if that is part of the setup. 詳細については、次を参照してください。 Windows フォームの ClickOnce 配置します。For more information, see ClickOnce Deployment for Windows Forms.

  • Windows 認証を使用した ASP.NET 専用ホスティング。Dedicated ASP.NET hosting using Windows Authentication. イントラネット上で、単一の SQL Server Express インスタンスをホストできます。A single SQL Server Express instance can be hosted on an intranet. アプリケーションは、権限の借用ではなく、ASPNET Windows アカウントを使ってこのインスタンスに接続することになります。The application connects using the ASPNET Windows account, not by using impersonation. サードパーティ製品を使ったホスティングや共有ホスティングのシナリオでユーザー インスタンスを使用することは避けてください。すべてのアプリケーションで同じユーザー インスタンスが使用され、アプリケーションを互いに分離することができなくなります。User instances should not be used for third-party or shared hosting scenarios where all applications would share the same user instance and would no longer remain isolated from each other.

関連項目See also