Como obter uma lista de visualizações do MySQL?

127

Estou procurando uma maneira de listar todas as visualizações em um banco de dados.

Inicialmente, encontrei e tentei uma resposta nos fóruns do MySQL :

SELECT table_name
FROM information_schema.views
WHERE information_schema.views.table_schema LIKE 'view%';

No entanto, isso não funciona, retornando um conjunto vazio. (Eu sei que eles estão lá!)

Estes também falham:

mysql> use information_schema;
Database changed
mysql> select * from views;
ERROR 1102 (42000): Incorrect database name 'mysql.bak'
mysql> select * from tables;
ERROR 1102 (42000): Incorrect database name 'mysql.bak'

Por que isso não está funcionando?

AnnanFay
fonte
link isso pode ajudar
SHASHI SHEKHAR Barnwal

Respostas:

27

Aqui está uma maneira de encontrar todas as visualizações em todos os bancos de dados da sua instância:

SELECT TABLE_SCHEMA, TABLE_NAME 
FROM information_schema.tables 
WHERE TABLE_TYPE LIKE 'VIEW';
Valerie Parham-Thompson
fonte
4
Se você deseja restringir a pesquisa a um determinado banco de dados para obter uma resposta à pergunta colocada, adicione AND TABLE_SCHEMA LIKE 'database_name'.
Gruber
Para complementar ou recuperar mais dados sobre a exibição, considere: stackoverflow.com/questions/2834016/…
Manuel Jordan
7
 select * FROM information_schema.views\G; 
zloctb
fonte
7

Isso vai funcionar.

    USE INFORMATION_SCHEMA;
    SELECT TABLE_SCHEMA, TABLE_NAME
    FROM information_schema.tables
    WHERE TABLE_TYPE LIKE 'VIEW';
Sameera Sampath
fonte
2
Isso é melhor, pois eu posso manipulá-lo para 'SHOW CREATE' com concat.
Moshe L
1
Mesma resposta queValerie Parham-Thompson
Manuel Jordan
5

Para complementar e obter mais informações sobre uma visualização específica

Mesmo com as duas respostas válidas

SHOW FULL TABLES IN your_db_name WHERE TABLE_TYPE LIKE 'VIEW';

SELECT TABLE_SCHEMA, TABLE_NAME 
FROM information_schema.TABLES 
WHERE TABLE_TYPE LIKE 'VIEW' AND TABLE_SCHEMA LIKE 'your_db_name';

Você pode aplicar o seguinte (acho melhor):

SELECT TABLE_SCHEMA, TABLE_NAME 
FROM information_schema.VIEWS 
WHERE TABLE_SCHEMA LIKE 'your_db_name';

é melhor trabalhar diretamente com information_schema.VIEWS(observe agora é VIEWS e não TABLES ), assim você pode recuperar mais dados, use DESC VIEWSpara obter mais detalhes:

+----------------------+---------------------------------+------+-----+---------+-------+
| Field                | Type                            | Null | Key | Default | Extra |
+----------------------+---------------------------------+------+-----+---------+-------+
| TABLE_CATALOG        | varchar(64)                     | YES  |     | NULL    |       |
| TABLE_SCHEMA         | varchar(64)                     | YES  |     | NULL    |       |
| TABLE_NAME           | varchar(64)                     | YES  |     | NULL    |       |
| VIEW_DEFINITION      | longtext                        | YES  |     | NULL    |       |
| CHECK_OPTION         | enum('NONE','LOCAL','CASCADED') | YES  |     | NULL    |       |
| IS_UPDATABLE         | enum('NO','YES')                | YES  |     | NULL    |       |
| DEFINER              | varchar(93)                     | YES  |     | NULL    |       |
| SECURITY_TYPE        | varchar(7)                      | YES  |     | NULL    |       |
| CHARACTER_SET_CLIENT | varchar(64)                     | NO   |     | NULL    |       |
| COLLATION_CONNECTION | varchar(64)                     | NO   |     | NULL    |       |
+----------------------+---------------------------------+------+-----+---------+-------+

Por exemplo, observe o VIEW_DEFINITIONcampo, portanto, você pode usar em ação:

SELECT TABLE_SCHEMA, TABLE_NAME, VIEW_DEFINITION 
FROM information_schema.VIEWS 
WHERE TABLE_SCHEMA LIKE 'your_db_name';

Claro que você tem mais campos disponíveis para sua consideração.

Manuel Jordan
fonte
2

Tente mover esse mysql.bakdiretório /var/lib/mysqlpara dizer /root/ou algo assim. Parece que o mysql está descobrindo isso e pode estar causando esse ERROR 1102 (42000): Incorrect database name 'mysql.bak'erro.

Bill Rios
fonte
1

O erro que você vê provavelmente se deve a um diretório não criado no MySQL no diretório de dados do MySQL. O MySQL mapeia a estrutura do banco de dados diretamente no sistema de arquivos, os bancos de dados são mapeados para diretórios e as tabelas são arquivos nesses diretórios.

O nome do banco de dados que não funciona parece suspeito de que alguém copiou o diretório do banco de dados mysql para um backup em algum momento e o deixou no diretório de dados do MySQL. Isso não é um problema, desde que você não tente usar o banco de dados para nada. Infelizmente, o esquema de informações verifica todos os bancos de dados encontrados e descobre que este não é um banco de dados real e fica chateado.

A solução é encontrar o diretório mysql.bak no disco rígido e afastá-lo do MySQL.

Martin Hilton
fonte
0

Outra maneira de encontrar todos os View:

SELECT DISTINCT table_name FROM information_schema.TABLES WHERE table_type = 'VIEW'

Thanh Nguyen
fonte
0

Se você criou alguma exibição nos bancos de dados Mysql, pode simplesmente vê-la como todas as suas tabelas em seu banco de dados específico.

escrever:

--mysql> SHOW TABLES;

você verá uma lista de tabelas e visualizações do seu banco de dados.

Shiv kumar ojha
fonte