2014-12-04 2 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

Вы сделали домен \ группу пользователем в otherDb? –

+0

Просто добавлено 'use anotherDb; создайте пользователя [domain \ group] для входа в систему [domain \ group] '. Все еще получена ошибка для user1 – ca9163d9

ответ

1

Согласно этой статье MSDN, если вы используете динамический SQL, то пользователь должен существовать в обеих базах данных (или, если процедура подписывается CERT, который существует в обеих базах данных). 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 'domain \ user1'. – ca9163d9

+0

Предоставили ли вы разрешение 'domain \ group'' select' из 'anotherDb.dbo.table1'? – BateTech

+0

Также возможно настроить цепочку владельца базы данных на уровне базы данных. Каковы результаты этого запроса для ваших 2 баз данных? 'выберите d.name, d.is_db_chaining_on, d.is_trustworthy_on из sys.databases d, где d.name в ('myDB', 'anotherDB')' – BateTech

Смежные вопросы