短版:我可以允许访问外部数据库的作用?
龙版本:
我正在使用Crystal这是从应用程序的SQL Server实例(检索数据报告database1
)。
在应用程序运行报告,并覆盖在报告中的连接,我必须在应用程序代码的访问权限。
我添加了一个新的数据库服务器( database2
这是从一个电话交换收集信息),我想加入一些信息的应用程序数据( database1
)。
我可以加入数据和当设计师(身份登录SA),但是当这些报告都是通过他们失败了相当一般性错误的应用程序外部运行(无法检索数据)内运行的报告工作。
我假设正在被新的数据库权限引起的错误,如果我登录到作为SA错误消失的应用。
该应用程序已为运行报告的用户一个特殊的角色DB,增加表/视图/ SP的应用程序数据库(当database1
)我可以简单地授予选择/执行这个角色,让报告访问对象。
现在我有一个不同的db对象但是作用不是很方便。
有没有什么办法可以参考第二分贝( database2
通过现有角色)?
例如:
USE [database1]
GRANT EXECUTE ON [database2].[dbo].[CUSTOM_PROCEDURE] TO [applicationrole1]
OR
USE [database2]
GRANT EXECUTE ON [dbo].[CUSTOM_PROCEDURE] TO [database1].[dbo].[applicationrole1]
理想的情况是我希望能够链接到角色莫名其妙,而不是重新创建一个新的角色,角色由经常当新用户添加/配置的应用程序更新。
(没有被标注为水晶报表,因为这是不相关的问题)
编辑:
有没有办法做这样的事情:
INSERT INTO Database2.sys.database_principals
SELECT * FROM Database1.sys.database_principals
WHERE [type] = 'S'
要通过用户(不登录)复制,然后添加的角色成员?
据推测,你会使用具有访问这两个数据库(如用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
您将要添加一个交易和错误处理滚下不完整的变化,但我会离开,给你。
将存储过程执行作为所有者。
http://msdn.microsoft.com/en-us/library/ms188354.aspx
设置在存储过程所在的数据库上可信赖的。
http://technet.microsoft.com/en-us/library/ms187861.aspx
请确保您有两个数据库的所有者相同。
http://msdn.microsoft.com/en-us/library/ms188676(v=sql.105).aspx
格兰特在执行存储过程与过程的数据库上适当的用户或角色权限。