Я работаю с MSSQL Server Management Studio 2008, и мне нужно предоставить представление третьей стороне для сверки данных. Я создал соответствующий вид, но у меня возникли проблемы с созданием пользователя и предоставлением ему соответствующих прав для выбора из этого вида.
Я следовал указаниям мастеров по созданию логина и пользователя, а затем добавил свое представление в раздел Securables с установленным флажком предоставления. Все выглядело нормально, но когда я вошел в систему как этот пользователь и попытался сделать «Выбрать * из MyViewName», он сказал мне, что в разрешении на выбор было отказано.
Я просто заново создал пользователя (на этот раз просто используя SQL вместо мастера) и явно предоставил права выбора, и теперь он дает мне ошибку: Msg 916, Level 14, State 1, Line 2
The server principal "username" is not able to access the database "unrelated_db" under the current security context.
(Я не знаю, почему он пытается получить доступ к несвязанной базе данных ...)
Я действительно не знаю, куда идти отсюда. Опять же, в основном все, что мне нужно, - это создать пользователя, которого я могу передать третьей стороне, чтобы он подключился к нашей базе данных и выбрал из этого представления.
источник
Ответы:
Пожалуйста, не используйте пользовательский интерфейс для этого. Это запутанный беспорядок.
Для меня это звучит так, как будто вы хотите создать пользователя в базе данных для конкретного входа в систему, у которого есть только права на выбор из одного представления. Итак, поскольку вы уже создали логин:
РЕДАКТИРОВАТЬ здесь пример скрипта, который приведет к указанной вами ошибке.
Сначала создайте таблицу в unrelated_db:
Теперь создайте относительно ограниченный логин:
Теперь создайте базу данных, в которой будет жить представление, и добавьте имя пользователя как пользователя:
Теперь создайте функцию, которая будет ссылаться на таблицу в другой базе данных и синоним другой таблицы:
Теперь создайте локальную таблицу:
Теперь создать представление , которое ссылается на таблицу, то функция и синоним, и грант
SELECT
наusername
:Теперь попробуйте выполнить как
username
и выберите только локальный столбец из представления:Результат:
Теперь измените представление, чтобы не ссылаться на какие-либо внешние объекты, и
SELECT
снова запустите выше , и это работает:Если не считать сценариев для объектов «Платежная информация», «Сведения о счете» и «MyView», возможно, вы можете сообщить нам, если этот запрос даст какие-либо результаты. Вы можете найти ссылки на различные объекты в представлении каталога
sys.sql_expression_dependencies
, но это представление не является идеальным - я полагаю, что оно зависит от всех обновляемых представлений (в случае, когда представления ссылаются, например, на другие представления или базовая схема изменилась) в порядке быть точнымSQL Server не просто попытается получить к нему доступ
unrelated_db
для удовольствия ... должна быть некоторая связь с этой базой данных из представления, которое вы пытаетесь использовать. К сожалению, если мы не можем увидеть определение вида и больше деталей об объектах, к которым он прикасается, все, что мы можем сделать, - это спекулировать. Две основные вещи, которые я могу придумать, - это синонимы или функции, которые используют имена из трех частей, но просмотр реальных сценариев даст нам гораздо лучшую идею, чем угадывание. :-)Вы также можете захотеть проверить
sys.dm_sql_referenced_entities
, однако эта функция не возвращает ничего полезного в примере выше.источник
Вы можете проверить это, выполнив следующие действия:
источник