Oracle2PolarDB:Polardb-O兼容性之数据字典值大小写

适用于

  • 本文适用的平台为专有云、PolarBox一体机和PolarStack混合云版。
  • PolarDB(PolarDB-O)高度兼容Oracle版本。

目的

从Oracle目录查看时,数据库对象名称(例如表名称、列名称、触发器名称、程序名称、用户名等)将显示为大写字母。那么在PolarDB数据库中,创建使用双引号引用的名称时如何兼容Oracle。

解决办法

PolarDB通过设置polar_comp_redwood_raw_names参数控制数据字典显示行为,即您可以通过设置polar_comp_redwood_raw_names为off兼容Oracle控制数据字典显示的行为。如果 polar_comp_redwood_raw_names 设置为TRUE,则从Oracle数据字典查看,显示的数据库对象名称与Postgres系统字典中存储的完全相同。因此,创建的没有括起来的引号名称将在Postgres中按预期显示为小写,创建的具有括起来的引号名称将完全按创建时显示,但没有引号。示例如下。

  1. 参考以下SQL语句,创建reduser用户,然后使用该用户连接数据库。
    CREATE USER reduser IDENTIFIED BY password;
    polar_comp=# \c - reduser
    Password for user reduser:
    You are now connected to database "polar_comp" as user "reduser".
  2. 连接到数据库时,将创建以下表。
    CREATE TABLE all_lower (col INTEGER);
    CREATE TABLE ALL_UPPER (COL INTEGER);
    CREATE TABLE "Mixed_Case" ("Col" INTEGER);
  3. polar_comp_redwood_raw_names为默认值FALSE时:
    执行以下SQL语句,查看Oracle的USER_TABLES表,发现名称显示为大写,除Mixed_Case外,它是按照创建时的名称显示,并且还有引起来的双引号
    SELECT * FROM USER_TABLES;
    系统显示类似如下。
     schema_name |  table_name | tablespace_name | status | temporary 
    -------------+--------------+-----------------+--------+-----------
     REDUSER     | ALL_LOWER    |                 | VALID  | N
     REDUSER     | ALL_UPPER    |                 | VALID  | N
     REDUSER     | "Mixed_Case" |                 | VALID  | N
    (3 rows)
  4. polar_comp_redwood_raw_names设置为TRUE时:
    1. 执行以下SQL语句,将polar_comp_redwood_raw_names设置为TRUE。
      SET polar_comp_redwood_raw_names TO true;
      系统显示类似如下。
      SET
    2. 执行以下SQL语句,查看USER_TABLES表,名称将显示为小写,除Mixed_Case名称,它按创建时显示,但现在没有双引号。
      SELECT * FROM USER_TABLES;
      系统显示类似如下。
       schema_name | table_name | tablespace_name | status | temporary 
      -------------+------------+-----------------+--------+-----------
       reduser     | all_lower  |                 | VALID  | N
       reduser     | all_upper  |                 | VALID  | N
       reduser     | Mixed_Case |                 | VALID  | N
      (3 rows)        
  5. 查看PostgreSQL的pg_tables表:
    执行以下SQL语句,查看pg_tables表。
    SELECT schemaname,tablename,tableowner FROM pg_tables WHERE tableowner = 'reduser';
    系统显示类似如下,确认名称与上一步查看的大小写匹配。
     schemaname | tablename  | tableowner 
    ------------+------------+------------
     reduser    | all_lower  | reduser
     reduser    | all_upper  | reduser
     reduser    | Mixed_Case | reduser
    (3 rows)