至少在我的本地实例上,当我创建表时,它们都以“dbo”为前缀。那是为什么?
答案 0 :(得分:205)
dbo是SQL Server中的默认架构。您可以创建自己的模式,以便更好地管理对象名称空间。
答案 1 :(得分:78)
如果您使用的是Sql Server Management Studio,则可以通过浏览到数据库 - 数据库 - 安全 - 架构来创建自己的架构。
使用脚本创建一个就像(例如)一样简单:
CREATE SCHEMA [EnterSchemaNameHere] AUTHORIZATION [dbo]
您可以使用它们对表进行逻辑分组,例如为“财务”信息创建模式,为“个人”数据创建另一个模式。您的表格将显示为:
Financial.BankAccounts 金融交易 Personal.Address
而不是使用dbo的默认架构。
答案 2 :(得分:19)
它是SQL 2005的新增功能,它提供了一种简化的对象分组方式,特别是为了保护该“组”中的对象。
以下链接提供了更深入的解释,说明它是什么,为什么我们会使用它:
Understanding the Difference between Owners and Schemas in SQL Server
答案 3 :(得分:1)
Microsoft在2008版中引入了 schema 。对于那些不了解架构的人和不关心架构的人,将对象放入默认的架构dbo
中。>
dbo
代表数据库所有者,但这并不重要。
想一想架构,就像要放置一个文件文件夹一样:
您始终可以从任何架构访问任何对象。
由于dbo
是默认设置,因此通常不需要在单个数据库中指定它:
SELECT * FROM customers;
SELECT * FROM dbo.customers;
表示同一件事。
我倾向于不同意总是使用dbo.
前缀的概念,因为您越是使代码不必要的细节杂乱无章,则阅读和管理就越困难。
在大多数情况下,您可以忽略模式。但是,在以下情况下,该架构将很明显:
如果在对象导航器或外部应用程序(例如Microsoft Excel或Access)中查看表,则会看到dbo.
前缀。您仍然可以忽略它。
如果您引用另一个数据库中的表,则将需要其全名,格式为database.schema.table
:
SELECT * FROM bookshop.dbo.customers;
由于历史原因,如果编写用户定义的标量函数,则需要使用架构前缀来调用它:
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;
这不适用于其他对象,例如表函数,过程和视图。
您可以使用架构来克服命名冲突。例如,如果每个用户都有自己的架构,则他们可以创建其他对象,而不必与其他用户争夺名称。
答案 4 :(得分:0)
在SQL Server 2005之前,dbo被称为db的所有者,但在SQL Server 2005 dbo中,它仅引用了