PostgreSQL Oracle 兼容性 - synonym 匿名

本文涉及的产品
RDS PostgreSQL Serverless,0.5-4RCU 50GB 3个月
推荐场景:
对影评进行热评分析
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介:

标签

PostgreSQL , 匿名 , synonym


背景

Oracle 的一个功能,支持对其他对象建立别名(匿名:synonym),它有什么用呢?

比如某些业务系统中,代码中写死了要访问的对象是在哪个用户下的。当迁移时,如果遇到用户名冲突,我们可能会选择将对象同步到其他用户下。那么问题来了,程序也要改动,如果是很老的程序,估计找不到人来做这件事情。用synonym(匿名)可以很好的解决这个问题。

匿名语法如下

CREATE [ OR REPLACE ] [ PUBLIC ] SYNONYM  
   [ schema. ]synonym   
   FOR [ schema. ]object [ @ dblink ] ;  
AI 代码解读

https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_7001.htm

对于状态可变的对象(例如表、序列)来说,匿名可以使用类似于指针引用的方法来实现。对于状态不可变的对象(例如函数、视图),匿名可以拷贝的方式来实现。实际上没有永久不变的东西,函数内容,视图的结构都是可能变化的。

下面给出一些例子,在PostgreSQL中如何实现synonym(非内核实现)。

PostgreSQL synonym的方法

我们可以对多种对象建立匿名,方法各异。

1、表

代码写死了b.tbl123:

create table a.tbl(id int);  
AI 代码解读

通过视图,

create view b.tbl123 as select * from a.tbl;  
  
这种简单视图,支持增删改查,和直接使用a.tbl是一样的。  
  
相当于建立了a.tblb.tbl123匿名。  
AI 代码解读

通过search_path,

如果对象名没变,只是在不同的schema下,使用search_path是最通用的方法:

set search_path=a,"$user",public;  
  
那么会先访问a这个schema下的对象。  
AI 代码解读

2、函数

代码写死了b.fun123:

create or replace function a.fun(int) returns int as $$  
....  
$$ language plpgsql strict;  
AI 代码解读

通过函数嵌套,

create or replace function b.fun123(int) returns int as $$  
select a.fun($1);  
$$ language sql strict;  
AI 代码解读

通过search_path,与1类似。

3、视图

通过视图,与1类似。

通过search_path

4、物化视图

通过视图,与1类似。

通过search_path,与1类似。

5、DBLINK

通过重定义一样的dblink。

通过search_path,与1类似。

6、外部表

通过视图,与1类似。

通过search_path,与1类似。

7、自定义类型

通过重定义一样的类型。

通过search_path,与1类似。

8、序列

如果名字改变,可以通过覆盖nextval,setval,currval来实现,例子

create or replace function nextval(name) returns int8 as $$  
declare  
  res int8;  
begin  
  if $1='目标seq对象名字' then  
    select pg_catalog.nextval('已存在seq对象'::regclass) into res;  
  else  
    select pg_catalog.nextval($1::regclass) into res;  
  end if;  
  return res;  
end;  
$$ language plpgsql strict;  
AI 代码解读
postgres=# select nextval('已存在seq对象');  
 nextval   
---------  
       1  
(1 row)  
  
postgres=# select nextval('目标seq对象名字');  
 nextval   
---------  
       2  
(1 row)  
  
postgres=# select nextval('已存在seq对象');  
 nextval   
---------  
       3  
(1 row)  
AI 代码解读

如果只是search_path的问题,通过search_path解决,与1方法类似。

内核实现

内核实现当然是最好的,很早以前社区有提过这样的PATCH,有兴趣的同学可以考虑把它port到PG最新的版本来。

https://www.postgresql.org/message-id/440D446E.7040509@cybertec.at

使用了类似HOOK的方法。

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
打赏
0
0
0
0
20695
分享
相关文章
PolarDB PostgreSQL版:Oracle兼容的高性能数据库
PolarDB PostgreSQL版是一款高性能的数据库,具有与Oracle兼容的特性。它采用了分布式架构,可以轻松处理大量的数据,同时还支持多种数据类型和函数,具有高可用性和可扩展性。它还提供了丰富的管理工具和性能优化功能,为企业提供了可靠的数据存储和处理解决方案。PolarDB PostgreSQL版在数据库领域具有很高的竞争力,可以满足各种企业的需求。
【YashanDB观点】论Oracle兼容性,我们需要做什么
我们经常发现,部分国产数据库声称与 Oracle兼容性高达90%,但在实际迁移过程中,仍需要频繁地修改业务应用的代码。为何实现与Oracle高兼容度的数据库产品如此困难?其中一个重要原因是Oracle兼容性不仅是模仿,而是一个非常复杂和工程量庞大的逆向工程。其技术实现的复杂性以及多如牛毛的细节,足以让多数“年轻”的数据库团队望洋兴叹。YashanDB作为一款从核心理论到关键系统均为原创的数据库产品,从构建初期就具备了技术优势,在Oracle兼容性实现上,敢于亮剑并充分发挥工匠精神,不断打磨,努力构筑一个真正形神兼备的数据库产品。以下将从YashanDB SQL引擎技术、Oracle兼容性的开发
|
3月前
|
【YashanDB观点】论Oracle兼容性,我们需要做什么
Oracle兼容性是目前国产数据库的关键任务之一,其直接影响到商业迁移的成本和竞争力。
57 8
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
1382 2
常用数据库的分页语句(mySQL、oracle、PostgreSQL、SQL Server)
常用数据库的分页语句(mySQL、oracle、PostgreSQL、SQL Server)
PolarDB 开源版通过orafce支持Oracle兼容性
背景PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力.本文将介绍PolarDB开源版通过orafce支持Oracle兼容性 .测试环境为m...
203 0
【Oracle】使用Navicat Premium连接Oracle数据库两种方法
以上就是两种使用Navicat Premium连接Oracle数据库的方法介绍,希望对你有所帮助!
122 28
【赵渝强老师】Oracle的闪回数据库
Oracle闪回数据库功能类似于“倒带按钮”,可快速将数据库恢复至 earlier 状态,无需还原备份。本文介绍了闪回数据库的使用方法及实战案例:包括设置归档模式、开启闪回功能、记录SCN号、执行误操作后的恢复步骤等。通过具体 SQL 操作演示了如何利用闪回数据库恢复被误删的用户数据。注意,使用此功能前需确保数据库为归档模式。

相关产品

  • 云原生数据库 PolarDB
  • 云数据库 RDS PostgreSQL 版
  • 推荐镜像

    更多
    AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等