Desacoplamento e reconstrução automática de exibição do GaussDB(DWS)
Para resolver o problema de que os objetos da tabela base não podem ser modificados independentemente devido à dependência de exibição e tabela, o GaussDB(DWS) implementa desacoplamento e reconstrução de exibição. Este documento descreve os cenários de aplicação e os métodos de utilização da função de reconstrução automática da exibição.
Cenário
GaussDB(DWS) usa identificadores de objeto (OIDs) para armazenar relações de referência entre objetos. Quando uma exibição é definida, o OID do objeto de banco de dados do qual a exibição depende é vinculado a ela. Não importa como o nome da exibição muda, a dependência não muda. Se você modificar algumas colunas na tabela base, um erro será relatado porque as colunas estão fortemente vinculadas a alguns objetos. Se você quiser excluir uma coluna de tabela ou toda a tabela, precisará usar a palavra-chave cascade para excluir as exibições associadas. Depois que a coluna da tabela for excluída ou a tabela for recriada, você precisará recriar as exibições de diferentes níveis, uma por uma. Isso aumenta a carga de trabalho e deteriora a usabilidade.
Para resolver esse problema, o GaussDB(DWS) 8.1.0 desacopla as exibições de suas tabelas base dependentes ou outros objetos de banco de dados exibições, sinônimos, funções e colunas de tabela), para que esses objetos possam ser excluídos independentemente. Depois que a tabela base for reconstruída, você poderá executar o comando ALTER VIEW view_name REBUILD para reconstruir a dependência. Em 8.1.1, a reconstrução automática é implementada. As relações de dependência podem ser reconstruídas automaticamente sem serem percebidas. Depois que a reconstrução automática for ativada, podem ocorrer conflitos de bloqueio. Portanto, não é aconselhável ativar a reconstrução automática.
Uso
- Crie um cluster no console de gerenciamento. Para obter detalhes, consulte a seção Criação de um cluster.
- Ative o parâmetro de GUC view_independent.
O parâmetro de GUC view_independent controla se uma exibição deve ser desacoplada de seus objetos. Este parâmetro está desativado por padrão. Você precisa ativar manualmente o parâmetro. Para ativar o parâmetro view_independent, efetue logon no console de gerenciamento e clique no nome do cluster. Na página Cluster Details exibida, clique na guia Parameters, procure por view_independent, modifique o parâmetro e salve a modificação.
- Use o DAS para se conectar a um cluster. Localize o cluster necessário na lista de clusters e clique em Log In na coluna Operation. Na página do DAS exibida, digite o nome do usuário, o nome do banco de dados e a senha e teste a conexão. Se a conexão for bem-sucedida, faça logon no cluster. Para obter detalhes, consulte Uso do DAS para conectar-se a um cluster.
- Crie uma tabela de exemplo t1 e insira dados na tabela.
1 2 3
SET current_schema='public'; CREATE TABLE t1 (a int, b int, c char(10)) DISTRIBUTE BY HASH (a); INSERT INTO t1 VALUES(1,1,'a'),(2,2,'b');
- Crie a exibição v1 que depende da tabela t1 e crie a exibição v11 que depende da exibição v1. Consulte exibição v11.
1 2 3 4 5 6 7 8 9
CREATE VIEW v1 AS SELECT a, b FROM t1; CREATE VIEW v11 AS SELECT a FROM v1; SELECT * FROM v11; a --- 1 2 (2 rows)
- Depois que a tabela t1 é excluída, um erro é relatado quando você consulta a exibição v11. No entanto, as exibições ainda existem.
GaussDB(DWS) fornece a exibição GS_VIEW_INVALID para consultar todas as exibições inválidas visíveis para o usuário. Se a tabela base, função ou sinônimo de que a exibição depende for anormal, a coluna validtype da exibição será exibida como "invalid".
1 2 3 4 5 6 7 8 9 10 11
DROP TABLE t1; SELECT * FROM v11; ERROR: relation "public.t1" does not exist SELECT * FROM gs_view_invalid; oid | schemaname | viewname | viewowner | definition | validtype --------+------------+----------+-----------+-----------------------------+----------- 213563 | public | v1 | dbadmin | SELECT a, b FROM public.t1; | invalid 213567 | public | v11 | dbadmin | SELECT a FROM public.v1; | invalid (2 rows)
- Em um cluster de uma versão anterior após a recriação da tabela t1, a exibição é automaticamente recriada. As exibições são automaticamente atualizadas somente quando são usadas.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
CREATE TABLE t1 (a int, b int, c char(10)) DISTRIBUTE BY HASH (a); INSERT INTO t1 VALUES(1,1,'a'),(2,2,'b'); SELECT * from v1; a | b ---+--- 1 | 1 2 | 2 (2 rows) SELECT * FROM gs_view_invalid; oid | schemaname | viewname | viewowner | definition | validtype --------+------------+----------+-----------+--------------------------+----------- 213567 | public | v11 | dbadmin | SELECT a FROM public.v1; | invalid (1 row) SELECT * from v11; a --- 1 2 (2 rows) SELECT * FROM gs_view_invalid; oid | schemaname | viewname | viewowner | definition | validtype -----+------------+----------+-----------+------------+----------- (0 rows)