我不明白表名/模式名之间有什么区别?因为我已经连接到AdventureWorks数据库,然后我写了这个查询。在这里,HR.Employee
是指一张表还是别的什么?
select * from HR.Employee
我认为这个问题是有效的,远非微不足道。这是一个大的视角。
通常,数据库对象由四个部分组成的名称标识。"servername"实际上是一个实例名。如果命名遵循命名标识符的规则,则括号是可选的。如果一个命名实例,括号是必需的,因为"";是不合法的。使用机器的FQDN的默认实例也需要括号,因为有句号。如果默认值是可以的,你不必指定所有的部分;但是,最佳实践是至少指定schema_name,即使它是dbo。我添加了一个链接,包含4部分的名称、标识符和所有权链接。
[server_name].[database_name].[schema_name].[object_name]
https://learn.microsoft.com/en-us/sql/t-sql/language-elements/transact-sql-syntax-conventions-transact-sql?view=sql-server-ver16
https://learn.microsoft.com/en-us/sql/relational-databases/databases/database-identifiers?view=sql-server-ver16
https://learn.microsoft.com/en-us/sql/relational-https://learn.microsoft.com/en - us/previous versions/sql/sql -服务器- 2008 r2/ms188676 (v = sql.105) ? redirectedfrom = MSDN
为了简化,可以考虑使用"服务器名"。作为包含数据库的实例。访问控制通过服务器登录和登录映射到数据库用户。
数据库有存储和操作数据的对象。访问数据库中任何对象的安全性在数据库中定义。数据库中使用的由4部分组成的名称可用于访问不同实例上的数据库中的对象。由3部分组成的名称可用于访问同一服务器上不同数据库中的对象。在任何一种情况下,都使用分布式事务。(我们有这样做的代码,支持它是一场噩梦。连接来自不同服务器或同一服务器上的不同数据库的表都有其各自的支持问题。
现在对于schema_name。假设您有两个相关的业务,它们共享大量数据和工作流,但需要保证某些数据的隔离。一个人为的例子:一个为地方检察官和公设辩护人存储数据的法庭申请。他们不相互信任,但假设他们同意不使用单独的服务器和单独的数据库,因为他们相信IT会隔离和保护他们的数据。IT部门非常乐意避免为应用程序编写使用两个数据库的代码,这可能会避免额外的工作(例如,复制、分布式事务、BizTalk、Mulesoft等)。开发人员可能更愿意使用链接服务器和分布式查询来将复杂性从开发转移到支持。相反,我们可以使用一个带有"DA"的数据库。在使用"数据表"one_answers"数据过程"时使用的模式。公设辩护人表和代码的模式。可以控制对每个模式的访问。
如果所有内容都是默认的"dbo"Schema, any "dbo"程序将有权访问所有"dbo"表,因为所有权链。所有权链不能跨模式应用。DA编码器可能会在DA过程中引用PD表或过程,但除非特别授予,否则他们无法访问PD。该模式允许将对象组彼此隔离,并添加了一层安全性来控制从一个模式到另一个模式的访问。如果您使用模式,认为它只是一个组织对象的容器,那么由于缺乏所有权链,它很快就会变得痛苦。与大多数SQL一样,这取决于情况。如果您需要满足安全需求,这可以避免痛苦。
如果你想要一个非常简短的答案,HR模式的存在是为了保护HR数据不被其他模式中的代码未经授权访问。