|
Межбазовые разрешения
Cхема управления правами доступа MSSQL
Как известно, если создать хранимую процедуру которая будет
запрашивать (возможно с наложением фильтра на строки или столбцы)
данные из таблиц,
к которым у конкретного пользователя
запускающего процедуру,
доступа нет то выборка этих
данных в рамках одной базы данных
осуществляется c правами пользователя,
создавшего хранимую процедуру к объектам
этого пользователя.
В случае если данные надо выбирать
из другой базы данных то такая конструкция
не работала в MSSQL 2000 до версии 2000 SP3
и требовалость прописывать явные права
к объектам другой базы данных
для каждого пользователя.
Начиная с MSSQL 2000 SP3 работает следующая конструкция:
1. заводим роль базы данных для группы пользователей выполняющих однородные задачи.
2. даем этой роли права только на ограниченный набор таблиц и запросов.
при необходимости получения доступа этих пользователей к данным из других баз данных:
1. DBO (имеющий права к другой базе) создает хранимку или представление которая использует данные из других баз данных (в которые не имеют прав члены роли)
2. Назначаются разрешения для работы с этой хранимкой для членов роли
Что мы получаем?
нет необходимости вводить пользователей во все базы данных откуда им нужно получать данные и назначать им конкретные разрешения на каждую таблицу.
Что нужно сделать чтоб это все работало?
1. задействовать Cross DB Ownership Chaining (это сказано в BOL)
Либо включить опцию
Cross DB Ownership Chaining - для обеих баз участвующих в связке
либо настроить сервер - включить для всех баз.
exec sp_configure 'Cross DB Ownership Chaining', 1
RECONFIGURE
или
EXEC sp_dboption 'ИмяБазы', 'db chaining', 'True'
2. Добавить пользователя c именем guest в базу из которой будут получаться данные. (Об этом BOL молчит.)
Можно не давать ему никаких прав, просто нужно чтоб он был в БД которая будет давать к себе доступ.
3. Если получем сообщение об ошибке : несмотря на то что овнер обеих баз один и тот же - переназначить еще раз овнером один и тот же логин
Решение проблем по шагам:
для теста берем две базы
cocdb - база в которой таблица с данными
northwind - база из которой тестовый пользователь не имеющий прав к cocdb должен через хранимку извлечь данные
--------------------------------------------------------------
1. включаем опцию crossdatabase ownership chaining для обеих баз,
из которой идет запуск хранимки, и из которой хранимка извлекает данные
либо
включаем эту опцию для сервера целиком и рестартуем его
--------------------------------------------------------------
2 создаем тестового пользователя 'coc' и даем ему доступ только к базе
в которой хранимка и права на запуск только этой хранимки
при попытке запустить хранимку от пользователя:
Server: Msg 916, Level 14, State 1, Procedure _testcoc, Line 4
Server user 'coc' is not a valid user in database 'cocdb'.
--------------------------------------------------------------
3 добавляем учетку guest в бд откуда будут выбираться данные
cocdb (роль только паблик, никаких явных прав!!!)
при попытке запустить хранимку от пользователя может быть ошибка:
Server: Msg 229, Level 14, State 5, Procedure _testcoc, Line 4
SELECT permission denied on object 'authRight', database 'cocdb', owner 'dbo'.
--------------------------------------------------------------
4 Насмотря на то что
sp_helpdb 'cocdb' и sp_helpdb 'Northwind' выдают одного и того же овнера нужно
переназначить овнером один и тот же логин, например sa
use northwind
EXEC sp_changedbowner 'sa'
use cocdb
EXEC sp_changedbowner 'sa'
теперь
все работает
--------------------------------------------------------------
ps: в MSSQL 2005 необходимо выполнить :
use база_данных_в_которой_таблица
sp_grantdbacces 'guest'
| |