2010-03-02 19 views
6

Avendo una sequenza, ho bisogno di scoprire quale table.column ottiene i suoi valori. Per quanto ne so, Oracle non tiene traccia di questa relazione. Quindi, cercare la sequenza nel codice sorgente sarebbe l'unico modo. È giusto?Quale tabella Oracle utilizza una sequenza?

Qualcuno sa in qualche modo di scoprire questa relazione tabella delle sequenze?

+1

Oracle non la tiene traccia perché non esiste tale relazione, tranne che per convenzione. Questo è il motivo per cui di solito usi un qualche tipo di convenzione di denominazione, ad es. la tabella XYZ ha una sequenza SEQ_XYZ. –

risposta

2

Nel database è possibile cercare tutto il codice memorizzato nello schema come questo:

select type, name, line, text 
from all_source 
where owner = 'MYSCHEMA' 
and upper(text) like '%MYSEQ.NEXTVAL%'; 

In SQL Developer, esiste un report per eseguire questa operazione.

+0

Questo non si occuperà di casi come "SELECT MYSEQ. NEXTVAL FROM dual;" – jva

+0

Vero, e questo è sempre un problema con le ricerche di testo. Potresti usare "% MYSEQ%.% NEXTVAL%", ma in tal caso potresti generare falsi positivi per qualcosa come "MYSEQ2.NEXTVAL". Nessuna risposta facile per quello! –

2

Se la sequenza viene utilizzata in un trigger, il trigger verrà elencato nell'elenco "referenziato" della sequenza.

Se la sequenza viene utilizzata solo nelle query del codice sorgente, rispetto a sì, l'esplorazione del codice è l'unico modo.

+0

Se la stored procedure 'sp_something' fa riferimento alla sequenza' seq_something', quindi 'sp_something' apparirà sicuramente nella lista" referenziata da "di' seq_something'? – mcrisc

+0

@ Jaú: sì, lo sarà. – Quassnoi

1

usare grep per la scansione dell'intero fonte per "myseq.NextVal" - myseq essere quello che stai cercando ....

+0

Questo è stato il mio approccio. 'grep -Prine" myseq \. " .' sull'intera base di codice. Il problema è che la gente non ha tutto il codice sotto il controllo della versione. Penso che ci sia un sacco di codice (procedure) memorizzato solo sul database. – mcrisc

+0

Se è possibile riferire solo il codice memorizzato nel DB, quindi provare 'ALL_SOURCE'. Se sei in 10g, usa la funzione 'REGEXP_LIKE' per cercare. – Guru

+0

@Guru è 9i. Comunque, è bene sapere su REGEX_LIKE'. Grazie. – mcrisc

7

Il problema è che Oracle ci consente di utilizzare una sequenza per popolare colonne in più tabelle. Gli scenari in cui ciò potrebbe essere desiderabile includono implementazioni di tipo super-tipo/sottotipo.

È possibile utilizzare le dipendenze nel dizionario dati per identificare le relazioni. Per esempio, se si utilizza i trigger per assegnare i valori, allora questa query vi aiuterà a:

select ut.table_name 
     , ud.referenced_name as sequence_name 
from user_dependencies ud 
     join user_triggers ut on (ut.trigger_name = ud.name) 
where ud.type='TRIGGER' 
and ud.referenced_type='SEQUENCE' 
/

Se si utilizza PL/SQL allora si può scrivere qualcosa di simile per TYPE in ('PACKAGE BODY', 'PROCEDURE', 'FUNCTION'), anche se sarà ancora bisogno di un po 'di pesca a strascico attraverso la sorgente codice per assegnare tabelle e sequenze quando si hanno più accessi.

+0

Se si dispone di nome_di sequenza e si desidera verificare per quali tabelle viene utilizzato tramite trigger, è possibile utilizzare la query sopra con un'altra condizione "e" specificando il nome della sequenza: selezionare ut.table_name , ud.referenced_name as nome_corsa from user_dependencies ud join user_triggers ut su (ut.trigger_name = ud.name) dove ud.type = 'TRIGGER' e ud.referenced_type = 'SEQUENCE' e ud.referenced_name = 'YOUR_SEQ_NAME'; – nanosoft

0

Vorrei aggiungere background informazioni sulle sequenze.

Problemi correlati