如何从另一个架构运行模式PROC

问题描述:

比方说,在一个多模式的数据库,我们有这2个特效:如何从另一个架构运行模式PROC

Create proc S1004.proc1 
As 
    Exec proc2 
GO 
Create proc S1004.proc2 
As 
    Select 1 

然后,当我尝试从SA登录时运行PROC1, sql发出错误:无法找到存储过程'proc2'。

我知道如果我们将模式添加到proc1主体中的proc2,那么它可以解析模式。

有没有其他解决方案来解决这个问题。

+0

好的,你回答了你自己的问题......或者? – OzrenTkalcecKrznaric

+0

@OzrenTkalcecKrznaric,我不能那样做,我只是在这里简化了我的问题。假设我们有另一个可以调用proc1等不同proc的proc。我们不能去任何一个proc并附加模式,因为我们对每个proc都有多个模式。 – Jami

如果你可以在用户“范围”用你的架构(要知道,用户和架构在SQL Server是分开的),你可以不用它:

CREATE USER S1004 FOR LOGIN S1004 WITH DEFAULT_SCHEMA = S1004; 
GO 

CREATE PROCEDURE S1004.proc1 
WITH EXECUTE AS 'S1004' 
AS 
    EXECUTE proc2 
GO 

CREATE PROCEDURE S1004.proc2 
AS 
    SELECT 1 

EXEC S1004.proc1 

这里会发生什么事是,您使用具有相同名称的默认架构创建用户S1004。当在当前模式的范围内没有立即找到对象时,该模式将被搜索对象。

如果需要在过程中解析模式,请在该用户的上下文中运行该过程(请参阅WITH EXECUTE AS 'S1004'),并且模式解析将会成功。

但是,请注意,这会将执行范围更改为另一个用户。这是一种解决方法,但在这种情况下,它是最好的选择。

+0

谢谢。听起来是答案。你能解释一下最后一行吗?所以对于我们来说,一个schema proc只能在sa下运行或者其默认模式设置为proc模式的任何用户。这是否会导致你在那里提到的问题?我怀疑它的确如此。 – Jami

+0

你的方式,我相信它没有。或者,只要您可以控制/管理您创建的任何用户的特权,就不会发生这种情况。 – OzrenTkalcecKrznaric