同义词的作用是什么?

52

SYNONYM在SQL Server 2008中的作用是什么?

7个回答

72
在一些企业系统中,您可能需要处理没有控制权的远程对象。例如,由另一个部门或团队维护的数据库。
同义词可以帮助您将基础对象的名称和位置与SQL代码分离开来。这样,即使您想要的表被移动到新的服务器/数据库或重命名,您也可以针对同义词表编写代码。
例如,我可以编写这样一个查询:
insert into MyTable
(...)
select ... 
from remoteServer.remoteDatabase.dbo.Employee

但是如果服务器、数据库、模式或表发生更改,那么我的代码就会受到影响。相反,我可以为远程服务器创建一个同义词,然后使用该同义词:

insert into MyTable
(...)
select ... 
from EmployeeSynonym
如果基础对象的位置或名称发生更改,我只需要更新我的同义词指向新对象即可。 http://www.mssqltips.com/sqlservertip/1820/use-synonyms-to-abstract-the-location-of-sql-server-database-objects/

我能否使用像这样的函数(Select IDENT_CURRENT('<Synonym name>'))来了解插入行的当前标识值?我不想通过该表的max(ID)来获取标识值。这可行吗? - ivorykoder
使用同义词在访问远程服务器时是否会影响性能? - Sam Cohen-Devries
1
@Samcd 不是。欲了解更多信息,请参见此讨论http://www.sqlservercentral.com/Forums/Topic1427405-391-1.aspx - FistOfFury

14

同义词提供了很好的抽象层,允许我们使用友好和/或本地名称来代替冗长命名或远程表、视图、过程和函数。

例如

假设你有Server1ABC作为dbschema以及Employee作为表名称,现在您需要访问Server2中的Employee表以执行查询操作。

因此,您必须使用Server1.ABC.Employee这样的方式,它公开了所有的ServerName、SchemaName和TableName。

相反,您可以创建一个同义词链接:Create Synonym EmpTable for Server1.ABC.Employee

然后,您可以像这样访问:Select * from Peoples p1 inner join EmpTable emp where emp.Id=p1.ID

因此它提供了抽象、易于更改、可伸缩性等优点。

如果以后您想要更改服务器名称、模式或表名称,只需更改同义词即可,无需搜索并替换它们。

如果您使用它,就可以感受到同义词的真正优势。它还可以与链接服务器组合使用,并为开发人员提供更多优势。


使用同义词在访问远程服务器时是否会影响性能? - Sam Cohen-Devries

5
似乎(来自这里)创建另一个表的别名,以便您可以轻松地引用它。就像这样:select * from table longname as ln,但是永久且普遍。 编辑:适用于用户定义的函数、本地和远程对象,不仅仅是表格。

5
这个功能的实用性举例来说,如果您在一个用户数据库上有一个存储过程需要访问另一个生产服务器上的客户端表,则可以设置同义词。假设您在用户数据库中创建了存储过程,则可能想要设置以下同义词: USE Users; GO CREATE SYNONYM Clients FOR Offsite01.Production.dbo.Clients; GO 现在,在编写存储过程时,您只需使用别名Clients即可访问表,而不必每次都写出整个别名。此外,如果您曾经改变了生产数据库位置或名称,您只需要修改一个同义词,而不是修改所有引用旧服务器的存储过程。
来源: http://blog.sqlauthority.com/2008/01/07/sql-server-2005-introduction-and-explanation-to-synonym-helpful-t-sql-feature-for-developer/

4

我一直是一个长期使用Oracle的开发者,现在正在转向SQL Server。

但是,在开发周期中,另一个伟大的同义词用途是。如果有多个开发人员修改同一个模式,您可以使用同义词来指向自己的模式,而不是直接修改“生产”表。这样,您可以进行您的操作,而其他开发人员在您进行修改和调试时不会受到影响。

我很高兴看到这些在SQL Server 2008中...


4

同义词是一个数据库对象,具有以下用途:

  • 为另一个数据库对象(称为基本对象)提供替代名称,可以存在于本地或远程服务器上。
  • 提供一层抽象,保护客户端应用程序免受对基本对象名称或位置的更改影响。

我从未需要第一个,但第二个问题相当有帮助。

msdn是你的朋友


3

您可以在空数据库中创建同义词,并将其引用到另一个数据库中的对象,从而使其在完全空的数据库中正常工作(除了您创建的同义词)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接