konto usunięte

Temat: Trigger na instrukcji select

witam,
Czy jest możliwe stworzenie triggera na instrukcji select, na bazie Oracle 10. Lub czy isniej mozliwość innego zliczenia wszystkich zapuszczonych na baze selectów, oraz ich skomplikowanie lub obciążenie nimi serwer z rozdzieleniem na zapytania puszczane przez dedykowaną aplikację i zapytania puszczane przez SQl Developera i np poprzez pliki Excel, Access i inne.
Z góry dziekuję za odpowiedź.

konto usunięte

Temat: Trigger na instrukcji select

Można wykonać to przez analizę plików z logami powstałych podczas śledzenia sesji. Nie jest to banalne, ale podstawowe rzeczy powinno dać się stamtąd wyciągnąć.

konto usunięte

Temat: Trigger na instrukcji select

A ja myślałem raczej o jakiejś funkcji która automatycznie bedzie zwiekszac licznik przy puszczeniu selecta, tak aby miec szybko zagregowane dane, oraz wiem że serwer liczy w jakiś sposób skomplikowanie selektów i kolejny licznik zawierałby właśnie te dane.
Jakub Wartak

Jakub Wartak Szaman
UNIXa/Linux/Oracle,
IBM CATE

Temat: Trigger na instrukcji select

Cos w stylu:

DBMS_FGA.ADD_POLICY (
..
handler_schema => 'SYS',
handler_module => 'ALERT_MY',
..
statement_types => 'SELECT',
..
);

create or replace procedure sys.alert_my [..]
Katarzyna B.

Katarzyna B. Oracle DBA

Temat: Trigger na instrukcji select

Spróbuj przy użyciu FGA (Fine Grain Auditing). Nie używałam, ale wiem że jest :)
Tutaj masz ładny przykład: http://www.orafaq.com/wiki/DBMS_FGA

Temat: Trigger na instrukcji select

Wystarczy zwykly audyt na selekcie

pozdrawiam
Marcin Przepiorowski
Przemysław Kantyka

Przemysław Kantyka Oracle Certified
Professional, Oracle
Database SQL
Certif...

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

konto usunięte

Temat: Trigger na instrukcji select

Dziekuję Wszystkim za pomoc
Michał Bogdan

Michał Bogdan Oracle DBA, Acxiom
Polska

Temat: Trigger na instrukcji select

na część z postawionych pytań może odpowiedzieć takie zapytanko :

http://www.ixora.com.au/scripts/sql/expensive_sql.sql

po wyrzuceniu części :
where
disk_reads > 50 * executions

mamy cały przegląd wraz oceną obciążenia per sql pod względem ilości odczytów z dysku

a bez wyrzucania tej części widzimy tylko te "najcięższe" zapytania

Następna dyskusja:

Private Link z "@" w nazwie...




Wyślij zaproszenie do