SQL Server架构有什么好处?

我不是初学者使用SQL数据库,特别是SQL Server。 然而,我一直主要是一个SQL 2000的家伙,2005年我总是被模式困惑。 是的,我知道模式的基本定义,但是他们在典型的SQL Server部署中真正使用了什么?

我一直使用默认模式。 我为什么要创build专门的模式? 为什么要分配任何内置模式?

编辑:澄清,我想我正在寻找模式的好处。 如果你只是把它作为一个安全scheme,似乎数据库angular色已经填补了..呃..呃..angular色。 使用它作为一个命名空间的sepcifier似乎是你可以用所有权(dbo与用户等)完成的事情。

我想我在做什么,Schemas做什么,你不能和业主和angular色做什么? 他们具体的好处是什么?

模式逻辑上将表,过程,视图组合在一起。 employee模式中的所有员工相关对象等

您也可以仅授予一个模式的权限,以便用户只能看到他们有权访问的模式,而没有别的。

就像C#代码的命名空间一样。

它们也可以为插件数据提供一种命名碰撞保护。 例如,SQL Server 2008中新的“更改数据捕获”function将其使用的表放入单独的cdc模式中。 这样,他们就不用担心CDC表和数据库中使用的实际表之间的命名冲突,因此可以故意隐藏真实表的名称。

我知道这是一个古老的线程,但我只是自己研究模式,并认为以下可能是模式使用的另一个很好的候选人:

在Datawarehouse中,数据来自不同的来源,您可以为每个来源使用不同的模式,然后根据模式控制访问。 也避免了各种来源之间可能的命名冲突,正如另一张海报上面所回答的。

如果保持模式不连续,那么可以通过将给定模式部署到新的数据库服务器来扩展应用程序。 (这假定你有一个足够大的应用程序或系统来具有不同的function)。

举一个例子,考虑一个执行日志logging的系统。 所有日志logging表和SP都位于[logging]模式中。 日志logging是一个很好的例子,因为系统中的其他function很less(如果曾经)会在日志logging模式中重叠(即连接)对象。

使用这种技术的提示 – 在应用程序/系统中为每个模式使用不同的连接string。 然后,将模式元素部署到新服务器,并在需要缩放时更改连接string。

我没有看到与绑定Schema的用户混淆的好处。 这是为什么….

大多数人最初通过angular色将他们的用户帐户连接到数据库,只要您以任何forms将用户分配给sysadmin或数据库angular色db_owner,该帐户就会被别名为“dbo”用户帐户,或者已满数据库的权限。 一旦发生这种情况,无论您如何将自己分配给超出默认架构(与您的用户帐户名称相同)的计划,这些dbo权限都会分配给您在用户和架构下创build的那些对象。 它有点没有意义…..只是一个命名空间,混淆了这些对象的真正所有权。 如果你问我的话,它的devise很糟糕……不pipe是谁devise的。

他们应该做的是创build“组”,并抛出模式和angular色,只允许你以任何你喜欢的组合来分层组,然后在每一层告诉系统权限是inheritance,拒绝还是用自定义覆盖那些。 这将会更加直观,并且允许DBA更好地控制真正的所有者在这些对象上的身份。 现在它的默示在大多数情况下dbo默认SQL Server用户有这些权利….不是用户。

在我工作了很多年的ORACLE商店中,模式被用来封装应用于不同前端应用程序的程序(和包)。 对于每个应用程序来说,不同的“API”模式通常是有意义的,因为用例,用户和系统需求是完全不同的。 例如,一个“API”模式仅适用于开发人员使用的开发/configuration应用程序。 另一个“API”模式是通过视图和过程(search)访问客户端数据。 另一个“API”模式封装的代码,用于同步开发/configuration和客户端数据与拥有自己的数据库的应用程序。 这些“API”模式中的一些模式,在它们有意义的地方,仍然会与其他“共同”模式共享相同的程序和function。

我会说,没有一个架构可能不是世界末日,尽pipe它可能是非常有帮助的。 实际上,在SQL Server中缺less软件包确实会在我的脑海中产生问题…但这是一个不同的主题。

我认为架构就像很多新的function(无论是SQL Server还是其他软件工具)。 您需要仔细评估将其添加到您的开发套件中的好处是否抵消了devise和实施过程中简单性的损失。

它看起来像模式大致相当于可选的命名空间。 如果您遇到对象名称冲突,权限粒度不够好的情况,请使用以下工具。 (我倾向于说,可能会有devise问题,首先应该在更基础的层面上处理。)

问题可能在于,如果有的话,一些开发者会随便开始使用它来获得短期的利益; 一旦它在那里它可以成为葛藤。

我倾向于同意布伦特在这一个…在这里看到这个讨论。 http://www.brentozar.com/archive/2010/05/why-use-schemas/

总之…模式是不好的。 使事情混乱。 除非是非常特殊的情况,否则不要使用它们。 并尝试遵守K(eep)I(t)S(实施)S(tupid)规则。

在SQL Server 2000中,创build的对象被链接到特定的用户,比如说如果用户说Sam创build一个对象,比如Employees,那么这个表就像Sam.Employees一样。 如果山姆离开公司或者转移到其他业务领域呢? 一旦你删除了用户Sam,Sam.Employees表会发生什么? 也许,你将不得不把所有权首先从Sam.Employees改为dbo.Employess。 Schema提供了一个解决scheme来解决这个问题。 山姆可以在模式中创build他的所有对象,如Emp_Schema。 现在,如果他在Emp_Schema中创build了一个对象Employees,那么该对象将被称为Emp_Schema.Employees。 即使用户账户Sam需要删除,架构也不会受到影响。

开发 – 我们的每个开发者都有自己的模式作为沙盒来玩。