Ist es möglich, jedes Feld jeder Tabelle nach einem bestimmten Wert in Oracle zu durchsuchen?
Es gibt Hunderte von Tabellen mit Tausenden von Zeilen in einigen Tabellen, daher weiß ich, dass das Abfragen sehr lange dauern kann. Ich weiß jedoch nur, dass ein Wert für das Feld, für das ich eine Abfrage durchführen möchte, lautet1/22/2008P09RR8
. <
Ich habe versucht, diese Anweisung unten zu verwenden, um eine geeignete Spalte zu finden, die meiner Meinung nach benannt werden sollte, aber es wurden keine Ergebnisse zurückgegeben.
SELECT * from dba_objects
WHERE object_name like '%DTN%'
Es gibt absolut keine Dokumentation in dieser Datenbank und ich habe keine Ahnung, woher dieses Feld stammt.
Irgendwelche Gedanken?
Antworten:
Zitat:
Eine Spalte ist kein Objekt. Wenn Sie meinen, dass der Spaltenname '% DTN%' lautet, lautet die gewünschte Abfrage:
Aber wenn die 'DTN'-Zeichenfolge nur eine Vermutung von Ihrer Seite ist, wird das wahrscheinlich nicht helfen.
Wie sicher sind Sie übrigens, dass '1/22 / 2008P09RR8' ein Wert ist, der direkt aus einer einzelnen Spalte ausgewählt wird? Wenn Sie überhaupt nicht wissen, woher es kommt, kann es sich um eine Verkettung mehrerer Spalten oder um das Ergebnis einer Funktion oder um einen Wert handeln, der sich in einem verschachtelten Tabellenobjekt befindet. Sie könnten also auf einer wilden Gänsejagd sein und versuchen, jede Spalte auf diesen Wert zu überprüfen. Können Sie nicht mit einer Clientanwendung beginnen, die diesen Wert anzeigt, und versuchen, herauszufinden, mit welcher Abfrage sie abgerufen wird?
Wie auch immer, die Antwort von diciu bietet eine Methode zum Generieren von SQL-Abfragen, um jede Spalte jeder Tabelle auf den Wert zu überprüfen. Sie können ähnliche Aufgaben auch vollständig in einer SQL-Sitzung mit einem PL / SQL-Block und dynamischem SQL ausführen. Hier ist ein hastig geschriebener Code dafür:
Es gibt einige Möglichkeiten, wie Sie es auch effizienter gestalten können.
In diesem Fall können Sie angesichts des gesuchten Werts jede Spalte vom Typ NUMBER oder DATE eindeutig entfernen, wodurch die Anzahl der Abfragen verringert wird. Vielleicht beschränken Sie es sogar auf Spalten, in denen der Typ '% CHAR%' ist.
Anstelle einer Abfrage pro Spalte können Sie eine Abfrage pro Tabelle wie folgt erstellen:
quelle
all_tab_columns
nicht gefahren worden seinall_tables
. Ich habe es behoben.Ich habe den obigen Code geändert, damit er schneller funktioniert, wenn Sie nur in einem Eigentümer suchen. Sie müssen nur die 3 Variablen v_owner, v_data_type und v_search_string ändern, um sie an Ihre Suche anzupassen.
quelle
'SELECT COUNT(*) FROM "'||t.table_name||'" WHERE "'||t.column_name||'" = :1'
dbms_output
? Weil die Abfragen erfolgreich in DataGrip ausgeführt werden, aber ich sehe kein Ergebnis danach.Hier ist eine weitere modifizierte Version, die eine niedrigere Teilzeichenfolgenübereinstimmung vergleicht. Dies funktioniert in Oracle 11g.
quelle
Ja, das können Sie und Ihr DBA wird Sie hassen und Sie finden, dass Sie Ihre Schuhe auf den Boden nageln, da dies viele E / A-Vorgänge verursacht und die Datenbankleistung beim Löschen des Caches erheblich beeinträchtigt.
für den Anfang.
Ich würde mit den laufenden Abfragen beginnen, indem ich das
v$session
und das verwendev$sqlarea
. Dies ändert sich basierend auf der Oracle-Version. Dies wird den Raum einschränken und nicht alles treffen.quelle
Ich weiß, dass dies ein altes Thema ist. Aber ich sehe einen Kommentar zu der Frage, ob dies in
SQL
statt in Verwendung getan werden könntePL/SQL
. Also dachte ich mir eine Lösung zu posten.Die folgende Demonstration dient zur Suche nach einem Wert in allen Spalten aller Tabellen in einem gesamten Schema :
Lassen Sie uns nach dem Wert
KING
imSCOTT
Schema suchen .Lassen Sie uns nach dem Wert
20
imSCOTT
Schema suchen .quelle
Error occurred in XML processing ORA-00932: inconsistent datatypes: expected NUMBER got BLOB
Ich würde so etwas tun (generiert alle Auswahlen, die Sie benötigen). Sie können sie später an sqlplus weiterleiten:
Es ergibt:
Und was es tut, ist - für jedes
table_name
vonuser_tables
jedes Feld abrufen (von desc) und eine Auswahl * aus der Tabelle erstellen, wobei das Feld gleich 'val' ist.quelle
Ich habe das Skript von Flood so geändert, dass es für jede Tabelle einmal ausgeführt wird und nicht für jede Spalte jeder Tabelle, um die Ausführung zu beschleunigen. Es erfordert Oracle 11g oder höher.
quelle
Ich hatte folgende Probleme mit der Antwort von @Lalit Kumars:
Lösung ist:
quelle
Wenn wir die Tabellen- und Spaltennamen kennen, aber herausfinden möchten, wie oft eine Zeichenfolge für jedes Schema angezeigt wird:
quelle
Verfahren zum Durchsuchen der gesamten Datenbank:
Anweisung ausführen
Probenergebnisse
quelle
Ich habe keine einfache Lösung für den SQL-Promprt. Es gibt jedoch einige Tools wie toad und PL / SQL Developer, die über eine GUI verfügen, über die ein Benutzer die zu durchsuchende Zeichenfolge eingeben kann und die Tabelle / Prozedur / das Objekt zurückgibt, in der bzw. der diese gefunden wird.
quelle
Es gibt einige kostenlose Tools, mit denen diese Art der Suche durchgeführt werden kann. Diese funktioniert beispielsweise einwandfrei und der Quellcode ist verfügbar: https://sites.google.com/site/freejansoft/dbsearch
Sie benötigen den Oracle ODBC-Treiber und einen DSN, um dieses Tool verwenden zu können.
quelle
Ändern des Codes, um mithilfe einer LIKE-Abfrage die Groß- und Kleinschreibung nicht zu berücksichtigen, anstatt genaue Übereinstimmungen zu finden ...
quelle
- Es wurde ausgeführt - kein Fehler
quelle
Das Ausleihen, leichte Verbessern und Vereinfachen von diesem Blog-Beitrag scheint die folgende einfache SQL-Anweisung recht gut zu machen:
quelle
quelle