2014-01-28 52 views
12

有人请向我解释SQL Server如何使用点符号来识别
表的位置?我一直认为,该位置是Database.dbo.Table
但我看到有东西代替dbo别的,像代码:
DBName.something.Table 可有人请解释一下吗?SQL点符号

+7

'dbo'只是一个架构,即数据库所有者拥有的默认架构。您可以在同一个数据库中创建额外的模式。因此,您可以获得[linked_server]。[database]。[schema]。[object]其中对象可以是表,视图,函数,存储过程等。 – MatBailie

+0

更多信息请访问:http://stackoverflow.com/questions/1062075/why-do-table-names-in-sql-server-start-with-dbo – JohnLBevan

+0

仅供参考:我个人只使用默认的dbo模式;我可能想区分表的唯一原因是将配置和安全设置中的业务数据分离,以使刷新更清晰;但后来我可能会使用多个数据库,因为我可能对配置和数据拥有不同的权限。 – JohnLBevan

回答

26

这是一个数据库模式。表的全部三个部分的名称是:

databasename.schemaname.tablename 

对于用户的默认模式,你也可以省略架构名称:

databasename..tablename 

您还可以指定链接服务器名称:

servername.databasename.schemaname.tablename 

你可以阅读更多有关使用上MSDN标识符作为表名:

服务器,数据库和所有者名称被称为对象名称的限定符。当你引用一个对象时,你不必指定服务器,数据库和所有者。通过用一段时间标记他们的位置可以省略限定符。对象名称有效形式包括以下内容:

server_name.database_name.schema_name.object_name

server_name.database_name..object_name

server_name..schema_name.object_name

服务器名称... OBJECT_NAME

database_name.schema_name.object_name

database_name..object_n AME

schema_name.object_name

OBJECT_NAME

,指定所有四个部分被称为一个完全合格的名称的对象名。在Microsoft SQL Server中创建的每个对象都必须具有唯一的完全限定名称。例如,如果它们拥有不同的所有者,则可以在同一个数据库中有两个名为xyz的表。

大多数对象引用使用三部分名称。默认的server_name是本地服务器。默认的database_name是连接的当前数据库。默认的schema_name是提交语句的用户的默认模式。除非另行配置,否则新用户的默认模式是dbo模式。

4

@Szymon说了什么。您还应该总是提出模式限定对象引用(无论表,视图,存储过程等)。)未限定的对象引用解决以下方式:

  • 探头当前数据库中属于当前连接在其下运行的凭据的默认架构指定名称的对象的命名空间。

  • 如果未找到,请探测当前数据库的名称空间,以查找属于dbo模式的指定名称的对象。

而如果对象引用是名称以sp_,它的更坏,因为两个步骤被添加到解析过程的存储过程(除非引用是数据库修饰):上述两个步骤重复,但是这次,查看数据库master而不是当前数据库。

所以像

select * 
from foo 

查询需要命名的两个探头来解决foo(假设表/视图实际上是dbo.foo):首先你的默认架构(john_doe.foo)下,然后,没被发现下dbodbo.foo“),而

select * 
from dbo.foo 

立即与命名空间的单个探针解决。

这具有3个含义:

  1. 冗余的查找是昂贵的。

  2. 它抑制查询计划缓存,因为每个执行必须被重新评估,这意味着查询必须被重新编译为每个执行(和取出编译时锁)。

  3. 你会在某一点或另一个位置在自己的脚下拍摄自己,并在默认架构下无意中创建一些应该在dbo架构下存在(也许已经存在)的东西。现在你已经有了两个版本。

    在某些时候,您或其他人(通常发生在生产中)运行查询或执行存储过程并得到意外的结果。需要相当长的一段时间才能发现同一对象有两个[不同]版本,以及执行哪一个版本取决于他们的用户凭证以及引用是否符合模式限定。

总是符合模式限定,除非您有真正的理由不要。这就是说,为了开发的目的,有时可以保持个人模式下的“新”版本和“dbo”模式下的“当前”版本。它可以很容易地进行并行测试。然而,这并非没有风险(见上文)。

0

当SQL看到语法时,它将首先查看当前用户模式以查看表是否存在,如果存在,将使用该语法。 如果没有,那么它会查看dbo架构并使用该表中的表