Alle Indexes von Oracle-Tabellen

Hallo,
ich möchte gerne mehr über die Tabellen-Struktur einer
Oracle-Instanz wissen.

Dazu zählt natürlich auch die Abfrage über deren Index und ob
der Unique oder Nonunique ist.

Dummerweise habe ich mit meinem User keinen Zugriff auf die dba_*
Tabellen.
Ich sehe nur die user_*-Tabellen.

Wie bekomme ich denn raus, ob ein Index unique ist oder nicht?

Momentan sieht mein Select so aus:

select INDEX_NAME, TABLE_NAME, COLUMN_NAME, user_ind_columns.COLUMN_POSITION, DESCEND
from user_ind_columns
group by INDEX_NAME, TABLE_NAME, COLUMN_NAME, COLUMN_POSITION, DESCEND
order by table_name, COLUMN_POSITION

Gruss
Sina

falls ich dich richtig verstanden habe, dann stehen die infos in user_indexes

select index_name, index_type, uniqueness, table_name from user_indexes;

unique indexe werden automatisch erstellt bei Primary_key oder unique constraints

grüße

chris

Hallo Sina!

Dummerweise habe ich mit meinem User keinen Zugriff auf die
dba_*
Tabellen.
Ich sehe nur die user_*-Tabellen.

Das ist eigentlich egal, wenn dich nur die Schemadaten (hier Tabellen und Indices interessieren, die im aktuellen User liegen. Für Schemadaten anderer User gibt’s dann noch die ALL_*-Views, allerdings liefern die dann nur Daten, auf die du laut Privileges auch Zugriff hast…

Wie bekomme ich denn raus, ob ein Index unique ist oder nicht?

Das steht in *_INDEXES

Momentan sieht mein Select so aus:

select INDEX_NAME, TABLE_NAME, COLUMN_NAME,
user_ind_columns.COLUMN_POSITION, DESCEND
from user_ind_columns
group by INDEX_NAME, TABLE_NAME, COLUMN_NAME,
COLUMN_POSITION, DESCEND
order by table_name, COLUMN_POSITION

Und so siehst du die Uniqueness:

select i.index_name, i.uniqueness, i.table_name, c.column_name, c.column_position, c.descend
from user_indexes i, user_ind_columns c
where i.index_name=c.index_name
order by i.table_name, c.column_position;

Gruß,
Martin

Hier das Ganze noch etwas übersichtlicher (vor allem mit brauchbarer Sortierung):

select decode(c.column\_position, 1, i.index\_name, null),
 decode(c.column\_position, 1, i.uniqueness, null),
 decode(c.column\_position, 1, i.table\_name, null),
 c.column\_name,
 c.column\_position,
 c.descend
from user\_indexes i, user\_ind\_columns c
where i.index\_name=c.index\_name
order by i.table\_name, i.index\_name,c.column\_position;

Gruß,
Martin

hi!

ergänzung zur antwort von chris:

select INDEX_NAME, TABLE_NAME, COLUMN_NAME,
user_ind_columns.COLUMN_POSITION, DESCEND

hier ein: user_indexes.unique

from user_ind_columns

und hier noch ein : user_indexes dranfügen

mit der where clause: user_indexes.index_name=user_ind_columns.index_name

group by INDEX_NAME, TABLE_NAME, COLUMN_NAME,
COLUMN_POSITION, DESCEND
order by table_name, COLUMN_POSITION

grüße,
tomh

ps: es hilft dir allerdings nix, wenn „dein“ user die inidizes gar nicht besitzt …

pps: hast du es mal mit sys.dba_… oder system.all_* probiert?

*grmpf* eine minute schneller :wink:

grüße,
tomh

ps: ein „set line 200“ und die felder noch mit substr auf die richtige größe geschrumpft wäre noch elegant gewesen :smile:

Hmmm, danke schön Blondinenfreundlich :wink:))

Sieht nun aus, als hätte ichs drauf :wink:

Sina