为什么SQL Server中的表名以"dbo"开头?

pup*_*eno 276 sql-server

至少在我的本地实例上,当我创建表时,它们都以"dbo"为前缀.这是为什么?

Dan*_*iel 217

dbo是SQL Server中的默认架构.您可以创建自己的模式,以便更好地管理对象名称空间.

  • 作为最佳实践,我总是添加"dbo".前缀即使没有必要.在SQL中大部分时间都是明确的. (22认同)
  • [本文](http://www.sqlteam.com/article/understanding-the-difference-between-owners-and-schemas-in-sql-server)来自[不同答案](http:// stackoverflow. com/a/10118197/39396)声称它实际上是一种最佳实践:"代码不必使用完全限定的名称,尽管这样做会有轻微的性能提升,并且被认为是最佳实践." (13认同)
  • 此外,您链接的[答案](http://stackoverflow.com/a/769639/602245)也建议包括"dbo".这样优化器就不必查找架构了. (7认同)
  • dbo不是一个好习惯.创建自己的架构并始终使用它.dbo只存在一个迁移技巧,因此SQL Server 2005之前仍然可以继续工作.是的,始终使用perf的架构.不,不是迁移(例如dbo). (6认同)
  • @SurroundedByFish:可能不是最佳实践,但我可能错了,因为我不是SQL专家.http://stackoverflow.com/a/769639/602245 (3认同)

Fen*_*ton 81

如果您使用的是Sql Server Management Studio,则可以通过浏览到数据库 - 数据库 - 安全 - 架构来创建自己的架构.

使用脚本创建一个就像(例如)一样简单:

CREATE SCHEMA [EnterSchemaNameHere] AUTHORIZATION [dbo]
Run Code Online (Sandbox Code Playgroud)

您可以使用它们对表进行逻辑分组,例如,通过为"财务"信息创建模式,为"个人"数据创建另一个模式.您的表格将显示为:

Financial.BankAccounts Financial.Transactions Personal.Address

而不是使用dbo的默认架构.

  • 您可以将模式与实体框架一起使用 - 如果您愿意,可以先使用代码:`[Table("Customer",Schema ="MySchema")]` (5认同)

Jaa*_*ans 21

它是SQL 2005的新增功能,它提供了一种简化的对象分组方式,特别是为了保护该"组"中的对象.

以下链接提供了更深入的解释,说明它是什么,为什么我们会使用它:

了解SQL Server中所有者和架构之间的区别


Man*_*ngo 11

Microsoft在 2008 版本中引入了schema。对于不了解 schema 的人和不关心的人,将对象放入默认 schema 中dbo

dbo 代表数据库所有者,但这并不重要。

将架构视为文件文件夹:

  • 如果对象在相同或默认架构中,则不需要引用架构
  • 您可以通过使用架构作为前缀来引用不同架构中的对象,就像引用不同文件夹中的文件一样。
  • 在一个模式中不能有两个同名的对象,但可以在不同的模式中
  • 使用模式可以帮助您组织更多的对象
  • Schema 还可以分配给特定的用户和角色,因此您可以控制对谁可以做什么的访问。

您始终可以从任何架构访问任何对象。

因为dbo是默认值,您通常不需要在单个数据库中指定它:

SELECT * FROM customers;
SELECT * FROM dbo.customers;
Run Code Online (Sandbox Code Playgroud)

意思是一样的。

我倾向于不同意总是使用dbo.前缀的概念,因为代码中不必要的细节越混乱,阅读和管理就越困难。

大多数情况下,您可以忽略架构。但是,模式将在以下情况下变得明显:

  1. 如果您在对象导航器或外部应用程序(如 Microsoft Excel 或 Access)中查看表,您将看到dbo.前缀。你仍然可以忽略它。

  2. 如果您引用另一个数据库中的表,则需要采用以下形式的全名database.schema.table

    SELECT * FROM bookshop.dbo.customers;
    
    Run Code Online (Sandbox Code Playgroud)
  3. 由于历史原因,如果您编写用户定义的标量函数,则需要使用架构前缀调用它:

    CREATE FUNCTION tax(@amount DECIMAL(6,2) RETURNS DECIMAL(6,2) AS
    BEGIN
        RETURN @amount * 0.1;
    END;
    GO
    SELECT total, dbo.tax(total) FROM pricelist;
    
    Run Code Online (Sandbox Code Playgroud)

    这不适用于其他对象,例如表函数、过程和视图。

您可以使用架构来克服命名冲突。例如,如果每个用户都有一个个人模式,他们就可以创建额外的对象,而不必与其他用户争夺名称。