おそらく、両方のデータベースにアクセスできるログインを使用しているでしょう (SA の場合など)。適切なロールを作成し、各データベースに権限を付与してから、両方で (使用しているログインにリンクされた) ユーザーを作成し、作成したロールにそれぞれを追加します。
T-SQL は次のようになります。
use master
go
create login testuser with password = 'mypassword123'
go
use test
go
create role reporting
grant select on something to reporting -- grant your permissions here
create user testuser for login testuser
exec sp_addrolemember 'reporting', 'testuser'
go
use test2
go
create role reporting
grant select on something2 to reporting -- grant your permissions here
create user testuser for login testuser
exec sp_addrolemember 'reporting', 'testuser'
go
これで、接続しtest
て実行できます
select * from something
select * from test2.dbo.something2
もちろん、目的のストアド プロシージャの権限を EXECUTE に変更することもできますが、それについては既に説明済みのようです。
その後は、単純なスクリプトを実行して、ログインとユーザーを作成し、それらをロールに追加するだけです。
declare @sql nvarchar(max), @username nvarchar(50), @password nvarchar(50)
-- ########## SET PARAMETERS HERE
SET @username = N'testguy'
SET @password = N'test123'
-- ########## END SET PARAMETERS
set @sql = N'USE master; CREATE LOGIN [' + @username + N'] WITH PASSWORD = N''' + @password + N'''; USE database1; CREATE USER [' + @username + N'] FOR LOGIN [' + @username + N']; EXEC sp_addrolemember ''reporting'', ''' + @username + N'''; USE database2; CREATE USER [' + @username + N'] FOR LOGIN [' + @username + N']; EXEC sp_addrolemember ''reporting'', ''' + @username + N''';'
exec sp_executesql @sql
ログイン、ユーザー、およびロールの自動同期
このスクリプトは、すべての SQL ログインを検索し (これを自分にとって意味のあるものに変更できます。ウィンドウと SQL アカウント、特定の文字列を含むアカウントなど)、ユーザーが と で作成されているdatabase1
ことdatabase2
を確認し、両方が に追加されていることを確認します。reporting
役割。reporting
ロールが両方のデータベースで作成されていることを確認する必要がありますが、これを行う必要があるのは 1 回だけです。
その後、手動で、または SQL エージェント ジョブを使用して、このスクリプトを定期的に実行できます。サーバーのログインを作成するだけです。スクリプトが実行されると、残りの処理が実行されます。
declare @login nvarchar(50), @user1 nvarchar(50), @user2 nvarchar(50), @sql nvarchar(max), @rolename nvarchar(50)
SET @rolename = 'reporting'
declare c cursor for
select sp.name as login, dp1.name as user1, dp2.name as user2 from sys.server_principals as sp
left outer join database1.sys.database_principals as dp1 on sp.sid = dp1.sid
left outer join database2.sys.database_principals as dp2 on sp.sid = dp2.sid
where sp.type = 'S'
and sp.is_disabled = 0
open c
fetch next from c into @login, @user1, @user2
while @@FETCH_STATUS = 0 begin
-- create user in db1
if (@user1 is null) begin
SET @sql = N'USE database1; CREATE USER [' + @login + N'] FOR LOGIN [' + @login + N'];'
EXEC sp_executesql @sql
end
-- ensure user is member of role in db1
SET @sql = N'USE database1; EXEC sp_addrolemember '''+ @rolename + ''', ''' + @login + N''';'
EXEC sp_executesql @sql
-- create user in db2
if (@user2 is null) begin
SET @sql = N'USE database2; CREATE USER [' + @login + N'] FOR LOGIN [' + @login + N'];'
EXEC sp_executesql @sql
end
-- ensure user is member of role in db2
SET @sql = N'USE database2; EXEC sp_addrolemember '''+ @rolename + ''', ''' + @login + N''';'
EXEC sp_executesql @sql
fetch next from c into @login, @user1, @user2
end
close c
deallocate c
不完全な変更をロールオフするためにトランザクションとエラー処理を追加する必要がありますが、それはあなたに任せます。