以前、Denali CTP3 Express Core の新機能 LocalDB を触ってみる という投稿をしました。
LocalDB は SQL Server 2012 からの新機能でサービスではなく、プロセスとして起動する Express Edition 相当の SQL Server となります。
SQL Server コード ネーム 2012 Express LocalDB
RC0 が提供された際に、LocalDB も単体でダウンロード可能になっています。
MicrosoftR SQL ServerR 2012 Express RC0
前回は触れていなかった LocalDB の [共有名] という設定について、今回はまとめてみたいと思います。
■LocalDB の構成
LocalDB の基本的なファイル構成ですが以下のようになるようです。
プログラム | C:Program FilesMicrosoft SQL Server110LocalDBBinn |
ベースとなるシステム DB |
C:Program FilesMicrosoft SQL Server110LocalDBBinnTemplates |
インスタンスの システム DB |
<プロファイルのパス>AppDataLocalMicrosoftMicrosoft SQL Server Local DBInstancesインスタンス名 |
インスタンスを作成すると、作成を行ったユーザープロファイルのディレクトリ内に、ベースとなるシステム DB の内容を使用してインスタンスのシステム DB が作成されます。
そのため、LocalDB のシステムデータベースはユーザープロファイル内に作成されることになります。
インスタンスを起動するプログラムについては、共通のプログラムが使用されるようです。
プログラムのレジストリとしては、
- HKLMSOFTWAREMicrosoftMicrosoft SQL ServerMSSQL11E.LOCALDB
が使われていそうです。
# 通常の SQL Server のインスタンスと異なり、各インスタンス用のプログラムディレクトリは存在しないようです。
LocalDB はユーザープロファイル単位に設定が保持されます。
インスタンスの情報はレジストリに格納されているというのは通常の SQL Server と変わらないのですが、インスタンスの設定状況に関しては HKLM (HKEY_LOCAL_MACHINE) ではなく、HKCU (HKEY_LOCAL_USER) の以下に格納がされています。
- HKCUSoftwareMicrosoftMicrosoft SQL ServerUserInstances
コマンドプロンプトから [sqllocaldb info] と実行すると、LocalDB のインスタンスを確認することができます。
# v11.0 は既定で作成されているものになり、削除することはできません。
この情報は上記のレジストリ以下の GUID から Data Directory の値を使用して出力をしているようです。
LocalDB のインスタンスの設定状況は、 HKCU に設定されているため、ユーザープロファイル単位で個別に設定されています。
そのため、認識できるインスタンスの設定状況は、ユーザープロファイルによって異なります。
この環境で他のユーザープロファイルを使用して、LocalDB のインスタンスの情報を取得してみます。
認識しているインスタンス数に差が出ているのが確認できますね。
LocalDB のインスタンスはユーザー単位で認識されているものが変わってきますので、他のユーザープロファイルで作成したインスタンスは通常の設定では使用することはできません。
他のユーザープロファイルで作成されている LocalDB のインスタンスを使用したい場合、[共有名] という設定を使用します。
先ほどの画像で [.~] で始まるインスタンス (.ShareDB) をどちらのプロファイルでも共通で認識されているのが確認できます。
これが共有名を使用した、LocalDB のインスタンスの共有になります。
それでは実際に設定を見ていきたいと思います。
■共有名の設定
共有名の設定ですが、[sqllocaldb share] を使用します。
share|h ["owner SID or account"] "private name" "shared name" |
このコマンドを使用すると、ユーザープロファイル内に格納されているインスタンス (プライベートインスタンス) を他のユーザープロファイルにも公開して、共有することが可能となります。
今回は LocalDB2 を ShareDB2 として共有名を設定したいと思います。
sqllocaldb info を使用して、各ユーザープロファイルでインスタンスを確認してみます。
先ほど共有した、プライベートインスタンスがどちらのユーザープロファイルからも認識されていることが確認できます。
共有名を設定したインスタンスに関して
は
- HKLMSOFTWAREMicrosoftMicrosoft SQL Server Local DBShared Instances
に共有の情報が格納されます。
HKLM に格納されていますので、各ユーザープロファイル間で情報が共有できるようになるようです。
特定のサービスアカウントに対して、自分のプロファイルで作成した LocalDB のプライベートインスタンスを公開する必要がある場合はこの設定を使用する必要がありそうですね。
■共有名を使用した接続
LocalDB のプライベートインスタンスの場合、接続されるまで名前付きパイプの接続ポイントを保有していません。
接続がない状態のインスタンスの情報がこちらです。
# 状態が [停止] となっています。
LocalDB は接続がない状態では停止中となり、インスタンス パイプ名 (名前付きパイプ) は空欄となっています。
接続を行うと LocalDB が実行中 (SQL Server がプロセスとして起動する) となり、以下のような形で名前付きパイプが設定されます。
# 状態が [実行中] となっています。
名前付きパイプが設定されていない状態 (一つも接続がない状態) でプライベートインスタンスに接続する場合は以下のように[(localdb)プライベートインスタンス名] という形式で接続を行います。
# SQL Server Native Client 11.0 で使えるようになっている接続文字列になるようです。
SQL Server 2012 RC0 の SSMS を使用するとこの形式で直接プライベートインスタンスに接続することが可能です。
# CTP3 ではできなかったので、sqlcmd や 11.0 の Native Client 経由で接続する必要があったのですが、RC0 で対応されています。
共有名に関しては、常に一定の名前付きパイプによる接続点を保持している形になります。
# 通常のプライベートインスタンスは、起動するごとに名前付きパイプが変わります。
共有名を使用して、他のプロファイルから接続をする場合、共有名に設定されている名前付きパイプを使用して接続をします。
# [(localdb)共有名 (共有のインスタンス名)] というような指定による接続はできないようです。
このような形式で接続をすることで、複数のユーザープロファイルで同一のプライベートインスタンスを参照することが可能となります。
# SQL Server のログインとして、接続するユーザーの権限を付与する必要がありますが。
軽く検証した感じでは、共有名の名前付きパイプを使用して接続はできるのですが、共有をしているプライベートインスタンスが起動していないと接続ができなかったのですよね…。
一度インスタンスを [sqllocaldb start .ShareDB] というような形で起動させた後であれば、共有名の名前付きパイプを使用した接続は可能でした。
■共有名の解除
共有名を解除する場合には [sqllocaldb unshare] を使用します。
共有名に対して [sqllocaldb delete] を使用すると、共有をしているプライベートインスタンスが削除されてしまうので注意が必要です。
# 削除しますかという確認のメッセージが出ませんのでさくっと削除されます。
共有名の設定を使用した自動起動の方法がわからなかったのですが、この設定は他のプロファイルとプライベートインスタンスを共有するために使うようですね。