PostgreSQL中的同义词支持

5
如何在PostgreSQL中创建和使用同义词,就像在Oracle中一样。我需要创建某些DB链接或其他东西吗?我在这个主题上找不到任何好的官方文档。
编辑1:实际上,现在我有一个应用程序,它有两个不同的模块,连接到两个不同的Oracle数据库;一个模块需要访问其他表,因此我们在Oracle中使用db链接上的同义词。现在我们正在将应用程序迁移到PostgreSQL,所以我们需要同义词。
编辑2:当我说两个不同的Oracle数据库时,这意味着它可以是两个不同的Oracle实例或同一数据库的两个模式,在应用程序中可配置,并且应用程序必须支持两种模式。
PostgreSQL版本:9.6.3

3
这个链接可以帮助您理解。 - Frank
2
你为什么认为你需要它们?你试图解决的实际问题是什么? - user330315
@a_horse_with_no_name 我已经更新了问题 - Gajendra Kumar
DB Link的等价物将是一个带有外部数据包装器的外部表。 - user330315
3个回答

6

方法一:

最终我使用外部数据包装程序postgres_fdw使其工作,具体如下:我有两个数据库,分别为dba和dbb。dbb中有一个名为users的表格,我需要在dba中访问它。

CREATE SERVER myserver FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'localhost', dbname 'dbb', port '5432');



CREATE USER MAPPING FOR postgres  
SERVER myserver  
OPTIONS (user 'user', password 'password'); 

CREATE FOREIGN TABLE users (  
username char(1))
SERVER myserver  
OPTIONS (schema_name 'public', table_name 'users'); 

CREATE FOREIGN TABLE users (users char(1));

现在我可以在dba中执行所有的select/update查询。

方法2:- 可以通过在同一个数据库中创建两个模式来实现,以下是步骤:

  1. create two schemas ex app_schema, common_schema.
  2. Grant access:

    GRANT CREATE,USAGE ON SCHEMA app_schema TO myuser;
    GRANT CREATE,USAGE ON SCHEMA common_schema TO myuser;
    
  3. Now set search path of user as below

    alter user myuser set search_path to app_schema,common_schema;
    

现在,common_schema中的表将对myuser可见。例如,假设我们在common_schema中有一个名为"user"的表和一个名为"app_schema"的表,则以下查询将轻松运行:

select * from user;
select * from app;

这类似于Oracle中的同义词。

注意- 上述查询仅适用于PostgreSQL 9.5.3及以上版本。


4

我认为在Postgres中不需要像在Oracle中那样使用同义词,因为与Oracle不同,Postgres中用户和模式之间有着明确的区分。这不是一对一的关系,多个用户可以轻松地使用多个模式,而不需要通过利用Postgres的“搜索路径”功能来完全限定对象- mydb.public.mytable


那么如何从一个数据库访问另一个数据库中的表格呢? - Gajendra Kumar
按搜索路径前缀 - 1ac0
通过像 SELECT thing FROM otherdb.public.sometable 这样的引用来引用 @gajendrakumar。当然,您首先必须授予权限。 - coladict
你的意思是我不能这样做。我刚试了一下,出现了这个错误 ERROR: cross-database references are not implemented。看起来这是一个预期的特性。 - coladict
是的,那是一个笔误,@a_horse_with_no_name 的意思是你不能引用不同数据库中的表,否则你会得到上面发布的错误。这意味着如果你真的在不同的数据库中工作,而不仅仅是不同的模式,这个技巧就行不通了。 - xzilla

2
如果在PostgreSQL中表格也应该位于不同的数据库中,您可以使用外部数据包装器创建一个外部表。
如果您只是为了避免编写atable@dblink而使用Oracle同义词,在PostgreSQL中您无需进行任何操作,因为外部表在PostgreSQL中看起来和感觉就像本地表一样。
如果您使用同义词进行其他目的,您可以将search_path设置为包括目标表所在的模式,或者您可以创建一个简单的视图,只从目标表中选择所有内容。

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