Wie erhalte ich eine Liste der MySQL-Ansichten?

127

Ich suche nach einer Möglichkeit, alle Ansichten in einer Datenbank aufzulisten.

Anfangs habe ich in den MySQL-Foren eine Antwort gefunden und versucht :

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

Dies funktioniert jedoch nicht und gibt einen leeren Satz zurück. (Ich weiß, dass sie da drin sind!)

Diese scheitern auch:

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'

Warum funktioniert das nicht?

AnnanFay
quelle
Link dies kann helfen
SHASHI SHEKHAR Barnwal

Antworten:

27

So finden Sie alle Ansichten in jeder Datenbank Ihrer Instanz:

SELECT TABLE_SCHEMA, TABLE_NAME 
FROM information_schema.tables 
WHERE TABLE_TYPE LIKE 'VIEW';
Valerie Parham-Thompson
quelle
4
Wenn Sie die Suche auf eine bestimmte Datenbank beschränken möchten, um eine Antwort auf die gestellte Frage zu erhalten, fügen Sie hinzu AND TABLE_SCHEMA LIKE 'database_name'.
Gruber
Um weitere Daten über die Ansicht zu ergänzen oder abzurufen, beachten Sie: stackoverflow.com/questions/2834016/…
Manuel Jordan
7
 select * FROM information_schema.views\G; 
zloctb
quelle
7

Das wird funktionieren.

    USE INFORMATION_SCHEMA;
    SELECT TABLE_SCHEMA, TABLE_NAME
    FROM information_schema.tables
    WHERE TABLE_TYPE LIKE 'VIEW';
Sameera Sampath
quelle
2
Dies ist besser, da ich es manipulieren kann, um mit concat 'SHOW CREATE' zu erstellen.
Moshe L
1
Gleiche Antwort alsValerie Parham-Thompson
Manuel Jordan
5

Als Ergänzung erhalten Sie weitere Informationen zu einer bestimmten Ansicht

Auch mit den beiden gültigen Antworten

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';

Sie können Folgendes anwenden (ich denke, es ist besser):

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

Es ist besser, direkt mit zu arbeiten information_schema.VIEWS(beobachten Sie jetzt VIEWS und nicht mehr TABLES ), sodass Sie mehr Daten abrufen und DESC VIEWSfür weitere Details verwenden können:

+----------------------+---------------------------------+------+-----+---------+-------+
| 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    |       |
+----------------------+---------------------------------+------+-----+---------+-------+

Beobachten VIEW_DEFINITIONSie zum Beispiel das Feld, damit Sie es in Aktion verwenden können:

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

Natürlich stehen Ihnen mehr Felder zur Verfügung.

Manuel Jordan
quelle
2

Versuchen Sie, dieses mysql.bakVerzeichnis /var/lib/mysqlzu verschieben, um /root/etwas zu sagen oder so. Es scheint, als ob MySQL das findet und es könnte diesen ERROR 1102 (42000): Incorrect database name 'mysql.bak'Fehler verursachen.

Bill Rios
quelle
1

Der Fehler, den Sie sehen, ist wahrscheinlich auf ein nicht von MySQL erstelltes Verzeichnis im Datenverzeichnis von MySQL zurückzuführen. MySQL ordnet die Datenbankstruktur ziemlich direkt dem Dateisystem zu, Datenbanken werden Verzeichnissen zugeordnet und Tabellen sind Dateien in diesen Verzeichnissen.

Der Name der nicht funktionierenden Datenbank sieht verdächtig aus, als hätte jemand das MySQL-Datenbankverzeichnis irgendwann in eine Sicherung kopiert und im Datenverzeichnis von MySQL belassen. Dies ist kein Problem, solange Sie nicht versuchen, die Datenbank für irgendetwas zu verwenden. Leider durchsucht das Informationsschema alle gefundenen Datenbanken und stellt fest, dass es sich bei dieser Datenbank nicht um eine echte Datenbank handelt, und ist verärgert.

Die Lösung besteht darin, das Verzeichnis mysql.bak auf der Festplatte zu finden und es weit weg von MySQL zu verschieben.

Martin Hilton
quelle
0

Eine andere Möglichkeit, alle Ansichten zu finden:

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

Thanh Nguyen
quelle
0

Wenn Sie eine Ansicht in MySQL-Datenbanken erstellt haben, können Sie diese einfach so anzeigen, wie Sie alle Tabellen in Ihrer bestimmten Datenbank sehen.

schreiben:

--mysql> SHOW TABLES;

Sie sehen eine Liste der Tabellen und Ansichten Ihrer Datenbank.

Shiv Kumar Ojha
quelle