# Mit UNION Tabellen der DB ausgeben?



## ByeBye 182971 (29. Juni 2007)

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?


----------



## lmarkus31 (29. Juni 2007)

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:


```
SHOW TABLES;
```

Ansonsten:

```
SHOW TABLES FROM <Datenbankname>
```


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

Mit 

```
SELECT TABLE_NAME 
  FROM USER_TABLES
```

siehst du alle Tabellen, die dir gehören,

mit 


```
SELECT TABLE_NAME 
  FROM ALL_TABLES
```

alle, auf die du Zugriff hast.

Markus


----------



## ByeBye 182971 (29. Juni 2007)

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?


----------



## lmarkus31 (29. Juni 2007)

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:


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


----------



## ByeBye 182971 (29. Juni 2007)

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


----------



## lmarkus31 (29. Juni 2007)

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:


```
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:

```
SELECT spalte1, spalte2
  FROM tabelle
UNION 
SELECT table_name, NULL
  FROM information_schema.tables
 WHERE table_schema='<dbname>'
```

hoffe es hilft,
Markus


----------



## ByeBye 182971 (29. Juni 2007)

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


----------



## lmarkus31 (30. Juni 2007)

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


----------



## ByeBye 182971 (30. Juni 2007)

Naja kann man wohl nichts machen....

Mysql Version weiß ich nicht genauso wenig wie die vorhandenen datenbanken oder tabellen...


----------



## mihi42 (18. April 2008)

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


----------

