Sql server 不同于表的存储过程的模式查找(错误?)

Sql server 不同于表的存储过程的模式查找(错误?),sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,如果在sql server中运行以下操作 CREATE SCHEMA [cp] GO CREATE TABLE [cp].[TestIt]( [ID] [int] NULL ) ON [PRIMARY] GO CREATE PROCEDURE cp.ProcSub AS BEGIN Print 'Proc Sub' END GO CREATE PROCEDURE cp.ProcMain AS BEGIN Print 'Proc Main' EXEC Proc

如果在sql server中运行以下操作

CREATE SCHEMA [cp]
GO

CREATE TABLE [cp].[TestIt](
    [ID] [int] NULL
) ON [PRIMARY]
GO

CREATE PROCEDURE cp.ProcSub
AS
BEGIN
    Print 'Proc Sub'
END
GO

CREATE PROCEDURE cp.ProcMain
AS
BEGIN
    Print 'Proc Main'
    EXEC ProcSub
END
GO

CREATE PROCEDURE cp.ProcMain2
AS
BEGIN
    Print 'Proc Main2'
    SELECT * FROM TestIt
END
GO

exec cp.ProcMain2
GO

exec cp.ProcMain
GO
你得到了错误

找不到存储过程“ProcSub”

这使得如果不将模式硬编码到执行调用中,就无法将过程划分为模式。这是设计造成的还是错误,因为先在过程模式中对表进行选择

如果有人有相关的工作,我很想听听,不过我的想法是,我可以给开发人员两个存储过程,它们可以互相调用,并可以放入他们喜欢的“他们的”数据库中的任何模式中,以便作为一个实用工具来查看同一数据库中另一个给定模式的对象


我想知道我是否可以用同义词来绕开它,但它们似乎也有同样的问题

这是出于设计,因为没有为调用过程的用户设置默认模式

当查询中未指定模式时,sql server将首先尝试默认模式,然后尝试dbo(如果不同)模式。因此,您需要设置默认模式或使用完全限定名创建过程

退房:

从SQLServer2005开始,每个用户都有一个默认模式。这个 可以使用默认模式设置和更改默认模式 创建用户或更改用户的选项。如果保留默认的_模式 未定义,数据库用户将使用dbo作为其默认模式


创建模式后,是否将用户的默认模式更改为cp?在执行过程中,上下文取自用户的默认模式,在您的情况下,该模式仍将设置为dbo,这就是为什么您要签署此错误。因此,要解决此问题,请使用“exec cp.prodsub”或更新用户。这就是关键所在,我不想更改用户的默认模式。这些需要是不同模式中的一组不同的对象,它们的工作方式应该与它们是不同模式中的表的工作方式相同。好的,如果您有一个用户(比如Jayesh)可以访问“cp”模式,那么您可以在声明后立即尝试以Jayesh的身份执行,以解决此问题。当然,你必须允许模仿。与DBA交谈,了解更多关于它的信息,以及DBA在使用它之前设置的任何特定限制。参考-如果创建两个具有不同结构和/或数据的等效表,如“TestIt”,一个在dbo中,另一个在cp模式中,将Exec ProcSub更改为select*from TestIt将首先选择cp模式中的表,如果不存在,将默认为dbo.TestIt版本,因此当用户具有默认模式时,我不认为这是出于设计。您所指的文章还建议您应该能够将整个对象集划分为不同的模式,并对每个对象设置不同的权限。拥有一个默认模式只是说这些是您将要使用的默认对象集,而不是说您被迫使用这些对象,或者应该被要求明确说明您使用的是哪个模式版本,它应该查看当前上下文。好吧,从2007年开始,它有一个“不会修复”的连接。因此,过程和表默认模式查找之间的不一致性是已知的,但到目前为止没有改变。因此,在确实存在不一致的情况下,存储过程的默认模式如何工作的方法被记录为:首先为用户使用默认模式,然后是dbo。此外,该线程还表明,由于缓存规则,它是通过过程设计的。总之,完全限定始终是避免误解和奇怪的上下文转换发生的最佳方法。默认情况下,在创建存储过程且不使用执行方式选项时,从第二个链接
,sql server将以调用它的用户的身份执行
——您可以通过创建一个拥有cp的用户
测试
,然后将您的过程
更改为EXEC作为“test”
,很容易看出这一点。然后它将使用cp模式。表之间存在不一致,这并不构成bug。