我有一个不是dbo的默认模式,为什么该模式中的内容不总是被使用



我在一家为大约80名客户提供软件的公司工作,为期8个月。其中一位所有者通知我,我现在也是DBA。在我来到这里之前,我的SQL Server经验主要是在ETL和BI领域,我不介意学习,所以我深入研究。我们的基本内容、存储过程、函数、视图等都存储在dbo模式中。当我们为客户创建自定义内容时,它会被放置在cus模式中。在消费内容时,我们不使用模式指定。有人告诉我,我们的客户使用单个用户访问数据库,访问安全性在应用程序中处理,该用户的默认模式为cus。我们的客户使用的sql server版本从2008 R2到2014,大多是标准版或快速版。

我的问题是这个。如果我为客户更改了基本代码dbo模式,并将其保存在cus模式中,那么我还需要为调用cus模式调用堆栈中该对象的所有对象创建一个对象,否则它将不会被调用。当我第一次被告知这一点时,我觉得可以,但如果你这么说的话,那就没有意义了。我的想法是,如果内容在默认模式cus中,那么它将被执行,因为SQL Server在查看dbo模式之前会先查看那里。

我现在有机会创建所有这些内容,并决定测试我对SQL Server工作方式的看法,发现我相信的是真的,但只是有时。我希望这不是一种取决于情况的情况,我只是不理解。不管怎样,我在dbo和cus模式中创建了7个非常简单的函数,比如这个

创建函数[dbo]。[函数_X](@Co-int(退货表作为回报(选择"cus"作为sche,选择"Function_X"作为fun,选择@co作为passed联合所有从Function_X_X(1(中选择*)

除了dbo模式中的dbo和cus模式中的cus之外,它们是相同的。这样我就知道他们是从哪里来的。事实上,我试着在扩展事件中这样做,但找不到这样做的方法,但我跑题了。主函数调用function_1、function_2、function_3和function_4。Function_2调用Function_2_1,调用Function_2_1_1,请参见下文。

Function  
Function_1  
Function_2          
Function_2_1              
Function_2_1_1     
Function_3      
Function_4

通过重命名不同模式中的各种函数,使它们不会被调用,我能够看到哪些函数在哪个模式中执行。结果并不是我所期望的。

1如果初始函数不在cus模式中,则cus模式中将不运行任何函数
2暂时忽略函数2_1和2_1_1,当初始函数在cus模式中时,如果四个函数1-4存在,它们将从cus模式运行,否则它们从dbo运行,所以我将根据存在的函数获得cus和dbo模式的混合
3如果在cus中找不到函数2_1,则它在dbo中运行,函数2_1_1也是如此,即使它存在于cus模式中。

示例2按预期执行,但是我没有想到示例1或3的结果。如果cus函数存在,我希望看到它执行。在示例1中,cus模式中的所有函数都被忽略了。在示例3中,当未找到函数2_1时,它按预期运行dbo中的函数,但随后它也从dbo运行函数2_1_1。

在万维网上搜索,我找不到任何与我的问题有关的东西。我偶然发现了一篇帖子,其中谈到了模式的所有者以及他们有默认模式的事实。cus模式的所有者dbo和所有者的登录SA的默认模式都是dbo。考虑到这可能会覆盖默认模式,我使用默认模式cus创建了一个新的服务器登录和数据库用户,并更改了cus模式的所有者。遗憾的是,结果没有变化。执行此操作时,我注销了服务器和/或重新启动了服务。我确实尝试过好几次。我甚至使用新登录创建了一个新的模式,但得到了相同的结果。

有没有一种方法可以让SQL Server使用cus模式中的内容?我是错过了一个设置,还是必须去创建所有额外的内容?

正确的答案是在创建和查询对象时始终使用模式完全限定对象。依赖违约是自寻烦恼。

Erland Sommarkskog的响应,位于此处:https://social.msdn.microsoft.com/Forums/en-US/73678fa7-0b9c-4780-ae16-197bd30aba3a/i-have-a-default-schema-that-is-not-dbo-why-is-the-content-in-that-schema-not-always-consumed?forum=sqlsecurity回答了我关于这种行为的问题。"一旦你进入一个模块,它就决定了不合格对象的默认模式,而不是当前用户的默认模式。">

相关内容

  • 没有找到相关文章

最新更新