2013-06-17 13 views
9

Użyłem tej kwerendy do pobrania listy sekwencji należących do użytkownika bazy danych Oracle:Znalezienie sekwencje i wyzwalaczy związane z tabeli Oracle

SELECT * FROM all_sequences x,all_tables B 
WHERE x.sequence_owner=B.owner AND B.TABLE_NAME='my_table'; 

Ale to użytkownik bazy danych jest o wiele więcej sekwencję również, więc zapytanie zwraca mi całą sekwencję użytkownika bazy danych. Czy ktoś może mi pomóc znaleźć konkretną sekwencję my_table za pomocą kwerendy, dzięki czemu mogę uzyskać identyfikator automatycznego przyrostu w mojej aplikacji.

+2

Sekwencja nie jest bezpośrednio powiązana z tabelą, tylko pośrednio przez wyzwalacz lub instrukcję jawnego wstawiania (która może znajdować się w przechowywanej procedurze/pakiecie). Ponieważ wspominasz o "auto increment", prawdopodobnie szukasz spustu, który ustawia wartość; ale nie musisz o tym wiedzieć, identyfikator zostanie ustawiony automatycznie w tle. Jeśli nie masz konwencji nazewnictwa, która wiąże nazwę sekwencji z nazwą tabeli, musisz przeszukać kod wyzwalacza (w 'all_source'), jeśli jest on dla ciebie widoczny, i opracować tabelę, która - łatwiej zadać drugiemu użytkownik, może? –

+0

Właściwie chcę kwerendy, które pobierają listę tabel mojego użytkownika bazy danych z sekwencji i wyzwalaczy używanych w tabela. – user2492525

+2

@ user2492525, * nie ma * możliwości sprawdzenia, które sekwencje są używane dla dowolnej tabeli, ponieważ Oracle nie utrzymuje żadnego połączenia między nimi.Twoja aplikacja * może * używać wyzwalaczy do zapełniania identyfikatorów, w takim przypadku przydatna może być odpowiedź Alexa Poole'a; lub inna aplikacja może w ogóle nie używać wyzwalaczy i wywoływać sekwencję w kodzie aplikacji. Podsumowując, nie ma ogólnego rozwiązania twojego problemu. –

Odpowiedz

7

chcę kwerendy który pobierał listę tabeli mojej bazy danych użytkownika z sekwencji i wyzwalacze stosowanego w tabeli

Można uzyskać wyzwalacze skojarzone z tabel z widoku user_triggers. Następnie możesz wyszukać zależności zarejestrowane dla tych wyzwalaczy w user_dependencies, które mogą zawierać obiekty inne niż sekwencje (pakiety itp.), Więc dołączenie tych zależności do widoku user_sequences wyświetli tylko te, które Cię interesują.

coś jak to, zakładając, że patrząc na swojego schematu, a ty jesteś tylko interesujące w wyzwalaczy, która odwołuje się sekwencje (które nie są koniecznie robi „auto przyrostu”, ale mogą być):

select tabs.table_name, 
    trigs.trigger_name, 
    seqs.sequence_name 
from user_tables tabs 
join user_triggers trigs 
    on trigs.table_name = tabs.table_name 
join user_dependencies deps 
    on deps.name = trigs.trigger_name 
join user_sequences seqs 
    on seqs.sequence_name = deps.referenced_name; 

SQL Fiddle demo.

Jeśli faktycznie patrzysz na inny schemat, musisz użyć all_tables itd. I filtrować i dołączać do kolumny właściciela dla użytkownika, którego szukasz. A jeśli chcesz uwzględnić tabele bez wyzwalaczy lub wyzwalacze, które nie odnoszą się do sekwencji, możesz użyć sprzężeń zewnętrznych.


Wersja szukasz innego schematu, choć zakłada masz privs niezbędne do uzyskania dostępu do danych słownika informacji - że tabele itp są widoczne dla was, które nie mogą być:

select tabs.table_name, 
    trigs.trigger_name, 
    seqs.sequence_name 
from all_tables tabs 
join all_triggers trigs 
    on trigs.table_owner = tabs.owner 
    and trigs.table_name = tabs.table_name 
join all_dependencies deps 
    on deps.owner = trigs.owner 
    and deps.name = trigs.trigger_name 
join all_sequences seqs 
    on seqs.sequence_owner = deps.referenced_owner 
    and seqs.sequence_name = deps.referenced_name 
where tabs.owner = '<owner>'; 

Jeśli nie można ich zobaczyć to może trzeba spojrzeć na widoki DBA, ponownie, jeśli masz wystarczających privs:

select tabs.table_name, 
    trigs.trigger_name, 
    seqs.sequence_name 
from dba_tables tabs 
join dba_triggers trigs 
    on trigs.table_owner = tabs.owner 
    and trigs.table_name = tabs.table_name 
join dba_dependencies deps 
    on deps.owner = trigs.owner 
    and deps.name = trigs.trigger_name 
join dba_sequences seqs 
    on seqs.sequence_owner = deps.referenced_owner 
    and seqs.sequence_name = deps.referenced_name 
where tabs.owner = '<owner>'; 
+0

@ user2492525 - dlaczego to robisz? Dlaczego nie dołączasz nazw stolików/spustów/sekwencji w połączeniach? –

+0

Po prostu dołączyłem do tego wszystkiego, ale moja nazwa sekwencji różni się od mojej nazwy wyzwalacza, więc nie zwraca mi żadnej wartości – user2492525

+0

@ user2492525 - Nie jestem pewien, dlaczego to jest problem, SQL Fiddle I połączone z różnymi nazwami. Musisz tylko dołączyć do odpowiedniej nazwy na każdym etapie. –

1

Znalazłem rozwiązanie tego problemu odgadnąć kolejność ap stawowej sekwencja

select * from SYS.ALL_SEQUENCES where SEQUENCE_OWNER='OWNER_NAME' and LAST_NUMBER between (select max(FIELD_NAME) from TABLE_NAME) and (select max(FIELD_NAME)+40 from TABLE_NAME); 

To zapytanie będzie Guess by przeszukać LAST_NUMBER wartości sekwencji pomiędzy wartością MAX pola za pomocą sekwencji i maksymalnej wartości + 40 (w moim przypadku wartość cache jest 20, więc stawiam 40)

Powiązane problemy