如何从另一个模式

时间:2015-07-21 08:06:52

标签: sql-server database-schema

让我们说在多模式数据库中我们有这两个过程:

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

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

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

此问题是否有其他解决方案。

1 个答案:

答案 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'),并且架构解析将成功。

但是,请注意这会将执行范围更改为其他用户。这是一种解决方法,但在这种情况下,它是你能得到的最好的。