Uma view é uma tabela virtual construída a partir do resultado de uma consulta em uma ou mais tabelas. Ela não armazena dados reais. Views simplificam consultas complexas e aumentam a segurança dos dados. Este tópico descreve como criar uma view usando a instrução CREATE VIEW.
Observações de uso
AnalyticDB for MySQL apresenta comportamento de view compatível com o MySQL nas seguintes situações:
-
Versões anteriores à 3.1.9.0
Clusters do AnalyticDB for MySQL não suportam o comportamento padrão do MySQL. Após adicionar ou remover colunas de uma view, ao consultá-la com
SELECT * FROM <view_name>;, o comportamento difere do MySQL. O sistema detecta incompatibilidade no número de colunas e considera a view indisponível. Nesse caso, o seguinte erro é retornado:View '<view_name>' is stale; it must be re-created. -
V3.1.9.0 e posteriores
Clusters do AnalyticDB for MySQL suportam o comportamento padrão do MySQL. Ao criar uma view, o cluster expande o
*na instrução SQL para colunas explícitas antes de armazenar a instrução. Depois disso, adicionar ou remover colunas não afeta mais a view.
Portanto, recomendamos usar um cluster com V3.1.9.0 ou posterior para criar views. Isso garante compatibilidade com o comportamento padrão do MySQL e evita semânticas inesperadas e erros causados pelo uso de * em views.
Para visualizar a versão secundária de um cluster Data Lakehouse Edition, execute SELECT adb_version();. Para atualizar a versão secundária, entre em contato com o suporte técnico.
Em clusters do AnalyticDB for MySQL que executam V3.1.9.0 ou posterior e são compatíveis com o comportamento do MySQL, efeitos colaterais podem ocorrer em casos especiais. Por exemplo, se você renomear uma coluna de C para D e a view precisar referenciar com precisão as colunas A, B e C, a view ficará indisponível e um erro será retornado porque a coluna C não existe mais. Esse comportamento é esperado. Um erro é retornado mesmo que a consulta não utilize a coluna C, pois a poda de colunas ocorre durante a fase de otimização, enquanto as verificações de sintaxe SQL e de permissões ocorrem durante a fase de análise. No entanto, em versões anteriores à 3.1.9.0, todas as verificações passam e nenhum erro é retornado, pois apenas o número de colunas da view é verificado — o qual permanece igual após a operação de renomeação — e o número de colunas referenciadas pelo * atual é consistente. Após a aprovação da verificação de disponibilidade da view, a coluna C é mapeada para a terceira coluna na ordem da tabela base. Mesmo que você consulte a coluna C após a operação de renomeação, nenhum erro será retornado, mas os resultados da consulta serão inesperados.
Se o seu negócio exigir o comportamento especial de clusters do AnalyticDB for MySQL que executam versões anteriores à 3.1.9.0, adicione uma dica específica ou configure um parâmetro ao criar views para obter o comportamento esperado.
-
Para configurar uma única view, adicione
/*+LOG_VIEW_SELECT_ASTERISK_MYSQL_MODE=false*/. O exemplo a seguir mostra como adicionar a dica:/*+LOG_VIEW_SELECT_ASTERISK_MYSQL_MODE=false*/ CREATE VIEW v0 AS SELECT * FROM base0; Para configurar todas as views no cluster, execute a seguinte instrução:
SET ADB_CONFIG LOG_VIEW_SELECT_ASTERISK_MYSQL_MODE = false;
Sintaxe
CREATE
[OR REPLACE]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name
AS select_statement;
|
Parâmetro |
Obrigatório |
Descrição |
|
|
Não |
Cria uma view usando uma regra selecionada com base na existência de uma view com o mesmo nome. As regras são:
Nota
Se este parâmetro não for especificado e já existir uma view com o mesmo nome, a criação da view falhará. |
|
|
Método de verificação de segurança usado ao consultar dados em uma view. Valores válidos:
Nota
|
|
|
|
Sim |
Nome da view. Nota
Adicione um nome de banco de dados antes do nome da view para especificar o banco de dados ao qual ela pertence, por exemplo, |
|
|
Fonte de dados da view. |
Exemplos
-
Preparar dados de teste
Use uma conta privilegiada do cluster AnalyticDB for MySQL para executar as seguintes operações:
-
Crie uma conta chamada
user1:CREATE USER user1 IDENTIFIED BY 'user1_pwd'; -
Crie um banco de dados chamado
adb_demoe uma tabela chamadat1nesse banco de dados. A instrução a seguir cria a tabelat1:Create Table `t1` ( `id` bigint AUTO_INCREMENT, `id_province` bigint NOT NULL, `user_info` varchar, primary key (`id`) ) DISTRIBUTED BY HASH(`id`);Insira dados de teste na tabela
t1:INSERT INTO t1(id_province,user_info) VALUES (1,'Tom'),(1,'Jerry'),(2,'Jerry'),(3,'Mark');
-
-
Criar views
NotaOs exemplos a seguir criam views sobre a tabela
t1usando diferentes métodos de verificação de segurança, para demonstrar os diferentes efeitos de permissão entreDEFINEReINVOKER.-
Para criar uma view chamada
v1e definirSQL SECURITYcomoINVOKER, execute a seguinte instrução:CREATE SQL SECURITY INVOKER VIEW v1 AS SELECT id_province,user_info FROM t1 WHERE id_province=1; -
Para criar uma view chamada
v2e definirSQL SECURITYcomoDEFINER, execute a seguinte instrução:CREATE SQL SECURITY DEFINER VIEW v2 AS SELECT id_province,user_info FROM t1 WHERE id_province=1; -
Para criar uma view chamada
v3sem especificarSQL SECURITY(nesse caso, o sistema usaINVOKERpor padrão), execute a seguinte instrução:CREATE VIEW v3 AS SELECT id_province,user_info FROM t1 WHERE id_province=1;
-
-
Comparar permissões
-
Use uma conta privilegiada para conceder a
user1apenas a permissão para consultar as três views:GRANT SELECT ON adb_demo.v1 TO 'user1'@'%'; GRANT SELECT ON adb_demo.v2 TO 'user1'@'%'; GRANT SELECT ON adb_demo.v3 TO 'user1'@'%';Nesse cenário, após
user1conectar-se ao banco de dadosadb_demodo cluster AnalyticDB for MySQL,user1poderá consultar apenas a viewv2. Instrução de consulta:SELECT * FROM v2;O seguinte resultado é retornado:
+-------------+-----------+ | ID_PROVINCE | USER_INFO | +-------------+-----------+ | 1 | Tom | | 1 | Jerry | +-------------+-----------+No entanto, um erro é retornado quando
user1consulta a viewv1ouv3. Instrução de consulta:SELECT * FROM v1ou
SELECT * FROM v3Ambas as instruções retornam o seguinte erro:
ERROR 1815 (HY000): [20049, 2021083110261019216818804803453927668] : Failed analyzing stored view -
Após conceder a
user1a permissão para consultar as três views, use uma conta privilegiada para conceder auser1a permissão para consultar a tabelat1:GRANT SELECT ON adb_demo.t1 to user1@'%';Nesse caso, após
user1conectar-se ao banco de dadosadb_demodo cluster AnalyticDB for MySQL,user1poderá consultar todas as viewsv1,v2ev3. Instrução de consulta:SELECT * FROM v1;ou
SELECT * FROM v2;ou
SELECT * FROM v3;Todas as três instruções de consulta retornam o mesmo resultado:
+-------------+-----------+ | ID_PROVINCE | USER_INFO | +-------------+-----------+ | 1 | Tom | | 1 | Jerry | +-------------+-----------+
-
Perguntas frequentes
Por que nomes de colunas definidos em minúsculas na tabela base aparecem em maiúsculas no conjunto de resultados da view?
Os nomes das colunas no conjunto de resultados de uma view do AnalyticDB for MySQL não diferenciam maiúsculas de minúsculas por padrão. Se desejar que os nomes das colunas no conjunto de resultados da view estejam em minúsculas, defina o valor de VIEW_OUTPUT_NAME_CASE_SENSITIVE como true, o que ativa a diferenciação entre maiúsculas e minúsculas. Para isso, execute a seguinte instrução:
SET ADB_CONFIG VIEW_OUTPUT_NAME_CASE_SENSITIVE=true;
Práticas recomendadas
Para mais informações, consulte {{XREF_1}}.