
# ALTER FOREIGN TABLE (For HDFS or OBS)
#### 功能描述
对HDFS外表和OBS外表进行修改。
**外表（Foreign Table）**是数据库或大数据平台中一种虚拟表结构，它不实际存储数据，而是通过元数据信息（如表结构、存储位置、文件格式等）将外部存储系统（如HDFS、OBS等）中的数据映射到数据库内部，使用户能够以标准SQL操作直接访问或操作外部数据。外表的本质是一种"数据代理"，将外部文件系统的数据逻辑映射成数据库可识别的表结构。
外表的核心价值是 "打破数据孤岛"： 通过元数据映射，让数据库用户以熟悉的方式访问外部系统数据，同时支持数据向外部系统的导出，实现跨系统数据的高效协同、分析与共享，尤其在大数据场景中能显著降低数据移动成本、提升协作效率。
#### 注意事项
无。
#### 语法格式
- 设置外表属性。
  ```
  ALTER FOREIGN TABLE [ IF EXISTS ]  table_name
      OPTIONS ( {[ ADD | SET | DROP ] option ['value']} [, ... ]);
  ```
  
- 设置外表的所有者。
  ```
  ALTER FOREIGN TABLE [ IF EXISTS ] tablename 
      OWNER TO new_owner;
  ```
  

- 更新外表列。
  ```
  ALTER FOREIGN TABLE [ IF EXISTS ] table_name
      MODIFY ( { column_name data_type | column_name [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ] | column_name [ CONSTRAINT constraint_name ] NULL } [, ...] );
  ```
  
- 修改外表的列。
  ```
  ALTER FOREIGN TABLE [ IF EXISTS ] tablename 
      action [, ... ];
  ```
  其中action语法为：
  ```
  ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type
     | ALTER [ COLUMN ] column_name { SET | DROP } NOT NULL
     | ALTER [ COLUMN ] column_name SET STATISTICS [PERCENT] integer
     | ALTER [ COLUMN ] column_name OPTIONS ( {[ ADD | SET | DROP ] option ['value'] } [, ... ])
     | MODIFY column_name data_type
     | MODIFY column_name [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ]
     | MODIFY column_name [ CONSTRAINT constraint_name ] NULL
  ```
  参考[ALTER TABLE](https://support.huaweicloud.com/sqlreference-dws/dws_06_0142.html)。
  
 
- 增加外表信息约束（Informational Constraint）。
  ```
  ALTER FOREIGN TABLE [ IF EXISTS ] tablename
      ADD [ CONSTRAINT constraint_name ]
      { PRIMARY KEY | UNIQUE } ( column_name )
      [ NOT ENFORCED [ ENABLE QUERY OPTIMIZATION | DISABLE QUERY OPTIMIZATION ] | ENFORCED ];
  ```
  对于增加外表信息约束（Informational Constraint）相关参数请参考[参数说明](https://support.huaweicloud.com/sqlreference-dws/dws_06_0161.html#ZH-CN_TOPIC_0000001811634745__s755e54aa01f04a4bb44806bedcebdab4)。
  
- 删除外表的信息约束（Informational Constraint）。
  ```
  ALTER FOREIGN TABLE [ IF EXISTS ] tablename 
      DROP CONSTRAINT constraint_name ;
  ```
  

- 设置外表行级访问控制开关（9.1.0及以上集群版本支持）。
  ```
  ALTER FOREIGN TABLE [ IF EXISTS ] tablename
          ENABLE | DISABLE | FORCE | NO FORCE ROW LEVEL SECURITY
  ```
  
#### 参数说明
表1ALTER FOREIGN TABLE (For HDFS or OBS)参数说明 
| 参数              | 描述                      | 取值范围        |
|:---|:---|:---|
| IF EXISTS       | 如果指定的外表不存在时返回一个提示而不是错误。 | -           |
| tablename       | 需要修改的外表名称。              | 已存在的外表名。    |
| new_owner       | 外表的新所有者。                | 字符串，有效的用户名。 |
| data_type       | 已存在字段的新数据类型。            | 字符串。        |
| constraint_name | 要添加/删除的约束的名称。           | 字符串。        |
| column_name     | 已存在字段的名称。               | 字符串。        |
   
修改外表语法中其他参数，请参见ALTER TABLE的[参数说明](https://support.huaweicloud.com/sqlreference-dws/dws_06_0142.html#ZH-CN_TOPIC_0000001811634545__s3e87132692794964b56e3ba420e7b544)。
#### 示例
1. 创建HDFS_Server，对应的foreign data wrapper为HDFS_FDW或者DFS_FDW。
   ```
   CREATE SERVER hdfs_server FOREIGN DATA WRAPPER HDFS_FDW OPTIONS (address '10.10.0.100:25000,10.10.0.101:25000',hdfscfgpath '/opt/hadoop_client/HDFS/hadoop/etc/hadoop',type'HDFS');
   ```
   
2. 创建不包含分区列的HDFS外表：
   ```
   DROP FOREIGN TABLE IF EXISTS ft_region;
   CREATE FOREIGN TABLE ft_region
   (
       R_REGIONKEY INT4,
       R_NAME TEXT,
       R_COMMENT TEXT
   )
   SERVER
       hdfs_server
   OPTIONS
   (
       FORMAT 'orc',
       encoding 'utf8',
       FOLDERNAME '/user/hive/warehouse/gauss.db/region_orc11_64stripe/'
   )
   DISTRIBUTE BY 
        roundrobin;
   ```
   
3. 修改外表ft_region的r_name字段类型为text。
   ```
   ALTER FOREIGN TABLE ft_region ALTER r_name TYPE TEXT;
   ```
   
4. 标记外表ft_region的r_name列为not null。
   ```
   ALTER FOREIGN TABLE ft_region ALTER r_name SET NOT NULL;
   ```
   
 
#### 相关链接
[CREATE FOREIGN TABLE (SQL on OBS or Hadoop)](https://support.huaweicloud.com/sqlreference-dws/dws_06_0161.html)，[DROP FOREIGN TABLE](https://support.huaweicloud.com/sqlreference-dws/dws_06_0192.html)
