SQL Server 2012 ではリソースガバナーの強化がされています。
そのテストをしていて、Contained Database (包含データベース) のユーザーでログイン名を使用して、リソースガバナーを使用することができるのかが気になって試してみました。
SQL Server 2012 RC0 の検証内容ですので、RTM では変更されているかもしれません。あらかじめご了承ください。
■SQL user with password を使用した場合のログイン識別名について
SQL user with password で作成したユーザーは、ログインとしても使用できるユーザーになります。
Contained Database の機能によりユーザーデータベース上にログインとしての機能を備えたものとして作成がされますので、システムデータベース (master) 上にはログインが存在しないユーザーとなります。
リソースガバナーを使用する際の分類関数ですが、Considerations for Writing a Classifier Function に記載されている以下の関数を使用することが可能です。
The following system functions can be used for classification: HOST_NAME(), APP_NAME(), SUSER_NAME(), SUSER_SNAME(), IS_SRVROLEMEMBER(), and IS_MEMBER().
ログインしたユーザーによってワークロードを変更する場合、SUSER_NAME 関数を使用して制御するのが一般的かと思います。
SUSER_NAME では、syslogins テーブルに登録されているログインのログイン名を返すという記載があります。
SQL user with password のユーザーはログインは持っていません。
そのため、SUSER_NAME() を実行すると SID を返すようです。
分類関数を SID を指定するようにして、設定することで SQL user with password のユーザーでログインをした場合でもログインを使用した、ワークロードの割り当てが可能なようです。
実際のクエリはこのような内容になるかと。
CREATE FUNCTION dbo.rgclassifier() RETURNS sysname |
こちらが上記の分類関数を使用してワークロードを制御するように設定し、SQL user with password のユーザーでログインをして、CPU に負荷をかけた際のリソースの使用状況になります。
分類関数で設定しているように、ResTest のワークロードが使用されているのが確認できますね。
CREATE LOGIN は SID を明示的に指定してログインを作成することができるのですが、CREATE USER の場合は指定ができないようですので、環境を移行する際などは SID に気を付ける必要があるかもしれないですね。
# バックアップ / リストアで移行した場合は、SID 毎移行されると思いますがスクリプトベースで移行した場合は別 SID になると思いますので。