
# 操作指导
#### 前提条件
- 控制视图的级联失效：设置GUC参数enable_view_invalidation为on。
- 控制视图一次性入库：设置GUC参数enable_force_create_obj为on。
 
#### 语法
支持通过如下语法对视图重新编译：
```
ALTER VIEW view_name COMPILE;
```
#### 注意事项
- 功能使用前，请先检查是否存在失效对象，失效对象被调用，可能会出现一些异常情况。
- 建议避免构造对象依赖成环的场景，访问和编译会出现异常情况。
- 执行失效重编译过程中，不建议执行其它DML操作。
- 视图重编译失败时，可通过CREATE OR REPLACE VIEW语法重建视图。
 
#### 操作步骤
以下步骤为整体流程步骤，具体执行代码请参见[示例]。
1. 在数据库中手动创建视图对象。
2. 对视图依赖对象进行DDL变更。
3. 通过PG_OBJECT系统表检查是否存在失效对象，失效对象的valid字段置为false。
4. 执行ALTER COMPILE语法或pg_catalog.gs_compile_schema批量重编译接口进行重编译。
5. 检查PG_OBJECT系统表中是否存在valid字段是false的对象，确认全部对象变为有效。
6. 正常开启业务。
 
 #### 示例
- 示例一：视图手动重编译
  ```
  -- 开启失效重编译参数。
  gaussdb=# SET enable_view_invalidation=on;
  -- 创建表，视图依赖表。
  gaussdb=# CREATE TABLE tetab_v1(a int,b int);
  NOTICE:  The 'DISTRIBUTE BY' clause is not specified. Using 'a' as the distribution column by default.
  HINT:  Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column.
  CREATE TABLE
  gaussdb=# CREATE VIEW teview1 AS SELECT a, b FROM tetab_v1;
  -- 删除表。
  gaussdb=# DROP TABLE tetab_v1;
  -- 查询视图有效性。
  gaussdb=# SELECT c.relname, o.valid FROM pg_catalog.pg_object o JOIN pg_catalog.pg_class c ON c.oid = o.object_oid WHERE c.relname = 'teview1';
   relname | valid 
  ---------+-------
   teview1 | f
  (1 row)
  -- 重建视图依赖表。
  gaussdb=# CREATE TABLE tetab_v1(a int,b int);
  NOTICE:  The 'DISTRIBUTE BY' clause is not specified. Using 'a' as the distribution column by default.
  HINT:  Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column.
  CREATE TABLE
  -- 手动编译视图，再次查看对象有效性。
  gaussdb=# ALTER VIEW teview1 COMPILE;
  gaussdb=# SELECT c.relname, o.valid FROM pg_catalog.pg_object o JOIN pg_catalog.pg_class c ON c.oid = o.object_oid WHERE c.relname = 'teview1';
   relname | valid 
  ---------+-------
   teview1 | t
  (1 row)
  -- 删除视图。
  gaussdb=# DROP VIEW teview1;
  -- 删除表。
  gaussdb=# DROP TABLE tetab_v1;
  ```
  

- 示例二：视图自动重编译
  ```
  -- 开启失效重编译参数。
  gaussdb=# SET enable_view_invalidation=on;
  -- 创建表，视图依赖表。
  gaussdb=# CREATE TABLE tetab_v2(a int,b int);
  NOTICE:  The 'DISTRIBUTE BY' clause is not specified. Using 'a' as the distribution column by default.
  HINT:  Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column.
  CREATE TABLE
  gaussdb=# CREATE VIEW teview2 AS SELECT a, b FROM tetab_v2;
  -- 删除表。
  gaussdb=# DROP TABLE tetab_v2;
  -- 查询视图有效性。
  gaussdb=# SELECT c.relname, o.valid FROM pg_catalog.pg_object o JOIN pg_catalog.pg_class c ON c.oid = o.object_oid WHERE c.relname = 'teview2';
   relname | valid 
  ---------+-------
   teview2 | f
  (1 row)
  -- 重建视图依赖表。
  gaussdb=# CREATE TABLE tetab_v2(a int,b int);
  NOTICE:  The 'DISTRIBUTE BY' clause is not specified. Using 'a' as the distribution column by default.
  HINT:  Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column.
  CREATE TABLE
  -- 使用视图自动重编译，再次查看对象有效性。
  gaussdb=# SELECT * FROM teview2;
   a | b 
  ---+---
  (0 rows)
  gaussdb=# SELECT c.relname, o.valid FROM pg_catalog.pg_object o JOIN pg_catalog.pg_class c ON c.oid = o.object_oid WHERE c.relname = 'teview2';
   relname | valid 
  ---------+-------
   teview2 | t
  (1 row)
  -- 删除视图。
  gaussdb=# DROP VIEW teview2;
  -- 删除表。
  gaussdb=# DROP TABLE tetab_v2;
  ```
  

- 示例三：视图批量重编译
  ```
  -- 开启失效重编译参数。
  gaussdb=# SET enable_view_invalidation=on;
  -- 创建schema、表，视图依赖表，视图依赖视图
  gaussdb=# DROP SCHEMA IF EXISTS tesch2 CASCADE;
  gaussdb=# CREATE SCHEMA tesch2;
  gaussdb=# SET current_schema = tesch2;
  gaussdb=# CREATE TABLE tab1 (c1 INT, c2 INT);
  NOTICE:  The 'DISTRIBUTE BY' clause is not specified. Using 'c1' as the distribution column by default.
  HINT:  Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column.
  CREATE TABLE
  gaussdb=# CREATE VIEW v_tab1 AS SELECT * FROM tab1;
  gaussdb=# CREATE VIEW v_tab2 AS SELECT * FROM v_tab1;
  gaussdb=# CREATE VIEW v_tab3 AS SELECT * FROM tab1;
  -- 删除表。
  gaussdb=# DROP TABLE tab1;
  -- 查询对象有效性。
  gaussdb=# SELECT c.relname, o.valid FROM pg_catalog.pg_object o JOIN pg_catalog.pg_class c ON c.oid = o.object_oid WHERE c.relname = 'v_tab1' or c.relname = 'v_tab2' or c.relname = 'v_tab3';
   relname | valid 
  ---------+-------
   v_tab1  | f
   v_tab2  | f
   v_tab3  | f
  (3 rows)
  -- 恢复删除的表。
  gaussdb=# CREATE TABLE tab1 (c1 INT, c2 INT);
  NOTICE:  The 'DISTRIBUTE BY' clause is not specified. Using 'c1' as the distribution column by default.
  HINT:  Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column.
  CREATE TABLE
  -- 批量重编译tesch2命名空间下视图对象。
  gaussdb=# CALL pg_catalog.gs_compile_schema('tesch2', true, 1);
  INFO:  successful
  CONTEXT:  referenced column: gs_compile_schema
  SQL statement "select pkg_util.gs_compile_schema(:schema_name, :compile_all, :retry_times);"
  PL/pgSQL function gs_compile_schema(character varying,boolean,integer) line 24 at EXECUTE statement
  INFO:  The number of executions is 1
  INFO:  successful
   gs_compile_schema 
  -------------------
   t
  (1 row)
  -- 再次查询视图有效性。
  gaussdb=# SELECT c.relname, o.valid FROM pg_catalog.pg_object o JOIN pg_catalog.pg_class c ON c.oid = o.object_oid WHERE c.relname = 'v_tab1' or c.relname = 'v_tab2' or c.relname = 'v_tab3';
   relname | valid 
  ---------+-------
   v_tab1  | t
   v_tab2  | t
   v_tab3  | t
  (3 rows)
  -- 删除视图。
  gaussdb=# DROP VIEW v_tab3;
  gaussdb=# DROP VIEW v_tab2;
  gaussdb=# DROP VIEW v_tab1;
  -- 删除表。
  gaussdb=# DROP TABLE tab1;
  gaussdb=# RESET current_schema;
  -- 删除schema。
  gaussdb=# DROP SCHEMA tesch2 CASCADE;
  ```
  
 
