何时应该使用数据库同义词?

31

我已经掌握了语法,但我想知道是否有人可以提供一个很好的使用场景,说明数据库同义词的用处。


2
链接:http://www.dba-oracle.com/concepts/synonyms.htm - OMG Ponies
1
彻底无用的特性:http://vadimtropashko.wordpress.com/2012/12/12/synonyms-do-we-need-them/ - Tegiri Nenashi
6个回答

21

对于测试时的模拟表格,使用它非常出色。例如,如果您的源表包含数百万条记录,而您想测试数据的一个小子集,您可以使用同义词将源表重定向到您控制的较小表格,以便您可以进行各种场景的模拟。

这样,您可以更新/删除模拟表格中的数据,而不会影响源表。当您准备使用源表时,您只需要重新指向同义词即可。


当然,公共同义词允许您引用对象而无需使用模式.对象语法,从而提高PL/SQL和SQL代码的可读性。 - Darren Atkinson
2
@Darren Atkinson:公共同义词会增加名称冲突的可能性,如果您决定 consolide 数据库。 - Shannon Severance
关于包的使用,它们非常有用。最近我在应用程序中尝试访问一个包,即使执行授权也无法访问。但是创建同义词后,我就能够从应用程序中访问该包了。 - viveksinghggits

10

请查看Oracle有关同义词的文档

除了其他答案中提到的用途,同义词还常用于以下方面:

  • 为远程表提供易于使用的名称,例如通过数据库链接
  • 需要让所有用户都能够访问的表,即公共同义词

6

我通常看到同义词用于DBA希望将数据库对象分成不同模式,但希望/需要一些这些对象对其他模式可见(但不想直接访问它们)的情况。

最近我看到的一个例子:同一公司运行的多个Web应用程序。用户通常可以访问这些应用程序中的多个,并且他们只有一个用户帐户来访问这些应用程序。用户帐户信息存储在USER_ACCOUNTS模式中,所有其他应用程序都在自己的模式中,并通过同义词访问USER_ACCOUNTS模式。


3

当你在现有代码中硬编码数据库对象名称时。

使用同义词可能会避免重写旧代码的痛苦,有时这些代码来自多个源,而这些源有其自己的表或数据库名称。

例如,我曾经看到一段为某个生产服务器编写的代码。编写者方便地将主表的名称硬编码为 test_data,这在他的工作站上可以正常工作。使用同义词而不是重写他的代码让我提前回家了。


2
一般来说,在 SQL 或 PL*SQL 中嵌入模式名称是不好的实践。因此,如果您正在编写一些必须引用另一个架构中表的代码,比如 "select id from OtherSchema.OtherTable",最好定义表的同义词(create synonym OtherTable for OtherSchema.OtherTable),然后编写 "select id from OtherTable"。
这样,如果 OtherTable 移动到不同的模式名称,或者您有另一个使用不同模式名称的系统安装,只需重新定义同义词即可,而无需更改代码。
它还可以用于通过重新定义同义词在两个具有相同结构的模式之间切换您的代码。

1

比如说,当你需要让一个糟糕编写的应用程序(没有使用 ALTER SESSION SET CURRENT_SCHEMA)能够针对其他模式运行时。

同义词通常被用作这种情况下的解决方法。如果有一个正确编写的应用程序,你几乎不需要使用它们。


我不同意同义词对于“正确编写”的应用程序是无用的这一观点。我经常使用它们来避免在我的应用程序中硬编码模式名称。例如,我可能有一个视图连接两个表;如果我需要将其中一个表移动到另一个模式中,ALTER SESSION SET CURRENT_SCHEMA 将无法工作。 - Jeffrey Kemp

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