94451
18.05.2015, aktualisiert um 17:44:43 Uhr
19420
6
0
Alle Datenbanken und Felder nach ID durchsuchen
Hallo,
Ich habe eine "sehr" eindeutige ID... und ca. 500 Tabellen...
gibt es eine möglichkeit bei Oracle SQL alle Tabellen und alle Felder nach dieser ID zu durchsuchen und mir die Tabellen und Spalten zurückzugeben?
meine idee
klappt nicht
Vielen Dank
Ich habe eine "sehr" eindeutige ID... und ca. 500 Tabellen...
gibt es eine möglichkeit bei Oracle SQL alle Tabellen und alle Felder nach dieser ID zu durchsuchen und mir die Tabellen und Spalten zurückzugeben?
meine idee
select * from all_tab_columns where column like '278389';
ach ja,... bevor jemand seine bedenken ausdrückt... das ist nur für mich, ich suche nach verknüpfungen!
Vielen Dank
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-Key: 272257
Url: https://administrator.de/contentid/272257
Ausgedruckt am: 28.03.2024 um 11:03 Uhr
6 Kommentare
Neuester Kommentar
Ich kenne mich mehr mit MSSQL aus. Dort gibt es eine Systemtabelle die alle Tabellennamen und Spaltennamen beinhaltet und ich weiß das Oracle auch soetwas hat, ich glaube es geht per SELECT * FROM all_objects oder so. Mit dieser Information und dynamischen SQL ließe sich ein Script bauen das für jede Tabelle einen SELECT a la:
SELECT 'tabellenname','spaltenname',spalte_a AS wert FROM tabelle_a WHERE spalte_a LIKE '%wert%' UNION ALL
SELECT 'tabellenname','spaltenname',spalte_b AS wert FROM tabelle_a WHERE spalte_b LIKE '%wert%' UNION ALL
SELECT 'tabellenname','spaltenname',spalte_a AS wert FROM tabelle_b WHERE spalte_a LIKE '%wert%' UNION ALL
usw.
Wobei natürlich die verschiedenen Datentypen noch mit berücksichtigt werden müssen.
Das ist ne menge Aufwand, auch oder grade mit dynamischem SQL. Sollte aber machbar sein.
SELECT 'tabellenname','spaltenname',spalte_a AS wert FROM tabelle_a WHERE spalte_a LIKE '%wert%' UNION ALL
SELECT 'tabellenname','spaltenname',spalte_b AS wert FROM tabelle_a WHERE spalte_b LIKE '%wert%' UNION ALL
SELECT 'tabellenname','spaltenname',spalte_a AS wert FROM tabelle_b WHERE spalte_a LIKE '%wert%' UNION ALL
usw.
Wobei natürlich die verschiedenen Datentypen noch mit berücksichtigt werden müssen.
Das ist ne menge Aufwand, auch oder grade mit dynamischem SQL. Sollte aber machbar sein.
Moin Roadrunner777,
okay, sorry, ich habe zwar geahnt, dass dich sicherlich nur die allergrösste Not zu so einem Vorgehen treiben kann, aber - bei aller Fantasie - ich konnte es mir nicht vorstellen, dass jemand eine absolut undokumentierte Datenbank mit 500 Tabellen erbt, in der jede Tabellenstruktur nur aus drei Feldern "ID", "Wert" und "Datum" besteht und alle DB-Objekte nach dem Wert "4711" abgegrast werden müssen.
Meine ersten Versuche des reverse engineering wären wahrscheinlich über die Ermittlung von Foreignkey-Constraints gegangen, aber vielleicht sind ja diese gar nicht vorhanden.
Okay, die Skizze von ukulele-7 sähe unter Oracle in etwa so aus.
-> dieses Beispielkonstrukt würde - allerdings für eine IMHO sinnvolle Untermenge, nämlich alle Felder mit dem Namen "KST_ID" eine Abfrage zusammenharken, deren Resultset so aussieht:
Dat Dingen kannst du kopieren, im SQLDeveloper abfeuern und schauen, wo Fundstellen sind.
Gut, das "union all" in der letzten Zeile solltest du noch löschen.
Ebenso kannst du natürlich die Bedingung
ZB nach allen COLUMN_NAMEs suchen, die vom Typ INTEGER oder vom Typ VARCHAR2 sind oder alle Feldnamen, die den Text "BESTELL" enthalten.
Aber dennoch denke ich, ein paar mehr begründete Verdachtsmomente solltest du schon vorher haben, wo denn etwas zu untersuchen sein könnte.
Jemand einen 20-GByte-Datenklumpen in die Hand zu drücken und dann sagen "Da steht irgendwo die ID 4711 drin, kannst du die eben mal rausflöhen?"- das hat nix mit Datenbanken zu tun.
Grüße
Biber
okay, sorry, ich habe zwar geahnt, dass dich sicherlich nur die allergrösste Not zu so einem Vorgehen treiben kann, aber - bei aller Fantasie - ich konnte es mir nicht vorstellen, dass jemand eine absolut undokumentierte Datenbank mit 500 Tabellen erbt, in der jede Tabellenstruktur nur aus drei Feldern "ID", "Wert" und "Datum" besteht und alle DB-Objekte nach dem Wert "4711" abgegrast werden müssen.
Meine ersten Versuche des reverse engineering wären wahrscheinlich über die Ermittlung von Foreignkey-Constraints gegangen, aber vielleicht sind ja diese gar nicht vorhanden.
Okay, die Skizze von ukulele-7 sähe unter Oracle in etwa so aus.
select
'SELECT '''||table_name||'.'||column_name || ''' as tabCol, count(*) as Anzahl from '|| table_name ||' Where '||column_name|| ' = '|| ' 4711 union all ' as ddl
from user_tab_columns where column_name like 'KST_ID%' ;
-> dieses Beispielkonstrukt würde - allerdings für eine IMHO sinnvolle Untermenge, nämlich alle Felder mit dem Namen "KST_ID" eine Abfrage zusammenharken, deren Resultset so aussieht:
SELECT 'TABELLE_A.KST_ID' as tabCol, count(*) as Anzahl from TABELLE_A Where KST_ID = 4711 union all
SELECT 'TABELLE_B.KST_ID' as tabCol, count(*) as Anzahl from TABELLE_B Where KST_ID = 4711 union all
SELECT 'TABELLE_C.KST_ID' as tabCol, count(*) as Anzahl from TABELLE_C Where KST_ID = 4711 union all
SELECT 'TABELLE_D.KST_ID' as tabCol, count(*) as Anzahl from TABELLE_D Where KST_ID = 4711 union all
...
Dat Dingen kannst du kopieren, im SQLDeveloper abfeuern und schauen, wo Fundstellen sind.
Gut, das "union all" in der letzten Zeile solltest du noch löschen.
Ebenso kannst du natürlich die Bedingung
"...from user_tab_columns where column_name like 'KST_ID%' "
anpassen.ZB nach allen COLUMN_NAMEs suchen, die vom Typ INTEGER oder vom Typ VARCHAR2 sind oder alle Feldnamen, die den Text "BESTELL" enthalten.
Aber dennoch denke ich, ein paar mehr begründete Verdachtsmomente solltest du schon vorher haben, wo denn etwas zu untersuchen sein könnte.
Jemand einen 20-GByte-Datenklumpen in die Hand zu drücken und dann sagen "Da steht irgendwo die ID 4711 drin, kannst du die eben mal rausflöhen?"- das hat nix mit Datenbanken zu tun.
Grüße
Biber