Mit UNION Tabellen der DB ausgeben?

B

ByeBye 182971

Hi Leute,

wie kann ich alle tabellennamen einer Datenbank per SQL Commando anzeigen lassen?

ICh hab es versucht mit UNION SHOW ALL

aber das geht irgendwie nicht...

gibt es eine Möglichkeit?
 
Hallo,

UNION hat damit nichts zu tun.

UNION benutzt man, um die Ergebnisse mehrere Teilabfragen miteinander zu verschmelzen.

Was du meinst funktioniert so:

In MySQL, wenn du dich bereits "in" einer Datenbank befindest:

SQL:
SHOW TABLES;

Ansonsten:
SQL:
SHOW TABLES FROM <Datenbankname>


In Oracle kommt es auf den User an, mit dem du angemeldet bist:

Mit
SQL:
SELECT TABLE_NAME 
  FROM USER_TABLES

siehst du alle Tabellen, die dir gehören,

mit

SQL:
SELECT TABLE_NAME 
  FROM ALL_TABLES

alle, auf die du Zugriff hast.

Markus
 
Nein ich mach das ganze so:

$sql = "SELECT * FROM table WHERE id=1 UNION SHOW TABLES";

Dann wird die MYSQL anfrage ausgewertet ist das möglich?
 
Hallo,

SHOW TABLES ist kein Standard-SQL und auch kein SELECT, deswegen lässt es sich nicht mit UNIONs kombinieren.

Was soll dein Statement denn eigentlich bewirken?
Alle Tabellennamen liefern? Das hab ich in meinem ersten Post schon beschrieben.

Es gibt allerdings noch eine dritte Möglichkeit, an die Tabellennamen per SELECT heranzukommen, falls dir das etwas bringt:

SQL:
SELECT table_name 
  FROM INFORMATION_SCHEMA.TABLES
 WHERE table_schema = '<db_name>'

Wenn aber das Statement, was du grad gepostet hast funktionieren soll,
müsste der erste Teil der Abfrage, also dein "SELECT * FROM tabelle" genau die gleiche Spaltenstruktur zurückliefern wie das "SHOW TABLES".

Erklär doch einfach noch einmal, was du genau möchtest.

Markus
 
Ich möchte alle tabellennamen in einer datenbank erfahren aber ich muss das ganze an einen SELECT befehl hängen aus diversen gründen
 
Hallo,

ok, wie ich schon geschrieben hab bleibt dir die Abfrage mittels INFORMATION_SCHEMA.

Wenn du die Abfragen unbedingt per UNION mergen möchtest, dann musst du für die gleiche Spaltenstruktur sorgen.

z.B. so:

SQL:
SELECT spalte
  FROM tabelle
UNION 
SELECT table_name
   FROM information_schema.tables
 WHERE table_schema='<dbname'>

Falls die erste Abfrage anders aussieht, musst du den zweiten Teil der Abfrage mit Spalten auffüllen, damit das UNION funktioniert.

Etwa so:
SQL:
SELECT spalte1, spalte2
  FROM tabelle
UNION 
SELECT table_name, NULL
  FROM information_schema.tables
 WHERE table_schema='<dbname>'

hoffe es hilft,
Markus
 
Also erstmal danke für deine ausgiebige Hilfe.

Wenn ich den Query anhänge kommt:
Access denied for user 'd004a739'@'localhost' to database 'information_schema'

das is glaub ich nicht umgänglich oder
 
Hallo,

welche MySQL-Version setzt du denn ein und schränkst du die Tabellen, die du sehen möchtest in der SELECT-Klausel auf deine eigene Datenbank ein?
Es könnte ein Berechtigungsproblem sein, aber eigentlich sollte jeder Zugriff auf die Metadaten seines eigenen Schemas haben. Mhm...
Mehr fällt mir im Moment dazu nicht ein.

Markus
 
Naja kann man wohl nichts machen....

Mysql Version weiß ich nicht genauso wenig wie die vorhandenen datenbanken oder tabellen...
 
Gerade den Thread mit Google gefunden, nette Methode mit dem Information_Schema - kannte ich bisher nur von MSSQL :)

Wenn du nicht weißt welche MySql-Version du hast, dann probier mal "SELECT Version()" aus. Username() zu selecten ist auch ne gute Idee, weil manchmal soll der sogar 'root' sein. Für konstante Strings bietet sich char(30,31,32,33) statt '0123' an, wenn Hochkommas gefiltert werden.

Für deinen Verwendungszweck könnte "group_concat()" auch ganz praktisch sein, weil häufig bekommt man vom Ergebnis nur die erste Zeile. Und ein Googlen nach "blind SQL injection" findet sogar Tricks wie man mit viel Trial&Error selbst dann Ergebnisse aus der DB bekommen kann, wenn man keine einzige Zeile der Ausgabe erhält (sondern beispielsweise nur die Zeit die sie brauchte oder den Rowcount des Ergebnisses). BENCHMARK() in IF() verpacken heißt das Zauberwort, das dauert ne Weile wenn das IF zutrifft.

Achja, immer schön legal bleiben und keine Daten ausspähen oder verändern, wenn du vom Eigentümer der DB nicht die Erlaubnis dazu hast. (Meiner Erfahrung nach ist es aber manchmal hilfreich, Daten aus der DB vorzeigen zu können, wenn der "verursachende" Programmierer seine Sicherheitslücken nicht einsieht).

mihi
 
Zurück