2014-11-19 3 views
0

В основном у меня есть приложение для front-end, называемое AdminProgram. В SQL Server у меня есть роль, называемая AdminProgramUsers.SQL owner chaining

Теперь эта роль имеет разрешения для разных SP и т.п., но, в сущности, на любой таблице нет разрешения на выбор. Все, что они видят или изменяют, осуществляется через SP.

Теперь я только что написал новый SP для них. У меня не было выбора, кроме как использовать динамический SQL, который создает фактический SQL-запрос в переменной String под названием @FinalQuery, а затем запускает EXECUTE @FinalQuery.

Теперь изначально у меня было много пользователей, которые не имеют доступа к таблицам, которые необходимы либо для предоставления SELECTs для соответствующих столбцов, но это решение не будет работать из-за внутренней политики.

Другое, что я понимаю, так это то, что мне нужно как-то использовать EXECUTE AS. У меня есть Googled, но я изо всех сил стараюсь сделать это правильно.

И чтобы упредить ответы на несколько вопросов, нет возможности использовать динамический SQL в этом SP, к моему неудовольствию, мы говорим о SQL Server 2005, и не будет никакого способа подписания каких-либо SP с сертификатами (в основном, поскольку DBA будет переворачивать орех в перспективе чего-либо сложного).

Итак ... Я думаю, что ответ лежит где-то в EXECUTE AS с цепочки владения ... но мне нужно знать, как это сделать ... если предположить, что роль доступна AdminProgramUsers ...

текущее решение у меня есть:

CREATE SP MySp AS 
DECLARE @FinalTable (columns) 

DECLARE @FinalQuery 
SET @FinalQuery = "EXECUTE AS CALLER 
SELECT blah blah" 

INSERT @FinalTable 
EXECUTE (@QueryString) AS user ='AdminProgramUsers' 

ли еще некоторую обработку @FinalTable

Select * from @FinalTable 

ошибки я получаю:

Неожиданная ошибка в My Sp Невозможно выполнить в качестве принципала базы данных, так как принципала «AdminProgramUsers» не существует, этот тип принципала не может быть выдан за личность или у вас нет разрешения.

ответ

1

здесь отрывок из ms documentation о execute на SQL Server 2005:

Пользователь или войти в систему имя, указанное в AS {LOGIN | USER} = 'name' должен существовать в качестве принципала в sys.database_principals или sys.server_principals, соответственно, или инструкция не сработает. Кроме того, разрешения IMPERSONATE должны быть предоставлены на принципе . Если вызывающий абонент не является владельцем базы данных или является членом фиксированной роли сервера sysadmin, он должен существовать, даже если пользователь обращается к базе данных или экземпляру SQL Server через членство в группе Windows .

в вашем коде вы кормите execute ролью, но вместо этого ожидается пользователь или логин.

выше текст не очень понятно, если вы не читали это:

ВХОД

Определяет контекст быть олицетворением является Логин. Область олицетворения - это сервер.

USER

Определяет контекст быть олицетворением является пользователем в текущей базе данных. Объем олицетворения ограничен текущей базой данных. Переключатель контекста пользователю базы данных не наследует разрешения на уровне сервера этого пользователя.

Вы можете указать пользователя или логин как контекст олицетворения; a role is neither a login nor a user.