【问题标题】:How to run a schema proc from another schema如何从另一个模式运行模式过程
【发布时间】:2015-07-21 08:06:52
【问题描述】:

假设在一个多模式数据库中,我们有这 2 个过程:

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

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

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

这个问题还有其他解决方案吗?

【问题讨论】:

  • 好的,你回答了你自己的问题......或者?
  • @OzrenTkalcecKrznaric,我不能这样做,我只是在这里简化了我的问题。假设我们有另一个 proc 可以调用不同的 proc,比如 proc1。我们不能转到任何单个 proc 并附加架构,因为每个 proc 也有多个架构。

标签: sql-server database-schema


【解决方案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'),架构解析将成功。

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

【讨论】:

  • 谢谢。听起来就是答案。你能再解释一下最后一行吗?所以对我们来说,schema proc 只能在 sa 或默认架构设置为 proc 架构的任何用户下运行。这会导致您在那里提到的问题吗?我怀疑它确实如此。
  • 按照你的说法,我相信它不会。或者,只要您可以控制/管理您创建的任何用户的权限,它就不会。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-18
  • 2017-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多