在调用者的上下文中运行Sql Server存储过程

时间:2009-05-19 14:56:32

标签: sql-server sql-server-2008 stored-procedures

这让我疯了,我确信答案很容易。

我有多个模式,每个模式都有一个名为“Task”的视图。我想创建一个单独的存储过程,运行在多个默认模式中的用户可以成功执行 - 存储过程在任务视图上执行选择。

所以说我有这些对象:

查看:fr.Task(默认架构为'fr'的用户只要输入“select * from Task”就可以获取此信息 查看:de.Task(同上,但对于默认架构为'de'的用户)

StoredProc:dbo.MyProc - 所有用户都拥有执行权限。简单的过程就是:

select count(*) from Task 

现在我希望(并且我想)如果具有默认架构'fr'的用户

exec dbo.MyProc

然后他们将从视图fr.Task获得行数。但相反,他们会收到错误“无效的对象名称'任务'。”

是否无法创建将在正在运行的用户的模式中执行select的通用存储过程?

THX, 比尔

3 个答案:

答案 0 :(得分:3)

要在CALLER的上下文中运行存储过程,您可以使用Execute As子句,但我怀疑这不是您想要做的事情。

http://msdn.microsoft.com/en-us/library/ms188354.aspx

答案 1 :(得分:0)

使用动态SQL即,exec('从任务'中选择计数(*))

答案 2 :(得分:0)

“是否有可能使通用的存储过程在正在运行的用户的模式中执行选择?” 答案是“否”

default_schema来自stored_procedure的位置

create procedure fr.MyProc as select * from Task
create procedure de.MyProc as select * from Task

在第一种情况下将返回fr.Task-Table,在第二种情况下将返回de.Task-Table。 没关系,呼叫者拥有哪个default_schema