Tak, klikając na obiekt i oglądając jego definicję :-)
Jeżeli coś będzie załadowane z plików zewnętrznych to będzie użyta tzw. external library w definicji.
Z SYS-a możesz wykonać też coś takiego:
SELECT * FROM ALL_LIBRARIES
/
Kolega pytał czy da się zidentyfikować sposób w jaki dane zostały wstawione do jakieś konkretnej tabeli, w szczególności czy wiersze zostały załadowane z pliku. Jest kilka sposobów zapakowania danych do tabeli:
- ładowaczka typu SQLLDR
- dowolna aplikacja, która używa insertów
- tabela zdefiniowana jako "EXTERNAL TABLE" (tak naprawdę jest to wskazówa dla Oracle, gdzie na systemie plików znajduje się plik z danymi i jak dane są zorganizowane wewnątrz tego pliku)
- odtworzenie schematu razem z danymi
- import danych via IMPDP
- odtworzenie tabeli w ramach większej całości (przywracanie z backupu)
- flashback tabeli
- triggery/procedury bazodanowe wciągające dane z innej bazy
- ... i pewnie jeszcze jakieś się znajdą (typu bezpośrednie pisanie po plikach bazy ;-) )
External library to nic innego jak statycznie linkowana dll/*.so, które może zostać przez bazę załadowane w celu realizacji jakiejś procedury/funkcji za pomocą kodu, który jest w tejże bibliotece.
Definicja obiektu powie mu tylko, czy jest to "EXTERNAL TABLE", więc da mu odpowiedź w bardzo specyficznym przypadku. Teraz jak piszesz, żeby patrzył na ALL_LIBRARIES, to wydaje mi się sugestią bez sensu. Jeśli jest inaczej, to rozwiń proszę temat.
Odpowiedź na pytanie czy się da czy się nie da, zależy od sytuacji.
- Analiza post factum - w szczególnych przypadkach (każda aplikacja ma dedykowanego użytkownika) można przeprowadzić analizę posiłkując się danymi z:
- Active Session History (Oracle co jakiś czas robi snapshoty aktywnych sesji i tego co robią i zapisuje w dedykowanym repozytorium)
- Archive/Red logi - można je przeanalizować posiłkując się log minerem (chyba, że admini nie włączyli na bazie FORCE LOGGING, a użytkownik wymusił operację w trybie NOLOGGING...)
- Logi audytu (o ile audyt jest włączony)
- Flashback (
select * from flashback_transaction_query
albo flashback query, by zidentyfikować kiedy mniej więcej dane się pojawiły: select * from foo as of timestamp ...
)
- Przygotowanie się do odpowiadania na tego typu pytania - włączenie audytu wydaje się najrozsądniejszym rozwiązaniem, bo odpowie nie tylko kto wstawił rekord, ale także, że ktoś zmodyfikował albo usunął dane: https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_4007.htm
Pomijając jak to zrobić, to pytanie, które zadał @abrakadaber jest tu najistotniejsze.