CREATE DATABASE vs. CREATE ANY DATABASEパーミッション


21

Microsoft SQL ServerではCREATE DATABASECREATE ANY DATABASEアクセス許可とアクセス許可の違いは何ですか?

信頼できる答えが見つかりません。私が推測することができる最高のは、()があることであるCREATE ANYとのに対し、私は、別のユーザーが所有するデータベースを作成することができます意味CREATEのSybase /初期のSQL Serverの日の元の許可だった私はできない、または(b)CREATE ANYCREATEのためにエイリアスされますANSI準拠。


アーロンの言ったことを反映して、+ 1しますが、実際に編集内容を切り取り、回答として貼り付けてから受け入れてください。2つの理由:答えが何であるかを明確にし(そしてあなたの編集が素晴らしい答えである)、またそれがきちんとしている(未解決の質問が時々注意を引くためにトップにぶつかる)。
サイモン・リガーツ

1
完了しましたが、明日まで受け入れることができず、昨日まったく回答を投稿できませんでした(100人未満の場合、自己回答の制限は5時間です)。
-Tohuw

回答:


20

この記事で提供されている表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がこれらのアクセス許可を格納する場所であるため、マスター以外の場所でサーバーレベルのアクセス許可を付与できないという一般的なエラーメッセージが表示されます。

まあ、これは楽しかったです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.