如何 运行 来自另一个模式的模式过程
How to run a schema proc from another schema
假设在多模式数据库中我们有这两个过程:
Create proc S1004.proc1
As
Exec proc2
GO
Create proc S1004.proc2
As
Select 1
然后,当我尝试从 sa 登录 运行 proc1 时,sql 发出错误:找不到存储过程 'proc2'。
我知道如果我们在proc1 的body 中给proc2 添加schema,那么它就可以解析schema。
这个问题还有其他解决办法吗
如果您可以在用户 'scope' 中使用您的模式(请注意,用户和模式在 SQL 服务器中是分开的),您可以摆脱这个:
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'
),架构解析将会成功。
但是请注意,这会将执行范围更改为另一个用户。这是一种解决方法,但在这种情况下,这是您可以获得的最佳方法。
假设在多模式数据库中我们有这两个过程:
Create proc S1004.proc1
As
Exec proc2
GO
Create proc S1004.proc2
As
Select 1
然后,当我尝试从 sa 登录 运行 proc1 时,sql 发出错误:找不到存储过程 'proc2'。
我知道如果我们在proc1 的body 中给proc2 添加schema,那么它就可以解析schema。
这个问题还有其他解决办法吗
如果您可以在用户 'scope' 中使用您的模式(请注意,用户和模式在 SQL 服务器中是分开的),您可以摆脱这个:
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'
),架构解析将会成功。
但是请注意,这会将执行范围更改为另一个用户。这是一种解决方法,但在这种情况下,这是您可以获得的最佳方法。