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

时间:2024-11-13 14:45:18

规格约束

  • 事务

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

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

      本地隔离级别

      远程隔离级别

      Read Uncommitted

      Repeatable Read

      Read Committed

      Repeatable Read

      Repeatable Read

      Repeatable Read

      Serializable

      Serializable

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

  • 本地用户对DATABASE LINK的使用权限
    1. 如果使用了public关键词,就是公有的DATABASE LINK,可以被所有用户/模式使用。
    2. 如果没有使用public关键词,就是私有的DATABASE LINK,仅能被当前用户/模式使用(包括SYSADMIN用户也无法跨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/distributed-devg-v8-gaussdb/gaussdb-12-0709.html