如何从另一个架构运行模式PROC
比方说,在一个多模式的数据库,我们有这2个特效:如何从另一个架构运行模式PROC
Create proc S1004.proc1
As
Exec proc2
GO
Create proc S1004.proc2
As
Select 1
然后,当我尝试从SA登录时运行PROC1, sql发出错误:无法找到存储过程'proc2'。
我知道如果我们将模式添加到proc1主体中的proc2,那么它可以解析模式。
有没有其他解决方案来解决这个问题。
如果你可以在用户“范围”用你的架构(要知道,用户和架构在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'
),并且模式解析将会成功。
但是,请注意,这会将执行范围更改为另一个用户。这是一种解决方法,但在这种情况下,它是最好的选择。
谢谢。听起来是答案。你能解释一下最后一行吗?所以对于我们来说,一个schema proc只能在sa下运行或者其默认模式设置为proc模式的任何用户。这是否会导致你在那里提到的问题?我怀疑它的确如此。 – Jami
你的方式,我相信它没有。或者,只要您可以控制/管理您创建的任何用户的特权,就不会发生这种情况。 – OzrenTkalcecKrznaric
好的,你回答了你自己的问题......或者? – OzrenTkalcecKrznaric
@OzrenTkalcecKrznaric,我不能那样做,我只是在这里简化了我的问题。假设我们有另一个可以调用proc1等不同proc的proc。我们不能去任何一个proc并附加模式,因为我们对每个proc都有多个模式。 – Jami