我有一个不是dbo的默认架构,为什么该架构中的内容不总是被占用?

时间:2018-11-01 16:59:54

标签: sql security schema

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

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

我现在有机会创建所有这些内容,并决定测试我对SQL Server的工作方式的信念,并发现我认为是正确的,但仅在某些情况下才是。我希望这不是取决于情况的情况之一,我只是不理解。无论如何,我在dbo和cus模式中创建了7个非常简单的函数

创建函数[dbo]。[Function_X](@ Co int) 退货表 作为回报 ( 选择“ cus”作为sche,选择“ Function_X”作为fun,@ co 全部合并 从Function_X_X(1)中选择* )

除了dbo模式中的dbo和cus模式中的cus外,它们是相同的。这样,我知道从何处调用它们。我实际上尝试在扩展事件中执行此操作,但找不到执行此操作的方法,但我离题了。主要功能调用功能_1,功能_2,功能_3和功能_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,则即使在cus模式中存在函数2_1_1,它也会在dbo中运行。

示例2按预期执行,但是我不期望示例1或3的结果。我希望看到cus函数(如果存在)执行。在示例1中,cus模式中的所有功能都被忽略。在示例3中,未找到function_2_1时,它按预期在dbo中运行了一个,但随后又从dbo中运行了Function 2_1_1。

我在万维网上进行了无处不在的搜索,没有发现任何与我的问题有关的内容。我确实偶然发现了一篇有关架构所有者以及它们具有默认架构的事实的文章。 cus模式的所有者dbo和所有者的登录SA的默认模式均为dbo。考虑到可能会覆盖默认架构,我使用cus的默认架构创建了一个新的服务器登录名和数据库用户,并更改了cus架构的所有者。 las,结果没有变化。执行此操作时,我注销了服务器和/或重新启动了服务。我确实尝试过几次。我什至使用新的登录名创建了一个新的架构,但是得到了相同的结果。

有没有一种方法可以使SQL Server使用cus模式中的内容?我是否缺少设置,还是必须去创建所有这些额外的内容?

2 个答案:

答案 0 :(得分:0)

正确的答案是在创建对象和查询对象时始终始终用模式完全限定对象。依靠默认值会带来麻烦。

答案 1 :(得分:0)

来自以下位置的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 回答了我关于这种行为的问题。 “一旦进入模块内部,模块将确定不合格对象的默认架构,而不是当前用户的默认架构。”