我有一个存储过程,我想在程序中保存更新语句的执行,我正在通过将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身份验证用户。
任何?
答案 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
当然,你应该有权授予许可。