让我们说在多模式数据库中我们有这两个过程:
Create proc S1004.proc1
As
Exec proc2
GO
Create proc S1004.proc2
As
Select 1
然后,当我尝试从 sa 登录运行 proc1 时,sql发出错误:无法找到存储过程'proc2'。
我知道如果我们在proc1的主体中向proc2添加 schema ,那么它可以解析模式。
此问题是否有其他解决方案。
答案 0 :(得分:1)
如果您可以在'范围内使用您的架构'用户(请注意用户和模式在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'
),并且架构解析将成功。
但是,请注意这会将执行范围更改为其他用户。这是一种解决方法,但在这种情况下,它是你能得到的最好的。