94451
Goto Top

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
select * from all_tab_columns where column like '278389';  
klappt nicht

ach ja,... bevor jemand seine bedenken ausdrückt... das ist nur für mich, ich suche nach verknüpfungen!

Vielen Dank

Content-Key: 272257

Url: https://administrator.de/contentid/272257

Ausgedruckt am: 28.03.2024 um 11:03 Uhr

Mitglied: Biber
Biber 18.05.2015 um 18:09:17 Uhr
Goto Top
[OT]
Zitat von @94451:
> ... das ist nur für mich, ich suche nach verknüpfungen!
Und du meinst, mit derlei Jokes knüpfst du hier Kontakte? Mit ITlerInnen??

Werde interessiert der ersten Kontaktaufnahme zuschauen.

Biber
[/OT]
Mitglied: Maffi
Maffi 18.05.2015 um 21:55:17 Uhr
Goto Top
Hey Roadrunner,

ich bin kein Profi, und arbeite nur wenig mit MySQL, mir würde nur einfallen, die Tabellennamen mit einem , auszuwählen.

select * from tabelle1,tabelle2,tabelle2 where column like '278389';

wird bei 500 Tabellen natürlich ganz schön lang.
Mitglied: 94451
94451 19.05.2015 um 07:30:31 Uhr
Goto Top
Biber war bisher immer sehr Hilfsbereit... was is denn heute los?

kurze erklärung für dich:
Ich habe hier ein sehr altes System das leider in sich geschlossen ist (d.h. ich komme auf die querys nicht mehr).

Jetzt wollten wir ein neues Systemaufbauen, trotzdem aber mit den daten der alten Datenbanken weiterarbeiten.

Die Verknüfpungen / Joins sind mir leider gänzlich unbekannt... So bleibt mir also nur nachzuvollziehen "Wo", "Welche" ID, Referanznummer,... verwendet wird um wieder einen "Vollständigen" Datensatz zu haben...

Ich verwende dazu den SQL-Developer um eine suche auszuführen... in das "neue" Program kommen nur Saubere Joins...

das mit den Bedenken habe ich geäußert, weil mir bewusst ist, das so eine Abfrage die Datenbank stresst... ist aber wie gesagt nur um zu verstehen was passiert!
Mitglied: ukulele-7
ukulele-7 19.05.2015 um 08:11:40 Uhr
Goto Top
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.
Mitglied: Biber
Biber 19.05.2015, aktualisiert am 21.05.2015 um 10:07:35 Uhr
Goto Top
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.
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
Mitglied: 94451
94451 21.05.2015 um 09:05:44 Uhr
Goto Top
Hallo,

Danke,... leider sind es 3,4TB und das ohne Indizierung face-sad ...

ich beiß mich mal durch...

=> Leider gibt es tatsächlich keine vernünftige Dokumentation face-sad aber das solls ja immer wieder geben (auch bei den großen)

Grüßle