假设您使用的登录帐户可以访问两个数据库(例如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
create user testuser for login testuser
exec sp_addrolemember 'reporting', 'testuser'
go
use test2
go
create role reporting
grant select on something2 to reporting
create user testuser for login testuser
exec sp_addrolemember 'reporting', 'testuser'
go
现在我可以连接到 test
并执行命令
select * from something
select * from test2.dbo.something2
当然,您需要将授权更改为在所需的存储过程上执行,但看起来您已经处理好了这个问题。
之后,只需要执行一个简单的脚本来创建登录、用户,并将它们添加到角色中。
declare @sql nvarchar(max), @username nvarchar(50), @password nvarchar(50)
SET @username = N'testguy'
SET @password = N'test123'
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 Agent 作业。您只需要为服务器创建登陆账号; 当脚本运行时,它将完成其余任务。
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
if (@user1 is null) begin
SET @sql = N'USE database1; CREATE USER [' + @login + N'] FOR LOGIN [' + @login + N'];'
EXEC sp_executesql @sql
end
SET @sql = N'USE database1; EXEC sp_addrolemember '''+ @rolename + ''', ''' + @login + N''';'
EXEC sp_executesql @sql
if (@user2 is null) begin
SET @sql = N'USE database2; CREATE USER [' + @login + N'] FOR LOGIN [' + @login + N'];'
EXEC sp_executesql @sql
end
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
你需要添加事务和错误处理来回溯未完成的更改,但我会留给你自己去处理。
database
中的但在database2
中缺失的帐户同步。我会编写一个额外的脚本。然后,您可以安排定期运行此脚本的作业,以便您只需担心创建登录即可。 - moribvndvs