Владение несколькими базами данных НЕ работает - PullRequest
0 голосов
/ 28 декабря 2011

Я прочитал статью

http://www.sommarskog.se/grantperm.html#ownershipchaining

, в которой содержится очень хорошая информация о цепочке владения в SQL Server.

Так вот, что у меня естьсделано на моем SQL Server 2008,

  1. Создано 2 базы данных DatabaseA, DatabaseB с логином sa
  2. Создана процедура 'TestProc' в DatabaseA, которая выполняет процедуру в базе данныхB
  3. Создан логин 'testuser'
  4. Добавил этот логин как пользователь в DatabaseA и дал права на выполнение процедуры 'TestProc'

Как видите, моя цель - сделать 'testuser'выполнить процедуру в DatabaseB, не добавляя этого пользователя в DatabaseB и не предоставляя ему права прямого выполнения для процедуры в DatabaseB.

Я включил цепочку владения на уровне сервера и в обеих базах данных.Я перезапустил службу SQL Server.

Но все равно получаю эту ошибку

Сообщение 916, Уровень 14, Состояние 1, Процедура TestProc, Строка 18 Основной сервер "testuser" не можетполучить доступ к базе данных «DatabaseB» в текущем контексте безопасности.

Я что-то здесь упускаю?

1 Ответ

0 голосов
/ 28 декабря 2011

Цепочка владения работает для объектов внутри базы данных. Он не позволяет вам войти в саму базу данных. Таким образом, вы должны создать логин в любой базе данных, с которой вы читаете, например:

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...'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...