У меня есть экземпляр SQL Server 2012 с несколькими базами данных. В одном из них я создал представление, которое выбирает таблицы больше, чем база данных.
Я хочу, чтобы пользователь мог выбрать это представление, но он не должен выбирать свои таблицы. Представление было создано именно потому, что пользователь не может выбрать таблицы.
Я прочитал /programming/368414/grant-select-on-a-view-not-base-table и http://msdn.microsoft.com/en-us/library/ms188676. ASPX и до сих пор это не работает.
Если я сделаю GRANT SELECT TABLE TO USER
все таблицы, пользователь сможет выбрать представление. Но если я отзовусь к любому столу, он потерпит неудачу.
Это должна быть простая процедура, но у меня проблемы с тем, чтобы она заработала. Я видел это раньше (владелец экземпляра дал мне доступ к представлению и не сделал его с его таблицами), но я не могу это сделать или найти кого-то, кто знает, как.
Может ли кто-нибудь предоставить мне учебник о том, как это сделать, или пример кода?
При просмотре пользователем SELECTs
я получаю сообщение:
В доступе SELECT было отказано для объекта
<TABLE>
, базы данных<DB>
, схемыdbo
.
Если я предоставлю выбор этой таблице, сообщение об ошибке изменит имя таблицы на другую таблицу, которую читает представление.
источник
Ответы:
Если вы хотите, чтобы пользователи выбирали из представления, почему вы предоставляете эту таблицу? Под «отзывать» вы подразумеваете явное «отозвать / отрицать»? Запрет будет отменять грант, так что есть ваша проблема ... вы должны быть в состоянии сделать это, добавив грант в представление и ничего не делая в любом случае с таблицами.
Вот быстрый пример, где
SELECT
явно не предоставлено на столе, но было на представлении. Пользователь может выбирать из вида, но не из таблицы.Обратите внимание, что это предполагает,
foo
что не было предоставлено повышенных привилегий через явные разрешения на схему или базу данных, или через роль или членство в группе.Поскольку вы используете таблицы в нескольких базах данных (извините, я пропустил конец первого предложения вначале), вам также могут потребоваться явные разрешения для таблиц в базе данных, где представление не существует. Чтобы избежать предоставления выбора таблицам, вы можете создать представление в каждой базе данных, а затем объединить представления.
Создайте две базы данных и логин:
В базе данных
d1
создайте пользователя, затем создайте таблицу и простое представление для этой таблицы. Предоставить пользователю право выбора только для просмотра:Теперь, во второй базе данных, создайте пользователя, затем создайте другую таблицу и представление, которое присоединяет эту таблицу к представлению в
d1
. Предоставить выбор только для просмотра.Теперь запустите новое окно запроса и измените учетные данные для входа в систему
blat
(EXECUTE AS
здесь не работает). Затем запустите следующее из контекста любой базы данных, и оно должно работать нормально:Оба должны дать Msg 229 ошибок:
Результаты:
источник
Сообщество вики-ответа изначально добавило на вопрос его автора:
Вот что я сделал:
SELECT
доступ пользователю в этом представлении, а не в любой из его таблиц. Пользователь успешно смог запросить представление, а не таблицы.SELECT
доступ пользователю на этом втором представлении, а также НЕ к любой таблице. Пользователь успешно смог запросить этот окончательный вид и посмотреть данные.Мне кажется странным, что представление может запрашивать таблицы в своей БД, что у пользователя нет прямого доступа, но он не может сделать это в таблицах из другой БД. По крайней мере, это сработало.
источник
Если вы активируете
Cross database ownership chaining
для сервера, то кросс-базы данных будут работать нормально.https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/enabling-cross-database-access-in-sql-server
учитывать риски
источник