この記事で提供されている表http://msdn.microsoft.com/en-us/library/ms178569.aspxによって大いに助けられた、信頼できる答えを見つけたと思います。CREATE DATABASEは実際にANSI SQL準拠の許可であるように見えますが、CREATE ANY DATABASEはMSSQL独自のサーバー許可です。ただし、2つは同じではありません。実際、この2つにはかなり重要な違いがあり、試してみてこれを見つけました。
どちらも権限ですが、CREATE DATABASEは現在使用されているデータベースのセキュリティコンテキストのみを参照しますが、CREATE ANY DATABASEはSQL Server上のログインリストを参照できます。これは、ANSI SQLサーバーの一般的な期待として、一部のメインシステムデータベースにアクセス許可が付与され、そのデータベース内のユーザーにアクセス許可が付与されるためです。次に、新しいデータベースのデフォルトの動作では、マスターに問い合わせて、継承する権限を確認します。(SQL 101、私は知っていますが、ここで実際に例示されています。)
したがって、CREATE DATABASEを付与する場合、実際にマスターにこの権限を付与するユーザーが必要です。これを試してみると、動作します(マスターでユーザーを作成し、データベースの作成を許可して、データベースを作成できます)。ただし、データベースの作成を許可する(またはロールdbcreatorを許可する)ことにより、マスターのリテラルユーザーである必要はありません。
2つの権限の違いをさらに説明するために、マスターと別のデータベースでユーザーCREATE DATABASEを付与することで返されるメッセージが異なることを確認してから、権限CREATE ANY DATABASEを洗い流して繰り返します。
use master; GRANT CREATE DATABASE to TestUser
メッセージ15151、レベル16、状態1、行1ユーザー 'TestUser'が見つからないか、ユーザーにアクセス許可がないため見つかりません。
このエラーは、ユーザーTestUserがまだmasterデータベースにないために発生します。これはデータベースレベルのアクセス許可です。選択したデータベースの外に出てログインまたはユーザーを探すコンテキストはありません。最初にmasterでユーザーを作成すると、このコマンドは成功し、CREATE ANY DATABASEが許可されているかのようにデータベースを作成できることに注意してください。
use master; GRANT CREATE ANY DATABASE to TestUser
コマンドが正常に完了しました。
独自のMicrosoft SQL Server権限として、CREATE ANY DATABASEは現在使用されているデータベースのユーザーだけでなく、SQLインスタンスのログインリストを参照できるため、これは成功します。
use test; GRANT CREATE DATABASE to TestUser
メッセージ15151、レベル16、状態1、行1ユーザー 'TestUser'が見つからないか、ユーザーにアクセス許可がないため見つかりません。
これは、最初の例の説明の一貫性を示しています。以下のクエリとその結果のエラーメッセージに注意してください。このデータベースに最初にユーザーを作成した場合、このエラーメッセージは表示されません(最後のクエリを参照)。
use test; GRANT CREATE ANY DATABASE to TestUser
メッセージ4621、レベル16、状態10、行1サーバースコープでのアクセス許可は、現在のデータベースがマスターの場合にのみ付与できます
2番目のクエリに示されているように、CREATE ANY DATABASEは、このログイン名を既に作成したログインのリストを調べます。そのため、SQL Serverはユーザーの存在を確認しましたが、MSSQLでは許可されていないマスター以外の場所でサーバーレベルのアクセス許可を与えようとしているため、エラーが発生します。
use test; create user TestUser; grant create database to TestUser
CREATE DATABASE権限は、masterデータベースでのみ付与できます。メッセージ0、レベル11、状態0、行0現在のコマンドで重大なエラーが発生しました。結果があれば、破棄する必要があります。
CREATE DATABASEを適用するユーザーがいるので、SQL Serverがこれらのアクセス許可を格納する場所であるため、マスター以外の場所でサーバーレベルのアクセス許可を付与できないという一般的なエラーメッセージが表示されます。
まあ、これは楽しかったです。