SQL拥有者链接

时间:2014-11-19 11:45:07

标签: sql-server sql-server-2005

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

现在这个角色拥有各种SP等权限,但关键是,任何表都没有选择权限。他们看到或修改的所有内容都是通过SP完成的。

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

现在最初我得到了很多用户无法访问这些表,需要将SELECTs授予相关列,但该解决方案由于内部政治而无法工作。

我似乎理解的另一件事是我需要以某种方式使用EXECUTE AS。我用谷歌搜索,但我正在努力做到这一点。

为了先发制人地回答几个问题,除了在这个SP中使用动态SQL之外没有别的选择让我感到不快,我们谈论的是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

我得到的错误是:

  

我的Sp中出现意外错误   无法作为数据库主体执行,因为主体" AdminProgramUsers"不存在,这种类型的委托人不能被冒充,或者你没有权限。

1 个答案:

答案 0 :(得分:1)

这是摘自ms documentation关于SQL Server 2005上的execute

  

AS {LOGIN |中指定的用户或登录名USER} ='名字'   必须作为sys.database_principals中的主体存在   sys.server_principals分别或语句将失败。   此外,必须授予IMPERSONATE权限   主要。除非调用者是数据库所有者或是其成员   sysadmin固定服务器角色,即使是主体也必须存在   用户通过a访问SQL Server的数据库或实例   Windows组成员资格。

在您的代码中,您为execute角色提供了一个角色,但预计会改为用户或登录。

如果您不读这些内容,则上述文字不太清楚:

  

LOGIN

     

指定要模拟的上下文是登录。范围   假冒是服务器。

     

USER

     

指定要包含的上下文   impersonated是当前数据库中的用户。的范围   模拟仅限于当前数据库。上下文切换   数据库用户不继承服务器级权限   那个用户。

您可以将用户或登录名指定为模拟上下文; a role is neither a login nor a user