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