假设我有一个名为MyDB的数据库,其中包含一个名为MyTable的表。我可以将其称为
MyDb.dbo.MyTable
但是,如果我在存储过程中执行此操作,然后使用其他名称部署数据库,则存储过程将不再有效。
如果我将其限定为
dbo.MyTable
然后它会工作,我可以将数据库命名为我想要的任何东西。但是,如果我不再知道在部署时将调用我的数据库,我就无法引用另一个数据库中的表。即我无法指定我真正想要的表是在另一个数据库中(在同一台服务器上),即
MyOtherDb.dbo.MyTable
这:http://www.sql-server-performance.com/2001/sql-best-practices/说
使用所有者的名称前缀表名,因为这会改进 可读性,避免任何不必要的混淆。 Microsoft SQL Server 联机丛书甚至声明使用所有者名称限定表名 帮助执行计划重用,进一步提升绩效。
我是SQL Server的新手,并不完全确定所有者是什么。此外,许多其他资源都要求提供完全合格的名称"应该使用,而不是完全符合他们的意思"完全合格的名字"。
对不起,如果这是一个愚蠢的问题,但这里的最佳做法是什么?我现在很清楚这一点,而不是三个月后为自己解决这个问题并进行大量的重构。谢谢!
答案 0 :(得分:3)
对同一数据库中的对象使用两个部件名称。
这意味着您可以使用不同的名称创建数据库的副本,而不必以三部分命名格式检查和更改数据库名称。
对于不同数据库中的对象,您需要使用三个部分名称(如果它是链接服务器,则需要四个)。
通常,您可以使用同义词来集中这些外部引用。这样可以更轻松地将它们重定向到开发中的其他位置。虽然同义词并不具备直接引用该对象的所有功能(例如TRUNCATE TABLE dbo.YourSynonym
或CREATE INDEX
引用同义词不起作用。)
答案 1 :(得分:0)
Sybase中的所有者(另一个DBMS)类似于SQL Server中的Schema。完全限定名称意味着以下内容:
ServerName.DatabaseName.SchemaName.TableName(即使您的本地计算机也可以使用简单的SQL语句尝试此操作)
因此,除非您的查询针对链接服务器,否则您需要的是后面的3(DatabaseName.SchemaName.TableName),并且您的查询将永远不会出现重复表名称的问题。
为了清楚你的想法,需要注意几点:
存储过程可以并且通常存储在它反对的用户数据库中,因此它知道第一部分(除非当然是针对多个数据库,甚至更糟糕的是针对多个链接服务器)
存储过程是架构绑定对象(如果未指定,则使用创建用户的默认架构)