基本上,我有一个名为AdminProgram的前端应用程序。在Server中,我有一个名为AdminProgramUsers的角色。
现在,该角色具有对各种SPs等的权限,但关键的是,在任何表上都没有select权限。他们看到或修改的一切都是通过SPs完成的。
现在我刚刚为他们写了一个新的SP。我别无选择,只能使用动态SQL,即在一个名为@FinalQuery的字符串变量中构造实际的SQL查询,然后运行EXECUTE @FinalQuery。
一开始,我得到很多用户没有访问表的权限,需要将SELECT授予所讨论的列,但由于内部政治原因,该解决方案将无法工作。
我似乎理解的另一件事是,我需要以某种方式使用EXECUTE AS。我已经在谷歌上搜索过了,但我很难做到这一点。
为了先发制人地回答几个问题,我们别无选择,只能在这个SP中使用动态SQL --这让我非常不高兴,我们谈论的是Server 2005,并且没有办法签署任何带有证书的SPs (主要是因为DBA会对任何复杂的事情的前景产生影响)。
所以..。我认为答案就在执行中,就像所有权链.但我需要知道怎么做..。假设可用的角色是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我得到的错误是:
Sp中的意外错误不能作为数据库主体执行,因为主体"AdminProgramUsers“不存在,不能模拟这种类型的主体,或者您没有权限。
发布于 2014-11-19 13:46:21
以下是关于server 2005上的ms文档关于execute的摘录:
sys.database_principals或sys.server_principals中指定的用户名或登录名必须分别作为主体存在,否则语句将失败。此外,必须对主体授予模拟权限。除非调用方是数据库所有者,或者是sysadmin固定服务器角色的成员,否则即使用户通过Windows组成员身份访问数据库或server实例,主体也必须存在。
在您的代码中,您为execute提供了一个角色,但是需要一个用户或登录名。
如果您不阅读以下内容,则上面的文本并不十分清楚:
登录 指定要模拟的上下文是登录。模拟的范围是服务器。 用户 指定要模拟的上下文是当前数据库中的用户。模拟范围仅限于当前数据库。上下文切换到数据库用户不会继承该用户的服务器级权限。
您可以将用户或登录指定为模拟上下文;角色既不是登录名,也不是用户。。
https://stackoverflow.com/questions/27016037
复制相似问题