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

至少在我的本地实例上,当我创建表时,它们都带有“dbo.”前缀。为什么呢?

363369 次浏览

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

如果您正在使用Sql Server Management Studio,您可以通过浏览“数据库-您的数据库-安全性-模式”创建自己的模式。

使用脚本创建一个简单的方法如下(例如):

CREATE SCHEMA [EnterSchemaNameHere] AUTHORIZATION [dbo]

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

< p >金融。bankaccount 金融。交易 个人的。地址< / p >

而不是使用dbo的默认模式。

它是SQL 2005的新特性,提供了一种简化的对象分组方法,特别是为了保护“组”中的对象。

下面的链接更深入地解释了它是什么,为什么我们要使用它:

理解SQL Server中owner和schema的区别

微软在2005年版引入了模式。对于那些不了解模式的人,以及那些不在乎的人,对象被放入默认模式dbo中。

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

把模式想象成文件的文件夹:

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

通常可以从任何模式访问任何对象。但是,可以控制哪些用户拥有对特定模式的访问权限,因此可以在安全模型中使用模式。

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

SELECT * FROM customers;
SELECT * FROM dbo.customers;

意思相同。

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

在大多数情况下,您可以忽略模式。然而,在以下情况下,模式会很明显:

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

  2. 如果你引用另一个数据库中的表,你需要它的全名,格式为database.schema.table:

    SELECT * FROM bookshop.dbo.customers;
    
  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;
    

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

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

微软中的内容(文档)

dbo用户是每个数据库中的一个特殊用户主体。所有SQL Server管理员,sysadmin固定服务器角色的成员,sa登录用户,以及数据库的所有者,以dbo用户进入数据库。dbo用户拥有数据库中的所有权限,不能被限制或删除。dbo代表数据库所有者,但dbouser帐户与db_owner固定数据库角色不相同,并且db_owner固定数据库角色与记录为数据库所有者的用户帐户不相同。
dbo用户拥有dbo模式。dbo模式是所有用户的默认模式,除非指定了其他模式。dbo模式不能被删除。 dbo用户拥有dbo模式。dbo模式是所有用户的默认模式,除非指定了其他模式。

. dbo模式不能删除

DBO是SQL Server的默认模式。您可以创建自己的模式,以便更好地管理对象名称空间。作为最佳实践,我总是加上“DBO”。即使没有必要也要加上前缀。在SQL中,大多数情况下显式是很好的。