云数据库 GAUSSDB-DATABASE LINK:规格约束
规格约束
- 事务
使用DATABASE LINK的时候本地和远程事务的关系如下:
- 本地事务会同步控制远程事务的提交/回滚状态。
- 隔离级别的对应关系为:
本地隔离级别
远程隔离级别
Read Uncommitted
Repeatable Read
Read Committed
Repeatable Read
Repeatable Read
Repeatable Read
Serializable
Serializable
本地事务提交过程中会向远端发送事务提交请求,如果远端事务提交成功后出现异常情况导致本地的事务提交失败,如连接异常,本地集群实例异常等情况,远端的事务提交无法被撤回,可能出现本地事务与远端事务不一致的情况。
- 本地用户对DATABASE LINK的使用权限
- 如果使用了public关键词,就是公有的DATABASE LINK,可以被所有用户/schema使用。
- 如果没有使用public关键词,就是私有的DATABASE LINK,仅能被当前用户/schema使用(包括sysadmin用户也无法跨schema使用DATABASE LINK)。
- 通过DATABASE LINK访问远程数据库对象的权限
对远程数据库对象的访问权限与DATABASE LINK绑定的远程连接用户的权限保持一致。
- 支持SQL范围
- DATABASE LINK函数调用
- DATABASE LINK调用远程函数不支持OUT/INOUT参数、聚集函数、窗口函数、以及返回set函数。
- PLSQL_BODY内通过DATABASE LINK调用远程数据库的存储过程或函数不支持OUT/INOUT参数、重载函数、聚集函数、窗口函数、以及返回set函数。
- PLSQL_BODY内调用远程数据库的存储过程或函数时,应使用[CALL | SELECT] [ schema. ] { func_name@dblink | procedure_name@dblink } ( param_expr )语法格式调用。
- PLSQL_BODY内调用远程数据库的无参存储过程或函数时,应使用[CALL | SELECT] [ schema. ] { func_name@dblink | procedure_name@dblink } ( )语法格式调用。
- 同义词
- 不支持将DATABASE LINK名创建为一个同义词的使用方法。
- 不支持通过DATABASE LINK调用远端数据库中指向一个DATABASE LINK对象的同义词。例如如下场景:
- 步骤一:在DB1上创建表TABLE1。
- 步骤二:在DB2上创建连接DB1的DBLINK1,并创建同义词"CREATE SYNONYM T1 FOR TABLE1@DBLINK1"。
- 步骤三:在DB3上创建连接DB2的DBLINK2,通过DBLINK2调用DB2上的同义词T1,"SELECT * FROM T1@DBLINK2"。
- 表类型约束
- HASHBUCKET:不支持通过DATABASE LINK对远端Hash bucket表进行查询或DML操作。
- SLICE:不支持通过DATABASE LINK对远端slice表进行查询或DML操作。
- 复制表:不支持通过DATABASE LINK对远端复制表进行查询或DML操作。
- TEMPORARY:不支持通过DATABASE LINK对远端临时表进行查询或DML操作。
- 视图
- 目前支持对DATABASE LINK的远端表创建视图,但是当远端表本身的结构发生变化时,该视图使用时可能会发生异常。例如:
- 步骤一:在DB1上创建表TABLE1。
- 步骤二:在DB2上创建连接DB1的DBLINK,并创建视图"CREATE VIEW V1 AS SELECT * FROM TABLE1@DBLINK。
- 步骤三:在DB1上删除TABLE1的一列,在DB2上查询该视图会产生报错。
- 目前支持对DATABASE LINK的远端表创建视图,但是当远端表本身的结构发生变化时,该视图使用时可能会发生异常。例如:
- 其他场景:
- DATABASE LINK表不支持TRIGGER,包括TRIGGER调用函数内使用DATABASE LINK场景、trigger调用函数为DATABASE LINK函数、在DATABASE LINK上定义TRIGGER情况。
- 暂不支持UPSERT、MERGE语法。
- 不支持current cursor语法。
- 不支持查询表的隐藏字段。
- dump与备份
不支持DATABASE LINK相关数据库对象的dump,备机不支持DATABASE LINK调用,也不支持被DATABASE LINK连接。
- 谓词下推约束
仅支持WHERE子句使用的数据类型、操作符和函数是内置的,并且使用的函数是IMMUTABLE类型。
- 聚集函数下推约束
仅支持单表且没有GROUP、ORDER BY、HAVING、LIMIT子句的SELECT语句,并且不支持窗口函数。
- hint下推
支持针对DATABASE LINK表对象的hint条件下推,仅限scan方式的hint下推,语法格式如下:
[no] tablescan|indexscan|indexonlyscan(table [index])
并要求在一个 queryblock 中的表名或表别名不能重复。
表1 支持SQL范围 SQL类型
操作对象
支持选项说明
执行上下文
创建DATABASE LINK
DATABASE LINK
NA
普通事务块
修改DATABASE LINK
DATABASE LINK
仅支持用户名、密码的修改
普通事务块
删除DATABASE LINK
DATABASE LINK
NA
普通事务块
SELECT语句
普通表、普通视图、全量物化视图
- WHERE子句
- DATABASE LINK表和内部表JOIN
- DATABASE LINK表和DATABASE LINK表JOIN
- 聚集函数
- LIMIT子句
- ORDER BY子句
- GROUP BY子句、HAVING子句
- UNION子句
- WITH子句
- FOR UPDATE子句
- Rownum使用
普通事务块、存储过程、函数、高级包、逻辑视图
INSERT语句
普通表
- 多VALUE插入
普通事务块、存储过程、函数、高级包
UPDATE语句
普通表
- LIMIT子句
- ORDER BY子句
- WHERE子句
普通事务块、存储过程、函数、高级包
DELETE语句
普通表
- LIMIT子句
- ORDER BY子句
- WHERE子句
普通事务块、存储过程、函数、高级包
LOCK TABLE语句
普通表
- LOCKMODE子句
- NOWAIT子句
普通事务块