Wie kann man billig die Existenz einer Spalte in einer Tabelle mit Oracle in einem anderen Schema validieren?

StackOverflow https://stackoverflow.com/questions/1646953

Frage

Die Umgebung ist Oracle 9 und 10. Ich habe keine DBA Level-Zugriff haben.

Das Problem ist, zu überprüfen, ob eine bestimmte Spalte in einer bestimmten Tabelle vorhanden ist, in einem anderen Schema.

Es gibt zwei Fälle zu behandeln.

  1. Ein anderes Schema in der gleichen Instanz
  2. Ein Schema in einem anderen Beispiel mit einem db_link

Da mein Schema FRED und ein anderes Schema KRACH, habe ich versucht, so etwas wie diese

SELECT 1
FROM BARNEY.USER_TAB_COLS
WHERE TABLE_NAME = 'SOME_TABLE' 
  AND COLUMN_NAME = 'SOME_SPECIFIC_COLUMN'

Welche ergab [1]: (Error): ORA-00942: Tabelle oder Sicht ist nicht vorhanden

auf diese eine Weile Nach vegging, erkannte ich, dass USER_TAB_COLS, ist nicht wirklich ein Tisch. Es ist eine Ansicht. Ich habe aus den Tabellen entlang der Auswahl, aber nicht aus einer Ansicht.

habe ich versucht, das Gleiche mit meinem db_link, und war überrascht, Daten zurückkommen zu sehen. Ein db_link verfügt über einen integrierten schema_name / Passwort drin, so ist es mir vernünftig erscheint, dass es funktioniert, weil es schnell, zum anderen Schema protokolliert, die die Ansichten erreichbar machen soll.

Nachdem um gegoogelt und abgenutzte meine Augäpfel auf auf dem Berg von Oracle doc, Ich suche jemanden, der mir in die richtige Richtung weisen, oder zumindest darauf hinweisen, was mir fehlt.

Welche Techniken sind für immer Benutzertabelle bezogenen Metadaten aus einem Schema in der gleichen Instanz, um zu bestätigen, dass eine bestimmte Spalte vorhanden ist?

Vielen Dank im Voraus.

Evil.

1 für gute Antworten. Danke.

War es hilfreich?

Lösung

Wie bei den anderen Antworten, normalerweise verwende ich ALL_TAB_COLUMNS für eine Abfrage wie folgt. Aber das zeigt nur Spalten in Tabellen, in denen Sie SELECT haben. Und es ist wählen Sie auf dieser Spalte - in dem unwahrscheinlichen Fall, dass sie auf Spaltenebene Privilegien für die Tabelle implementiert haben, können Sie in der Lage sein, um die Tabelle zu sehen, aber nicht die spezifische Spalte von Interesse sehen. Für die meisten von uns, das ist äußerst selten.

DBA_TAB_COLUMNS werden alle Spalten, aber Sie müssen auswählen, die auf es zu einem Schema von Ihrem DBA gewährt. (Eigentlich, werden Sie einen Zuschuss auf ALL_TAB_COLUMNS brauchen, es zu benutzen, aber das ist häufig in den meisten Geschäften). Das DBMS_METADATA PL / SQL-Built-in-Paket kann auch verwendet werden, mit ähnlichen Einschränkungen, aber ich denke, Sie finden es komplizierter.

Natürlich können Sie auch nur versuchen, einen Datensatz aus barney.some_table.some_column@my_dblink auswählen (oder was auch immer Stücke, dass Sie daran interessiert sind). Und dann die Ausnahme behandeln. Hässlich, ich würde es in den meisten Fällen nicht empfehlen.

Andere Tipps

Sie können die folgende Abfrage verwenden:

SELECT 1
FROM ALL_TAB_COLS
WHERE TABLE_NAME = 'SOME_TABLE' 
  AND COLUMN_NAME = 'SOME_SPECIFIC_COLUMN'
  AND OWNER = 'BARNEY';

(USER_TABLES und User_Tab_Cols Ansichten sind nur auf ALL_TABLES und all_tab_coumns mit einem where owner = <Current User> daran befestigt)

Wenn Sie erlaubt sind die Barneys some_table zu sehen (das heißt Sie haben mindestens SELECT-Berechtigungen für sie erteilt worden ist), dann werden Sie wissen, wenn die Spalte gibt. Wenn Sie keine Rechte auf dem Tisch haben, werden Sie nicht in der Lage sein, Meta-Informationen über sie zu erhalten.

Sie würden all_tab_columns dafür.

Aber Vorsicht, dass Sie nur sehen, was Sie sehen dürfen.

Die gleiche Beispiel verschiedene Schemata:

Select Count(*)
From   all_tab_cols
Where  owner       = 'BARNEY'               and
       table_name  = 'SOME_TABLE'           and
       column_name = 'SOME_SPECIFIC_COLUMN';

Der Graf (*) hat den Vorteil, immer eine einzelne Zeile mit einem Wert von entweder 1 oder 0 zurückkehrt, so dass Sie sich nicht mit NO_DATA_FOUND Fehlern in PL / SQL befassen.

Durch einen DB Link gleichen Schema wie die Verbindung Sie:

Select Count(*)
From   user_tab_cols@MY_DB_LINK
Where  table_name  = 'SOME_TABLE'           and
       column_name = 'SOME_SPECIFIC_COLUMN';

Durch einen DB Link anderes Schema als das verbinden Sie:

Select Count(*)
From   all_tab_cols@MY_DB_LINK
Where  owner       = 'BARNEY'               and
       table_name  = 'SOME_TABLE'           and
       column_name = 'SOME_SPECIFIC_COLUMN';
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top