【问题标题】:How should table names be qualified in SQL Server 2012?SQL Server 2012 中的表名应该如何限定?
【发布时间】:2014-09-29 14:11:20
【问题描述】:

假设我有一个名为 MyDB 的数据库,其中包含一个名为 MyTable 的表。我可以参考这个

MyDb.dbo.MyTable

但是,如果我在存储过程中执行此操作,然后使用不同的名称部署数据库,则存储过程将不再工作。

如果我将其限定为

dbo.MyTable

然后它将起作用,我可以为数据库命名任何我想要的名称。但是如果我不再知道我的数据库在部署时会被调用什么,我就不能引用另一个数据库中的表。即我无法指定我真正想要的表在另一个数据库中(在同一台服务器上),即

MyOtherDb.dbo.MyTable

这个:http://www.sql-server-performance.com/2001/sql-best-practices/

在表名前加上所有者的名字,这样可以提高 可读性并避免任何不必要的混淆。微软 SQL 服务器 Books Online 甚至声明使用所有者名称来限定表名 有助于执行计划重用,进一步提高性能。

我是 SQL Server 新手,不完全确定所有者是什么。此外,许多其他资源都规定应使用“完全限定名称”,但并未准确说明“完全限定名称”的含义。

抱歉,这是一个愚蠢的问题,但这里的最佳做法是什么?我宁愿现在就知道这一点,也不愿在三个月后为自己解决这个问题并进行大量重构。谢谢!

【问题讨论】:

  • 坚持schema.TableName 格式。一旦你开始从你的数据库中引用其他数据库,你就会将它们紧密耦合在一起,避免这样做!
  • 对您的姓名进行限定是一种很好的做法。它将使您的 SQL 更具可读性,并且您将避免任何名称冲突或从错误数据库中提取的机会(似乎这永远不会发生,但它可以)。此外,IMO 开发和生产环境应尽可能紧密地镜像 - 这有助于保持这两个环境的稳定和可维护性。

标签: sql sql-server database


【解决方案1】:

对同一数据库中的对象使用两个部分名称。

这意味着您可以使用不同的名称创建数据库的副本,而不必通过三部分命名格式来更改数据库名称。

对于不同数据库中的对象,您需要使用三个部分名称(如果是链接服务器,则需要四个)。

您通常可以使用同义词来集中这些外部引用。这使得将它们重定向到开发中的不同位置更容易。虽然同义词并不完全具有直接引用对象所具有的所有功能(例如,TRUNCATE TABLE dbo.YourSynonymCREATE INDEX 引用同义词不起作用)。

【讨论】:

    【解决方案2】:

    Sybase(另一个 DBMS)中的所有者类似于 SQL Server 中的架构。通过完全限定名称,它们意味着以下内容:

    ServerName.DatabaseName.SchemaName.TableName(即使是您的本地计算机也可以使用简单的 SQL 语句尝试)

    所以,除非您的查询针对链接服务器,否则您只需要后面的 3 个 (DatabaseName.SchemaName.TableName),您的查询将永远不会遇到重复表名的问题。

    要理清思路,请注意以下几点:

    1. 存储过程可以并且通常存储在它所针对的用户数据库中,因此它知道第一部分(当然,除非它针对多个数据库,或者更糟糕的是针对多个链接服务器)

    2. 存储过程是模式绑定对象(如果未指定,则使用用户创建的默认模式)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-28
      • 1970-01-01
      • 2018-07-19
      • 2017-01-31
      • 1970-01-01
      • 2021-11-16
      • 2014-05-31
      相关资源
      最近更新 更多