首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL所有者链

问SQL所有者链
EN

Stack Overflow用户
提问于 2014-11-19 11:45:07
回答 1查看 98关注 0票数 0

基本上,我有一个名为AdminProgram的前端应用程序。在Server中,我有一个名为AdminProgramUsers的角色。

现在,该角色具有对各种SPs等的权限,但关键的是,在任何表上都没有select权限。他们看到或修改的一切都是通过SPs完成的。

现在我刚刚为他们写了一个新的SP。我别无选择,只能使用动态SQL,即在一个名为@FinalQuery的字符串变量中构造实际的SQL查询,然后运行EXECUTE @FinalQuery。

一开始,我得到很多用户没有访问表的权限,需要将SELECT授予所讨论的列,但由于内部政治原因,该解决方案将无法工作。

我似乎理解的另一件事是,我需要以某种方式使用EXECUTE AS。我已经在谷歌上搜索过了,但我很难做到这一点。

为了先发制人地回答几个问题,我们别无选择,只能在这个SP中使用动态SQL --这让我非常不高兴,我们谈论的是Server 2005,并且没有办法签署任何带有证书的SPs (主要是因为DBA会对任何复杂的事情的前景产生影响)。

所以..。我认为答案就在执行中,就像所有权链.但我需要知道怎么做..。假设可用的角色是AdminProgramUsers..。

我目前的解决办法是:

代码语言:javascript
复制
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做一些更多的处理

代码语言:javascript
复制
Select * from @FinalTable

我得到的错误是:

Sp中的意外错误不能作为数据库主体执行,因为主体"AdminProgramUsers“不存在,不能模拟这种类型的主体,或者您没有权限。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-19 13:46:21

以下是关于server 2005上的ms文档关于execute的摘录:

sys.database_principals或sys.server_principals中指定的用户名或登录名必须分别作为主体存在,否则语句将失败。此外,必须对主体授予模拟权限。除非调用方是数据库所有者,或者是sysadmin固定服务器角色的成员,否则即使用户通过Windows组成员身份访问数据库或server实例,主体也必须存在。

在您的代码中,您为execute提供了一个角色,但是需要一个用户或登录名。

如果您不阅读以下内容,则上面的文本并不十分清楚:

登录 指定要模拟的上下文是登录。模拟的范围是服务器。 用户 指定要模拟的上下文是当前数据库中的用户。模拟范围仅限于当前数据库。上下文切换到数据库用户不会继承该用户的服务器级权限。

您可以将用户或登录指定为模拟上下文;角色既不是登录名,也不是用户。。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27016037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档