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>';
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? –
Właściwie chcę kwerendy, które pobierają listę tabel mojego użytkownika bazy danych z sekwencji i wyzwalaczy używanych w tabela. – user2492525
@ 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. –