Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL点表示法_Sql_Sql Server_Tsql_Syntax - Fatal编程技术网

SQL点表示法

SQL点表示法,sql,sql-server,tsql,syntax,Sql,Sql Server,Tsql,Syntax,有人能给我解释一下SQL Server是如何使用点符号来标识的吗 桌子的位置?我一直认为位置是Database.dbo.Table 但我看到代码中有其他东西代替了dbo,比如: DBName.something.Table 有人能解释一下吗 这是一个数据库架构。表的完整三部分名称为: databasename.schemaname.tablename 对于用户的默认架构,还可以省略架构名称: databasename..tablename 您还可以指定链接的服务器名称: servername

有人能给我解释一下SQL Server是如何使用点符号来标识的吗
桌子的位置?我一直认为位置是Database.dbo.Table
但我看到代码中有其他东西代替了
dbo
,比如:
DBName.something.Table

有人能解释一下吗

这是一个数据库架构。表的完整三部分名称为:

databasename.schemaname.tablename
对于用户的默认架构,还可以省略架构名称:

databasename..tablename
您还可以指定链接的服务器名称:

servername.databasename.schemaname.tablename
您可以在以下网站上阅读有关使用标识符作为表名的更多信息:

服务器、数据库和所有者名称称为对象名称的限定符。引用对象时,不必指定服务器、数据库和所有者。限定符可以通过在其位置上标记句号来省略。对象名称的有效形式包括:

服务器名称.数据库名称.模式名称.对象名称

服务器名称。数据库名称..对象名称

服务器名称..架构名称.对象名称

服务器名称…对象名称

数据库\u name.schema\u name.object\u name

数据库名称..对象名称

架构\名称。对象\名称

对象名称

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

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


@Szymon说了些什么。您还应始终注意模式限定对象引用(无论是表、视图、存储过程等)。非限定对象引用按以下方式解决:

  • 探测当前数据库的命名空间,以查找属于当前连接运行所依据的凭据的默认架构的指定名称的对象

  • 如果未找到,请在当前数据库的命名空间中查找属于
    dbo
    架构的指定名称的对象

如果对象引用的存储过程的名称以
sp_uu
开头,则情况更糟,因为解析过程中又添加了两个步骤(除非引用是符合数据库条件的):重复上述两个步骤,但这次是在数据库
master
中查找,而不是在当前数据库中查找

这样的查询

select *
from foo
需要两个命名空间探测来解析
foo
(假设表/视图实际上是
dbo.foo
):首先在默认模式下(
john_doe.foo
),然后在
dbo
dbo.foo
)下找不到,而

使用名称空间的单个探测立即解析

这有三个含义:

  • 冗余查找是昂贵的

  • 它禁止查询计划缓存,因为每次执行都必须重新计算,这意味着每次执行都必须重新编译查询(这会去掉编译时锁)

  • 在某个时刻,你会射中自己的脚,不经意间在默认模式下创建了一些在
    dbo
    模式下应该存在(或者已经存在)的东西。现在有两个版本在浮动

    在某个时刻,您或其他人(通常发生在生产环境中)将运行查询或执行存储过程,并得到……意外的结果。要弄清楚同一对象有两个[不同的]版本,需要花费相当长的时间,执行哪一个版本取决于它们的用户凭据以及引用是否符合模式

  • 除非你有真正的理由不这样做,否则一定要符合模式


    这就是说,为了开发目的,能够在您的个人模式下维护某事物的“新”版本,并在“dbo”模式下维护“当前”版本,这有时是有用的。它使并行测试变得容易。然而,这并非没有风险(见上文)。

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

    dbo
    只是一个模式,即数据库所有者拥有的默认模式。您可以在同一数据库中创建其他架构。因此,您将获得[linked_server].[database].[schema].[object],其中对象可以是表、视图、函数、存储过程等。此处提供的更多信息:仅供参考:我个人只使用默认的dbo模式;我想要区分表的唯一原因是将业务数据与配置和安全设置分开,以使刷新更干净;但是,我可能会使用多个数据库,因为我可能对配置和数据有不同的权限。@JohnLBevan您也可以使用架构来控制安全性,就像您可以向架构授予权限一样。
    select *
    from dbo.foo