2014-12-04 39 views
0

我创建了一个Windows组domain\group并添加Windows用户domain\user1到组。然后创建登录交叉数据库访问不适用于Windows组?

use master 
create login [domain\group] for windows 
use myDB 
create user [domain\group] for login [domain\group] 
grant select on schema::mySchema to [domain\group] 

我启用了跨数据库访问

use master 
EXECUTE sp_configure 'show advanced', 1; 
RECONFIGURE with override; 
EXECUTE sp_configure 'cross db ownership chaining', 1; 
RECONFIGURE with override; 

下面的语句作品。

exec ('select 1 a') as login = 'domain\user' 

但是,选择访问另一个数据库中的表的视图时出现以下错误。

create view mySchema.view1 as select * from anotherDb.dbo.table1 
go 
exec ('select * from mySchema.view1') as login = 'domain\user' 

Msg 916, Level 14, State 1, Line 1 The server principal "domain\user1" is not able to access the database "anotherDb" under the current security context.

+0

您是否在另一个域中将域\组用户创建了组? – 2014-12-04 16:19:53

+0

刚刚添加'use anotherDb;为登陆[domain \ group]创建用户[domain \ group]'。仍然得到了user1的错误 – ca9163d9 2014-12-04 16:26:35

回答

1

根据这个MSDN文章,如果您使用动态SQL,则用户必须同时存在于数据库中(或者,如果过程是由存在于两个数据库一个证书签署)。 http://msdn.microsoft.com/en-us/library/bb669059(v=vs.110).aspx

跨数据库所有权链接不会在 动态创建的SQL语句执行,除非同一用户 两个数据库中存在的情况下工作。您可以解决此在SQL Server通过 创建另一个数据库和 访问数据签名的程序与存在于两个 数据库的证书的存储过程。这使用户可以访问 过程所使用的数据库资源,而不授予他们数据库访问权限。

确保数据库具有相同的所有者:

select d.name, d.owner_sid, owner_name = suser_sname(d.owner_sid) 
from sys.databases d 
where d.name in ('myDB','anotherDB') 

此外,检查每个数据库中的数据库对象具有相同的owner_login(和owner_login不应该NULL)使用下面的查询,要不然所有权链将被打破:

use myDB 
go 

select o.name, o.type_desc 
    , owner_name = USER_NAME(OBJECTPROPERTY(o.object_id, 'OwnerId')) 
    , owner_login = suser_sname(p.sid) 
from sys.objects o 
left join sys.database_principals p on p.principal_id = OBJECTPROPERTY(o.object_id, 'OwnerId') 
where o.name = 'view1' 
and o.schema_id = schema_id('mySchema') 
go 

use anotherDB 
go 

select o.name, o.type_desc 
    , owner_name = USER_NAME(OBJECTPROPERTY(o.object_id, 'OwnerId')) 
    , owner_login = suser_sname(p.sid) 
from sys.objects o 
left join sys.database_principals p on p.principal_id = OBJECTPROPERTY(o.object_id, 'OwnerId') 
where o.name = 'table1' 
and o.schema_id = schema_id('dbo') 
go 
+0

我将'domain \ group'添加到anotherDb,但仍然出现错误。我仅使用动态SQL来测试unser域\ user1的凭据。 – ca9163d9 2014-12-04 16:38:02

+0

你是否授予了'domain \ group'许可给'select' from anotherDb.dbo.table1'? – BateTech 2014-12-04 16:44:55

+0

也可以在数据库级别配置数据库所有者链接。这个查询对你的2个数据库有什么结果? 'select d.name,d.is_db_chaining_on,d.is_trustworthy_on from sys.databases d where('myDB','anotherDB')中的d.name' – BateTech 2014-12-04 16:52:27