云数据库 GAUSSDB-DATABASE LINK:规格约束

时间:2024-01-23 20:08:53

规格约束

  • 事务

    使用DATABASE LINK的时候本地和远程事务的关系如下:

    1. 本地事务会同步控制远程事务的提交/回滚状态。
    2. 隔离级别的对应关系为:

      本地隔离级别

      远程隔离级别

      Read Uncommitted

      Repeatable Read

      Read Committed

      Repeatable Read

      Repeatable Read

      Repeatable Read

      Serializable

      Serializable

      本地事务提交过程中会向远端发送事务提交请求,如果远端事务提交成功后出现异常情况导致本地的事务提交失败,如连接异常,本地集群实例异常等情况,远端的事务提交无法被撤回,可能出现本地事务与远端事务不一致的情况。

  • 本地用户对DATABASE LINK的使用权限
    1. 如果使用了 public 关键词,就是公有的DATABASE LINK,可以被所有用户/schema使用。
    2. 如果没有使用 public 关键词,就是私有的的DATABASE LINK,仅能被当前用户/schema使用(包括sys用户也无法跨schema使用DATABASE LINK)。
  • 通过DATABASE LINK访问远程数据库对象的权限

    对远程数据库对象的访问权限与DATABASE LINK绑定的远程连接用户的权限保持一致。

  • 支持sql范围
    • DATABASE LINK相关语句支持情况见。表1
    • DATABASE LINK相关表类型支持情况见表2
  • DATABASE LINK函数调用
    • DATABASE LINK调用远程函数不支持自定义类型、OUT/INOUT参数、PACKAGE内函数、聚集函数、窗口函数、以及返回set函数。
    • PLSQL_BODY内通过DATABASE LINK调用远程数据库的存储过程或函数不支持自定义类型、OUT/INOUT参数、PACKAGE内函数、重载函数、聚集函数、窗口函数、以及返回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表不支持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子句
  • start with子句和connect by子句
  • for update子句
  • Rownum使用

普通事务块、存储过程、函数、高级包、逻辑视图

INSERT语句

普通表

  • 多value插入

普通事务块、存储过程、函数、高级包

UPDATE语句

普通表

  • limit子句
  • order by子句
  • where子句

普通事务块、存储过程、函数、高级包

DELETE语句

普通表

  • limit子句
  • order by子句
  • where子句

普通事务块、存储过程、函数、高级包

LOCK TABLE语句

普通表

  • lockmode子句
  • nowait子句

普通事务块

表2 表类型支持情况

维度

GaussDB 表类型

DATABASE LINK支持情况

TEMP选项

临时表

不支持

全局临时表

支持

UN LOG GED选项

非日志表

支持

存储特性

行存

Astore

支持

Ustore

支持

列存

支持查询,不支持更新

压缩表(仅列存)

支持查询,不支持更新

分区表

支持

二级分区表

支持

视图

DATABASE LINK访问远程视图

支持dql,不支持dml

本地视图通过 DATABASE LINK 关联远程表

支持dql,不支持dml

support.huaweicloud.com/centralized-devg-v3-gaussdb/gaussdb-12-0680.html