web-dev-qa-db-ja.com

同じサーバー上の別のデータベースのテーブルへのアクセスを1つのデータベースで簡単に付与する

データベースサーバー(Sql Server 2008 R2 Enterprise)があり、それぞれ独自のデータベース(XおよびYと呼びます)を使用する2つの個別の関連ベンダー製品をサポートしています。

データベースXでは、多くのユーザーが定義されていますが、それらのアクセス権は管理可能な少数のロールに分類されます。これらの役割の1つを取り、それを使用してデータベースYのいくつかのテーブルへの選択アクセスを許可したいと思います。そのセキュリティ情報を設定する忙しい仕事だけでなく、ユーザーが出入りするときに、これらのロールを時間をかけて同期させる必要があるためです。実際、データベースXにすでに存在するロールは、データベースYに必要なアクセスグループをビジネスの観点から論理的に定義するというすばらしい仕事をすでに果たしており、それを維持したいと考えています。

XからこのロールにYのアクセス権を付与するにはどうすればよいですか?

6
Joel Coehoorn

私は今、これを新しい方法で行っています。

Yで気になるテーブルを参照するデータベースXにビューを設定し、それらのビューに対するSELECT権限をXで気になるロールに付与しました。

この変更は少し前に行われたもので、Yへの認証/セキュリティを処理して、そこにアクセス許可を複製する必要がないようにするために、リンクサーバーの魔法も必要だったかもしれません。覚えていません。しかし現在、ビューはXに存在し、そのビューへのアクセスの管理ははるかに簡単なタスクです。

1
Joel Coehoorn

データベースロールは、それぞれのデータベース内に完全に含まれるセキュリティプリンシパルであり、他のデータベースから共有または表示されません。したがって、データベースXにあるロールとユーザーは、データベースYを認識していません。目的を達成するには、データベースYにロールを再作成し、すべての適切なユーザーをこのデータベースとロールに追加する必要があります。幸い、システムビューを使用してこのプロセスをスクリプト化できます。

USE [Y];
CREATE ROLE foo;

--grant all perms on foo

--Use this generate sql to add all your users to the role
select 'CREATE USER '+quotename(u.name)+';' + char(10)+
       'EXEC sp_addrolemember ''foo'','''+u.name+''';'
from (select name,principal_id
        from x.sys.database_principals where type = 'R') r
    join x.sys.database_role_members rm 
        on (r.principal_id = rm.role_principal_id)
    join (select name,type_desc,principal_id
        from x.sys.database_principals where type != 'R') u 
        on (rm.member_principal_id = u.principal_id )
where r.name = 'foo'

次に、この種のスクリプト/プロセスをバッチジョブに渡して同期を維持できますが、これらの役割の同期を維持するには、何らかの外部プロセスが必要になります。

ここで混乱する可能性があるのは、データベースプリンシパルに接続されているログインと他のサーバーレベルのプリンシパルがあることですが、これらの間には明確な違いがあります。 この答え でこれらのプリンシパルの違いについていくつか説明します

3
Mike Fal

Windows認証を使用している場合は、ドメインユーザーをドメイングループに追加し、このグループをSQL Serverへのログインとして追加できます。次に、そのログインに関連するデータベースで必要な権限を付与します。

3
Matan Yungman