在存储过程中执行('tsql_string') - 什么权限/用户用于执行()?

时间:2015-11-02 14:00:02

标签: sql-server stored-procedures

我有一个存储过程,我想在程序中保存更新语句的执行,我正在通过将sql放入varchar变量来实现。 我的问题是EXECUTE()似乎使用原始调用者的权限然后给出错误,因为调用者没有(也不应该)具有table1的UPDATE权限。

为什么不使用存储过程所有者的权限? 更重要的是:我如何才能使用这些权限?

存储过程基本上看起来像这样:(动态设置@tsql_string除外)

create procedure dbo.woopwoop() as
BEGIN
    DECLARE @tsql_string varchar(max)
    SET @tsql_string = 'UPDATE table1 set c1 = 1'

    EXECUTE(@tsql_string)
END

我在SQL Server 2008上,并且存储过程的所有者(我)是具有域\用户的Windows身份验证用户。

任何?

2 个答案:

答案 0 :(得分:2)

EXECUTE AS clause存在的内容 - 允许您控制此内容:

  

通过指定执行模块的上下文,您可以控制数据库引擎用于验证模块引用的对象的权限。

     

CALLER

     

指定模块内的语句在模块的调用者的上下文中执行。执行模块的用户不仅必须对模块本身具有适当的权限,还必须对模块引用的任何数据库对象具有适当的权限。

     

CALLER是除队列

以外的所有模块的默认值

您可能希望指定存储过程执行为OWNER(或可能SELF,请阅读上面的页面并确定哪个对您最有意义)。

create procedure dbo.woopwoop()
with execute as owner
as
    ....

答案 1 :(得分:0)

从MSDN(此示例将存储过程HumanResources.uspUpdateEmployeeHireInfo的EXECUTE权限授予名为Recruiting11的应用程序角色:

USE AdventureWorks2012; 
GRANT EXECUTE ON OBJECT::HumanResources.uspUpdateEmployeeHireInfo
    TO Recruiting11;
GO

Source

当然,你应该有权授予许可。