web-dev-qa-db-ja.com

複数のサーバーログインから1人のデータベースユーザーへのマッピング

これは馬鹿げた質問のようですが、いくつかの調査にもかかわらず、これに関する情報のみを見つけることができませんでした(おそらく間違った用語を使用したため)。

複数のサーバーログイン(SQLサーバー認証)を1つのデータベースユーザー(データベースロールのメンバーとして割り当てられたアクセス許可を持つ)に記録することはできますか?

中央データベースから1つの設定を読み取る必要がある数十のSQLログイン(SQLサーバー認証)があり、ログインごとに独自のDBユーザーを作成するのではなく、これらのすべてのログインをターゲットデータベースの単一のDBユーザーにマップします。

はいの場合、正しいT-SQL構文は何ですか?

11
leepfrog

まず、用語を確認します。ログインはインスタンスレベルのセキュリティプリンシパル(sys.server_principals)であり、ユーザーはデータベースレベルのセキュリティプリンシパル(sys.database_principals)です。それらは、SID(セキュリティ識別子)によって結合されます。上記のシステムビューを見ると、SIDによって1:1形式で結合されていることがわかります。これは、データベース内の1ユーザーへの1ログインです。ログインは複数のユーザーを持つことができますが、それらは異なるデータベースにある必要があります。

そのため、アクセスしたいログインごとにデータベースにユーザーを作成する必要があります。これは十分に単純なコマンドです。

CREATE USER [UserName] FROM LOGIN [LoginName]

そこから、すべてのユーザーを1つ(または複数)の役割に割り当てることができます。ロールは、権限を持ち、それらの権限を各ユーザー(データベースロールの場合)またはログイン(たとえばロール)と共有するコンテナです。 db_datareaderと呼ばれる組み込みのデータベースロールがあり、データベース内のすべてのテーブルとビューへの読み取りアクセスを提供します。すべてのユーザーをそのロールに追加できます。ただし、より良いアイデアは、新しいロールを作成し、それをdb_datareaderロールに追加することです。次に、すべてのユーザーを新しいロールに追加します。ここでの利点は、グループに追加のアクセス許可を追加する場合は、ロールのアクセス許可を変更するだけでよいことです。

次の方法で役割を作成します。

CREATE ROLE RoleName

ユーザーを役割(または1つの役割を別の役割)に追加する

EXEC sp_addrolemember 'RoleName','UserName'

または、2012年以降の場合

ALTER ROLE [RoleName] ADD MEMBER [UserName]
19
Kenneth Fisher