PostgreSQLOracle相容性-synonym匿名
標籤
PostgreSQL , 匿名 , synonym
背景
Oracle 的一個功能,支援對其他物件建立別名(匿名:synonym),它有什麼用呢?
比如某些業務系統中,程式碼中寫死了要訪問的物件是在哪個使用者下的。當遷移時,如果遇到使用者名稱衝突,我們可能會選擇將物件同步到其他使用者下。那麼問題來了,程式也要改動,如果是很老的程式,估計找不到人來做這件事情。用synonym(匿名)可以很好的解決這個問題。
匿名語法如下
CREATE [ OR REPLACE ] [ PUBLIC ] SYNONYM
[ schema. ]synonym
FOR [ schema. ]object [ @ dblink ] ;
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);
通過檢視,
create view b.tbl123 as select * from a.tbl;
這種簡單檢視,支援增刪改查,和直接使用a.tbl是一樣的。
相當於建立了a.tbl的b.tbl123匿名。
通過search_path,
如果物件名沒變,只是在不同的schema下,使用search_path是最通用的方法:
set search_path=a,"$user",public;
那麼會先訪問a這個schema下的物件。
2、函式
程式碼寫死了b.fun123:
create or replace function a.fun(int) returns int as $$
....
$$ language plpgsql strict;
通過函式巢狀,
create or replace function b.fun123(int) returns int as $$
select a.fun($1);
$$ language sql strict;
通過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;
postgres=# select nextval(`已存在seq物件`);
nextval
---------
1
(1 row)
postgres=# select nextval(`目標seq物件名字`);
nextval
---------
2
(1 row)
postgres=# select nextval(`已存在seq物件`);
nextval
---------
3
(1 row)
如果只是search_path的問題,通過search_path解決,與1方法類似。
核心實現
核心實現當然是最好的,很早以前社群有提過這樣的PATCH,有興趣的同學可以考慮把它port到PG最新的版本來。
https://www.postgresql.org/message-id/440D446E.7040509@cybertec.at
使用了類似HOOK的方法。
相關文章
- PostgreSQLOracle相容性之NUMTODSINTERVALSQLOracle
- PostgreSQLOracle相容性之-roundintervalSQLOracle
- PostgreSQLOracle相容性-connectby2SQLOracle
- PostgreSQLOracle相容性-Analysis函式之keepSQLOracle函式
- PostgreSQLOracle相容性-substrb-orafcesubstrb適配OraclesubstrbSQLOracle
- PostgreSQLOracle相容性之-全域性臨時表globaltemptableSQLOracle
- PostgreSQLOracle相容性之-PartitionByOuterJoin實現稠化報表SQLOracle
- PostgreSQLOracle相容性之-系統列(ctid,oid,cmin,cmax,xmin,xmax)SQLOracle
- PostgreSQLoracle相容性-字串內嵌NULL字元(空字元)chr(0)轉換為chr(32)SQLOracle字串Null字元
- PostgreSQLOracle相容性之-PL/SQLDETERMINISTIC與PG函式穩定性(immutable,stable,volatile)SQLOracle函式
- Oracle synonym 相關Oracle
- PostgreSQLOracle相容性之-connectby高階選項CONNECT_BY_ISLEAF、SYS_CONNECT_BY_PATH、CONNECT_BY_ISCYCLE、LEVELSQLOracle
- 詳解同義詞(synonym)
- Synonym_View_Materialized和Public物件ViewZed物件
- Oracle中的同義詞SYNONYMOracle
- for public synonym, only sys user can compile it?Compile
- 關於oracle synonym 的總結整理Oracle
- 匿名物件物件
- 1229Create schema synonym in Oracle 12cOracle
- Oracle之處理synonym同義詞無效物件Oracle物件
- PHP匿名函式PHP函式
- Ruby 匿名函式函式
- Golang匿名函式Golang函式
- JavaScript 匿名函式JavaScript函式
- IPC(一)---------匿名管道
- Go 匿名函式Go函式
- PHP 新增匿名類PHP
- JavaScript匿名函式JavaScript函式
- Java匿名物件Java物件
- 匿名內部類
- VIEW和SYNONYM引起的執行計劃的異常View
- 程式相容性
- 相容性(js)JS
- Oracle資料庫使用者許可權控制 - Role - SynonymOracle資料庫
- 深入理解 函式、匿名函式、自執行匿名函式函式
- PHP 匿名函式初探PHP函式
- 匿名函式(Python)函式Python
- Python匿名函式Python函式