Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 什么时候应该使用数据库同义词?_Sql_Oracle_Database Design_Plsql_Synonym - Fatal编程技术网

Sql 什么时候应该使用数据库同义词?

Sql 什么时候应该使用数据库同义词?,sql,oracle,database-design,plsql,synonym,Sql,Oracle,Database Design,Plsql,Synonym,我已经记下了语法,但我想知道是否有人能提供一个说明性的用例,其中数据库同义词非常有用。比如,当您需要编写一个写得不好的应用程序(它不会发出ALTER SESSION SET CURRENT_SCHEMA)来针对另一个模式工作时 同义词主要用于解决类似情况。使用正确编写的应用程序,您几乎不必使用它们。当您在现有代码中硬编码数据库对象名称时 使用同义词可以省去重写旧代码(有时来自多个源代码)的痛苦,因为这些代码对表或数据库名称有自己的想法 例如,我看到了为某个生产服务器编写的代码。编码器方便地硬编码

我已经记下了语法,但我想知道是否有人能提供一个说明性的用例,其中数据库同义词非常有用。

比如,当您需要编写一个写得不好的应用程序(它不会发出
ALTER SESSION SET CURRENT_SCHEMA
)来针对另一个模式工作时


同义词主要用于解决类似情况。使用正确编写的应用程序,您几乎不必使用它们。

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

使用同义词可以省去重写旧代码(有时来自多个源代码)的痛苦,因为这些代码对表或数据库名称有自己的想法


例如,我看到了为某个生产服务器编写的代码。编码器方便地硬编码了主表的名称为
test\u data
,这在他的工作站上运行良好。使用同义词而不是重写他的代码让我很早就明白了。

当DBA希望将数据库对象分离到不同的模式中,但希望/需要其中一些对象对其他模式可见(但不希望直接访问它们)时,我通常会使用同义词


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

它非常适合在测试时暂存模拟表。例如,如果源表包含数百万条记录,并且您希望测试一小部分数据,则可以使用同义词将源表重新定向到您控制的较小表,以便可以进行各种场景

通过这种方式,您可以在不影响源表的情况下更新/删除模拟表中的数据。当您准备好使用源表时,只需重新定向同义词。

请查看

除了这里的其他答案外,它们还常用于:

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

通常,在SQL或PL*SQL中嵌入模式名称是一种不好的做法。因此,如果您正在编写一些代码,这些代码必须引用另一个模式中的表,例如:“从OtherSchema.OtherTable中选择id”,那么最好为该表定义一个同义词(为OtherSchema.OtherTable创建同义词OtherTable)并编写“从OtherTable中选择id”

这样,如果OtherTable移动到不同的架构名称,或者您有另一个使用不同架构名称的系统安装,您可以重新定义同义词,而不是更改代码


通过重新定义同义词,它还可以用于在两个具有相同结构的模式之间切换代码。

Link:完全无用的功能:当然,公共同义词允许您在不需要架构的情况下引用对象。对象语法提高了PL/SQL和SQL代码的可读性。@Darren Atkinson:如果您决定合并数据库,公共同义词会增加名称合并的可能性。它们在包中有多大的用处,最近,我无法从我的应用程序访问包,即使存在execute grant。创建同义词后,我可以从应用程序访问包。我不同意同义词对于“正确编写”的应用程序是无用的。我一直在使用它们,以避免在应用程序中硬编码模式名称。例如,我可能有一个连接两个表的视图;如果需要将其中一个表移动到另一个模式,
ALTER SESSION SET CURRENT_schema
将不起作用。