基本上我有一个名为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"不存在,这种类型的委托人不能被冒充,或者你没有权限。
答案 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