Цепочка владения работает для объектов внутри базы данных. Он не позволяет вам войти в саму базу данных. Таким образом, вы должны создать логин в любой базе данных, с которой вы читаете, например:
use DatabaseB
exec sp_grantdbaccess 'testuser'
Цепочка владения предоставляет права на хранимую процедуру. Таким образом, вход в базу данных может быть лишен каких-либо разрешений. Он просто должен существовать.
Запрос, который создает две тестовые базы данных и вызывает процедуру в одной:
use master
if exists (select * from sys.databases where name = 'TestDatabase1')
drop database TestDatabase1
if exists (select * from sys.databases where name = 'TestDatabase2')
drop database TestDatabase2
create database TestDatabase1
go
use TestDatabase1
exec sp_changedbowner 'sa'
go
create procedure dbo.sp1 as select 'hello world!'
go
create database TestDatabase2
go
use TestDatabase2
exec sp_changedbowner 'sa'
go
create procedure dbo.sp2 as exec TestDatabase1.dbo.sp1
go
use TestDatabase2
exec sp_grantdbaccess 'testuser'
grant execute on sp2 to testuser as dbo
use TestDatabase1
-- Either of the below lines would work
-- exec sp_grantdbaccess 'guest'
-- exec sp_grantdbaccess 'testuser'
use TestDatabase2
execute as login = 'testuser'
exec sp2
revert -- Revert back to original login
Запрос отображения владельца баз данных и процедур:
select d.name
, l.name
from sys.databases d
join sys.syslogins l
on d.owner_sid = l.sid
where d.name like '...your database...'
select p.name
, dp.name
from TestDatabase.sys.procedures p
join TestDatabase.sys.schemas s
on s.schema_id = p.schema_id
join TestDatabase.sys.database_principals dp
on s.principal_id = dp.principal_id
where p.name like '...your stored procedure...'