web-dev-qa-db-ja.com

SQL Server2005でのデータベースロールメンバーシップのスクリプトの生成

たくさんのユーザーがいるデータベースがあります。これらのユーザーは、DB内のさまざまな組み込みロール(db_ddladminなど)に属しています。

別のデータベースで使用するために、同じ役割が割り当てられた同じユーザーを作成するスクリプトを生成したいと思います。 SQL Management Studioは、組み込みのロールではなく、ユーザー定義のロールに対してsp_addrolemember呼び出しのみを生成するようです。すべての役割をスクリプト化する方法はありますか?

おそらく、既存のデータベースからデータベーススクリプトを生成するためのより良いツールが他にありますか(できれば、必ずしも無料ではありません)?

13
rickythefox

データベースのユーザーとそれらが割り当てられているロールに関する情報は、システムビューsys.database_principalsとsys.database_role_membersで利用できます。次のクエリでこのデータを確認します。

select * from sys.database_principals
select * from sys.database_role_members

データベースAにデータベースユーザーとロールが構成されていて、それらをデータベースBにコピーする必要があると仮定します。ターゲットデータベースにユーザーを作成するには、次の手順に従います。

  • データベースAで次のクエリを実行します
  • 結果のスクリプトをデータベースBで切り取り、貼り付け、確認、実行します

SELECT 'CREATE USER [' + name + '] for login [' + name + ']'
 from sys.database_principals
 where Type = 'U'
  and name <> 'dbo'

Bの新しいユーザーを、Aと同じ役割で構成するには:

  • データベースAで次のクエリを実行します
  • 結果のスクリプトをデータベースBで切り取り、貼り付け、確認、実行します

SELECT 'EXECUTE sp_addrolemember ''' + roles.name + ''', ''' + users.name + ''''
 from sys.database_principals users
  inner join sys.database_role_members link
   on link.member_principal_id = users.principal_id
  inner join sys.database_principals roles
   on roles.principal_id = link.role_principal_id

これらのスクリプトを常に確認してください。例外や特別なケースが発生している可能性があり、セキュリティを台無しにしたくないだけです。

新しいデータベースが別のSQLServerインスタンスにある場合は、最初にSQLログインを作成する必要があります。ユーザー定義の役割がある場合は、最初にそれらを再作成する必要があります。 (役割とそれに割り当てられた権限は非常に自由形式であり、私はそれを行う必要がある状況になりたくありません!)

22
Philip Kelley

DBユーザーロールの場合

SELECT 'CREATE ROLE [' + name + ']' 
  FROM sys.database_principals 
  where type='R' and is_fixed_role = 0 and name != 'public'
0
Ankit Shah

Ideraからの1つのオプションは次のとおりです。 http://www.idera.com/Products/Free-Tools/SQL-permissions/ ログインとアクセス許可を生成し、目的を達成するのに役立つ場合があります。

0
jl.

新しいALTER ROLE構文を使用するように元の回答を調整します。

SELECT 'ALTER ROLE  [' + roles.name + '] ADD MEMBER [' + users.name + '];'
from sys.database_principals users
inner join sys.database_role_members link
on link.member_principal_id = users.principal_id
inner join sys.database_principals roles
on roles.principal_id = link.role_principal_id
where users.name = 'MyUser'

これはデータベース固有です-ロールを抽出するデータベースで実行します

0
Nick.McDermaid