据推测,您将使用可以访问两个数据库的登录名(例如 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 登录(您可以将其更改为对您有意义的任何内容;windows 和 SQL 帐户、包含特定字符串的帐户等),确保用户已在database1
和中创建database2
,并确保它们都添加到reporting
角色。您需要确保reporting
在两个数据库上都创建了角色,但您只需执行一次。
之后,您可以手动或使用 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
你会想要添加一个事务和错误处理来取消不完整的更改,但我将把它留给你。