【发布时间】:2018-11-01 16:59:53
【问题描述】:
我在一家公司工作了 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 之外,它们是相同的。这样我就知道他们是从哪里来的。我实际上试图在扩展事件中这样做,但找不到这样做的方法,但我离题了。主函数调用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 如果函数 2_1 在 cus 中没有找到,那么它会像函数 2_1_1 一样在 dbo 中运行,即使它存在于 cus 模式中。
示例 2 按预期执行,但我没想到示例 1 或 3 的结果。我希望看到 cus 函数(如果存在)执行。在示例 1 中,cus 模式中的所有函数都被忽略了。在示例 3 中,当未找到 function_2_1 时,它按预期在 dbo 中运行该函数,但随后它也从 dbo 运行 Function 2_1_1。
在万维网上进行了广泛的搜索,我看不到任何与我的问题相关的内容。我确实偶然发现了一篇文章,其中谈到了架构的所有者以及他们拥有默认架构的事实。 cus 架构的所有者 dbo 和所有者的登录 SA 的默认架构都是 dbo。考虑到可能会覆盖默认模式,我使用默认模式 cus 创建了一个新的服务器登录和数据库用户,并更改了 cus 模式的所有者。唉,结果没有变化。执行此操作时,我注销了服务器和/或重新启动了服务。我确实尝试过几次。我什至使用新登录名创建了一个新架构,但得到了相同的结果。
有没有办法让 SQL Server 使用 cus 架构中的内容?我错过了一个设置还是我必须去创建所有这些额外的内容?
【问题讨论】: