хранимая процедура, вызывающая данные в другой схеме - PullRequest
6 голосов
/ 15 декабря 2011

SQL Server 2008 R2: обычно мы создаем нашу таблицу и хранимую процедуру и предоставляем пользователю права на выполнение хранимой процедуры. Нам никогда не нужно предоставлять определенные права таблицам или представлениям, потому что, если они могут выполнять хранимую процедуру, пользователь SQL Server делает вывод, что хранимой процедуре должно быть разрешено выполнять операторы select / insert / update. Работает хорошо, потому что мы имеем дело только с одной схемой, но теперь у нас есть сценарий, в котором таблицы находятся в одной схеме, а хранимая процедура - в другой. Когда пользователь выполняет хранимую процедуру, он получает ошибку:

Сообщение 229, Уровень 14, Состояние 5, Процедура испытаний, процедура, Строка 7 Отказано в разрешении SELECT для объекта «testtable», база данных 'testdatabase', схема 'testschema'.

teststoredprocedure находится в другой схеме, чем testtable. Можно ли разрешить хранимой процедуре выбирать из таблиц, не предоставляя пользователю определенных прав на эти таблицы?

Ответы [ 2 ]

2 голосов
/ 25 января 2012

Вам необходимо предоставить владельцу хранимой процедуры WITH GRANT доступ к таблице.

Обычно схема принадлежит роли с тем же именем, что и схема, поэтому storedprocschema.teststoredprocedure можетполучить доступ к таблице это будет:

GRANT SELECT on testschema.testtable TO storedprocschema WITH GRANT

Это должно работать IF, и только если таблица находится в той же базе данных, что и proc.

Для достижения того же результата с таблицей вВ другой базе данных вы можете:

  • Включить «Перекрестное владение базой данных»

  • Переместить процедуру в другую базу данных и выполнить процедуру подкладкив исходной базе данных, которая вызывает его.Затем управляйте разрешениями для обеих процедур.

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

Да, это возможно. Вот что вы хотите сделать:

alter procedure teststoredprocedure
with execute as 'UserWithPermissions'
-- rest of stored proc code

Где UserWithPermissions имеет необходимые разрешения для объектов базы данных, которые вы пытаетесь снова выполнить операции CRUD.

И наоборот, если ваш пользовательский контекст безопасности базы данных имеет необходимые разрешения, вы также можете использовать сокращение для достижения этой цели:

with execute as self
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...