我已经解决了语法问题,但我想知道是否有人可以提供一个说明性的用例,其中数据库同义词非常有用。
答案 0 :(得分:18)
在测试时非常适合暂存模拟表。例如,如果源表包含数百万条记录,并且您希望测试一小部分数据,则可以使用同义词将源表重定向到您控制的较小表,以便您可以进行各种场景。
通过这种方式,您可以更新/删除模拟表中的数据,而不会影响源表。当您准备使用源表时,您需要做的就是重新定义同义词。
答案 1 :(得分:10)
答案 2 :(得分:6)
我经常看到当DBA希望将数据库对象分成不同的模式时使用的同义词,但是希望/需要其他模式中的某些对象可见(但不希望直接访问它们)。
我最近见过的一个例子:同一家公司运营的几个网络应用程序。用户通常可以访问多个这些应用程序,并且只有一个用户帐户才能访问这些应用程序。用户帐户信息存储在USER_ACCOUNTS
架构中,所有其他应用程序都在自己的架构中,并通过同义词访问USER_ACCOUNTS
架构。
答案 3 :(得分:2)
当您在现有代码中硬编码数据库对象名称时。
使用同义词可能会让您免于重写旧代码的痛苦,有时来自多个来源,这些来源对表或数据库名称有自己的想法。
例如,我看到过为某些生产服务器编写的代码。编码器方便地对主表的名称test_data
进行了硬编码,这在他的工作站上运行良好。使用同义词而不是重写他的代码让我早早回家。
答案 4 :(得分:1)
说,当你需要编写一个写得不好的应用程序(不会发出ALTER SESSION SET CURRENT_SCHEMA
)来处理另一个模式时。
同义词主要用作此类案例的解决方法。使用正确编写的应用程序,您几乎不必使用它们。
答案 5 :(得分:1)
通常,在SQL或PL * SQL中嵌入模式名称是不好的做法。因此,如果您正在编写一些必须引用另一个模式中的表的代码,例如:“从OtherSchema.OtherTable中选择id”,最好定义表的同义词(为OtherSchema.OtherTable创建同义词OtherTable)并编写“select id”来自OtherTable“。
这样,如果OtherTable移动到另一个模式名称,或者您有另一个使用不同模式名称的系统安装,则可以重新定义同义词而不是更改代码。
通过重新定义同义词,它还可以用于在具有相同结构的两个模式之间切换代码。