В основном у меня есть приложение для 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» не существует, этот тип принципала не может быть выдан за личность или у вас нет разрешения.