这让我疯了,我确信答案很容易。
我有多个模式,每个模式都有一个名为“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, 比尔
答案 0 :(得分:3)
要在CALLER的上下文中运行存储过程,您可以使用Execute As子句,但我怀疑这不是您想要做的事情。
答案 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