Temat: Trigger na instrukcji select
Witam,
Bezpośrednio odpowiadając na pytanie - nie da się stworzyć wyzwalacza na instrukcji SELECT. Zależnie jednak od celu można zastosować różne inne rozwiązania.
Jeśli celem jest po prostu zliczanie ilości instrukcji SELECT na jakiejś tabeli - można wykorzystać polecenie AUDIT.
Jeśli konieczne jest wykonanie jakichś akcji obok standardowego czytania można (tak jak już wcześniej zostało zauważone) wykorzystać polisy bezpieczeństwa i funkcjonalność pakietów dbms_fga, dbms_rls.
To funkcjonalnie pozwoli na dodanie czegoś w rodzaju wyzwalacza na poziomie instrukcji jednak zależnie od rozwiązania wymaga wersji Enterprise i/lub optymalizatora CBO (czyli może nie zadziałać np. dla podpowiedzi RULE lub po alter session zmieniającym rodzaj optymalizatora).
Jeśli interesuje nas "wyzwalacz" na poziomie wiersza można (czy to poprzez polisy czy poprzez zamiane tabeli na widok) dodać do warunku where funkcje:
SELECT * FROM tabela WHERE wyzwalacz_select(ROWID) = 1;
Trzeba jednynie stworzyć funkcje przyjmującą odpowiedni typ argumentu. Takie użycie jednak pozwoli na poziomie wiersza decydować o jego zaliczeniu do wyniku lub zignorowaniu. Jeśli
jednak w WHERE są inne warunki dołączone operatorem AND
lub indeks funkcyjny dla wyrażenia przyrównywanego do 1
funkcja może się nie uruchomić lub uruchomić nie w tym momencie
w którym powinna (zamiast w trakcie selecta raz za każdym czytaniem wiersza, tylko raz podczas instrukcji insert).
Takie zachowanie może dyskwalifikować to rozwiązanie jeśli funkcja ma
mieć efekty uboczne. Można zagwarantować uruchomienie funkcji przez
widok:
select * from table(funkcja_tablicowa);
jednak to wydajnościowo nienajlepsze rozwiązanie (każda z metod nie pozostanie bez wpływu na wydajność instrukcji SELECT, powodując jej spowolnienie). Ostatni sposób pozwoli
jednak
na zarówno "wyzwalacz" na poziomie instrukcji jak i "wyzwalacz" na poziomie
wiersza.
Jeśli chodzi o "licznik skomplikowania selectow" - chodzi Panu Panie Tomku zapewne o koszt - zależnie od metody można odczytać koszt aktualnie wykonywanego zapytania z widoków v$sql i v$sql_plan
(w tym bardzo szczegółowe obciążenie zapytaniem np. procesora, liczba bloków czytanych z dysku itp.), a dla całej sesji z v$sess_io i v$sesstat.
Przypuszczam, że całe zamieszanie wynika z chęci limitowania dostępu do tabeli komuś kto ją za bardzo obciąża - rozwiązaniem pomocnym mogą być profile użytkowników i limitowanie im maksymalnego kosztu sesji.
Pozdrawiam i mam nadzieję że wiedza ze szkolenia się przydaje (a jak widzę tak jest).
Przemysław Kantyka edytował(a) ten post dnia 26.04.09 o godzinie 11:54