たくさんのユーザーがいるデータベースがあります。これらのユーザーは、DB内のさまざまな組み込みロール(db_ddladminなど)に属しています。
別のデータベースで使用するために、同じ役割が割り当てられた同じユーザーを作成するスクリプトを生成したいと思います。 SQL Management Studioは、組み込みのロールではなく、ユーザー定義のロールに対してsp_addrolemember呼び出しのみを生成するようです。すべての役割をスクリプト化する方法はありますか?
おそらく、既存のデータベースからデータベーススクリプトを生成するためのより良いツールが他にありますか(できれば、必ずしも無料ではありません)?
データベースのユーザーとそれらが割り当てられているロールに関する情報は、システムビューsys.database_principalsとsys.database_role_membersで利用できます。次のクエリでこのデータを確認します。
select * from sys.database_principals
select * from sys.database_role_members
データベースAにデータベースユーザーとロールが構成されていて、それらをデータベースBにコピーする必要があると仮定します。ターゲットデータベースにユーザーを作成するには、次の手順に従います。
。
SELECT 'CREATE USER [' + name + '] for login [' + name + ']'
from sys.database_principals
where Type = 'U'
and name <> 'dbo'
Bの新しいユーザーを、Aと同じ役割で構成するには:
。
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ログインを作成する必要があります。ユーザー定義の役割がある場合は、最初にそれらを再作成する必要があります。 (役割とそれに割り当てられた権限は非常に自由形式であり、私はそれを行う必要がある状況になりたくありません!)
DBユーザーロールの場合
SELECT 'CREATE ROLE [' + name + ']'
FROM sys.database_principals
where type='R' and is_fixed_role = 0 and name != 'public'
Ideraからの1つのオプションは次のとおりです。 http://www.idera.com/Products/Free-Tools/SQL-permissions/ ログインとアクセス許可を生成し、目的を達成するのに役立つ場合があります。
新しい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'
これはデータベース固有です-ロールを抽出するデータベースで実行します