
# ALTER VIEW
#### 功能描述
ALTER VIEW更改视图的各种辅助属性。（如果用户是更改视图的查询定义，要使用CREATE OR REPLACE VIEW。）
#### 注意事项
- 用户必须是视图的所有者才可以执行ALTER VIEW。
- 要修改视图的模式，用户必须要有新模式的CREATE权限。
- 要修改视图的所有者，用户必须是新所属角色的直接或者间接的成员，并且此角色必须有视图模式的CREATE权限。
- 管理员用户可以更改任何视图的所属关系。
 
#### 语法格式
- 设置视图列的默认值。
  ```
  ALTER VIEW [ IF EXISTS ] view_name
      ALTER [ COLUMN ] column_name SET DEFAULT expression;
  ```
  
- 取消列视图列的默认值。
  ```
  ALTER VIEW [ IF EXISTS ] view_name
      ALTER [ COLUMN ] column_name DROP DEFAULT;
  ```
  
- 修改视图的所有者。
  ```
  ALTER VIEW [ IF EXISTS ] view_name 
      OWNER TO new_owner;
  ```
  
- 重命名视图，支持新视图名前带有原视图所在的schema名，不支持同时修改schema名。
  ```
  ALTER VIEW [ IF EXISTS ] view_name 
      RENAME TO new_name;
  ALTER VIEW [ IF EXISTS ] view_name 
      RENAME TO schema.new_name;
  ```
  
- 设置视图的所属模式。
  ```
  ALTER VIEW [ IF EXISTS ] view_name 
      SET SCHEMA new_schema;
  ```
  
- 设置视图的选项。
  ```
  ALTER VIEW [ IF EXISTS ] view_name
      SET ( { view_option_name [ = view_option_value ] } [, ... ] );
  ```
  
- 重置视图的选项。
  ```
  ALTER VIEW [ IF EXISTS ] view_name
      RESET ( view_option_name [, ... ] );
  ```
  
 
- 重建本视图及上层和下层依赖的无效视图。
  ```
  ALTER VIEW [ IF EXISTS ] view_name
      REBUILD;
  ```
  

- 重建本视图及下层依赖的视图。
  ```
  ALTER VIEW [ IF EXISTS ] ONLY view_name
      REBUILD;
  ```
  
#### 参数说明
表1ALTER VIEW参数说明 
| 参数                                                                | 描述                                                                                                                                                                                                                                                                       | 取值范围                                                                                                                                                                                                                                                                                                                                        |
|:---|:---|:---|
| IF EXISTS                                                         | 如果视图不存在时返回一个提示而不是错误。                                                                                                                                                                                                                                                     | -                                                                                                                                                                                                                                                                                                                                           |
| view_name                                                         | 需要修改的视图的名称，可以用模式修饰。                                                                                                                                                                                                                                                      | 有效的视图名。                                                                                                                                                                                                                                                                                                                                     |
| column_name                                                       | 可选的名称列表，视图的字段名。如果没有给出，字段名取自查询中的字段名。                                                                                                                                                                                                                                      | 有效的字段名。                                                                                                                                                                                                                                                                                                                                     |
| SET/DROP DEFAULT                                                  | 设置或删除一个列的缺省值，该参数暂无实际意义。                                                                                                                                                                                                                                                  | -                                                                                                                                                                                                                                                                                                                                           |
| new_owner                                                         | 视图的新所有者。                                                                                                                                                                                                                                                                 | 有效的用户名。                                                                                                                                                                                                                                                                                                                                     |
| new_name                                                          | 视图的新名称。                                                                                                                                                                                                                                                                  | 字符串，需符合[标识符命名规范](https://support.huaweicloud.com/sqlreference-dws/dws_06_0007.html#ZH-CN_TOPIC_0000001811634529__section1475018612353)。                                                                                                                                                                                                     |
| new_schema                                                        | 视图的新模式。                                                                                                                                                                                                                                                                  | 有效的模式名。                                                                                                                                                                                                                                                                                                                                     |
| SET ( { view_option_name \[ = view_option_value \] } \[, ... \] ) | 该子句为视图指定一个可选的参数。 目前view_option_name仅支持security_barrier。 创建视图时使用WITH (security_barriers)可以创建一个相对安全的视图，避免攻击者利用低成本函数的RAISE语句打印出隐藏的基表数据。 | security_barrier为boolean类型： - TRUE  - FALSE   |
| REBUILD                                                           | 该子句用于视图解耦，可使用已保存的原始语句重新创建视图，恢复依赖关系。9.1.0.200及以上集群版本中，视图解耦功能无需开启GUC参数view_independent，检测视图如果为无效状态，则可以进行重建。                                                                                                                                                                | REBUILD的详细使用说明请参见[REBUILD（视图解耦）使用说明]。                                                                                                                                                                                                                                                   |
| ONLY                                                              | 控制视图重建的范围，只重建视图及其所依赖的视图。此功能无需开启GUC参数view_independent，检测视图如果为无效状态，则可以进行重建。                                                                                                                                                                                                | -                                                                                                                                                                                                                                                                                                                                           |
   
 #### REBUILD（视图解耦）使用说明
- 重建视图会从当前视图开始，依次向后级联刷新与其关联的所有视图，如果其依赖的前向视图也为不可用状态，会触发自动重建。
- 不支持对有依赖关系的临时表及临时视图的解耦DROP，可以对没有依赖关系的临时视图进行REBUILD操作。
- 支持视图模式名称及视图名称的修改，REBUILD按照最新的名称重建，但是query部分保留原始定义。
- 基表字段类型仅支持大类（字符型、数字型、时间类型等）范围内的修改；当基表添加字段时，视图不会置为无效，且定义不变。
- 无效视图备份时以注释形式导出，恢复时需要自行手动处理。
- 触发上层级联视图无效的场景：
  - DROP TABLE/VIEW
  
  - RENAME TABLE/VIEW
  
  - ALTER TABLE DROP COLUMN
  
  - ALTER TABLE CHANGE/ALTER COLUMN TYPE
  
  - ALTER TABLE CHANGE/ALTER COLUMN NAME
  
  - ALTER TABLE/VIEW NAMESPACE
  
  - ALTER TABLE/VIEW RENAME
   
 
#### 示例
创建视图myview。
```
CREATE OR REPLACE VIEW myview AS
    SELECT * FROM pg_tablespace WHERE spcname = 'pg_default';
```
修改视图名称为product_view。
```
ALTER VIEW myview RENAME TO product_view;
```
修改视图product_view的schema为schetest。
```
CREATE SCHEMA schetest;
ALTER VIEW product_view SET schema schetest;
```
重建视图schetest.product_view。
```
ALTER VIEW schetest.product_view REBUILD;
```
重建依赖视图schetest.product_view。
```
ALTER VIEW ONLY schetest.product_view REBUILD;
```
#### 相关链接
[CREATE VIEW](https://support.huaweicloud.com/sqlreference-dws/dws_06_0187.html)，[DROP VIEW](https://support.huaweicloud.com/sqlreference-dws/dws_06_0215.html)
#### 使用实践
[使用DWS视图重建功能实现视图解耦以提升开发效率](https://support.huaweicloud.com/bestpractice-dws/dws_05_0061.html)
