Założenie projektu:
W schemacie HR mamy tabelę EMPLOYEES z listą 107 pracowników. Każdy z pracowników ma swojego użytkownika bazodanowego. Chcemy by ci użytkownicy widzieli w tabeli tylko wiersze dotyczące ich kolegów z tego samego działu, ale by nie widzieli wierszy dotyczących pozostałych osób. Nazwy użytkowników będą takie jak emaile w tabeli.
Sposób działania VPD w tym zastosowaniu będzie taki:
1. Użytkownik loguje się. Wyzwalacz pobiera numer departamentu w którym pracuje użytkownik o emailu takim jak nazwa logującego się właśnie użytkownika. Ustawia w zmiennej pakietowej specjalnego pakietu obsługującego VPD numer departamentu przy użyciu procedury procedury z tego pakietu.
2. Kiedy użytkownik odwoła się do tabeli EMPLOYEES w schemacie HR, do jego zapytania zostaną dodana w tle warunki zwrócone przez specjalną funkcję z tego samego pakietu.
3. Zapytanie użytkownika z dodanymi warunkami zostanie wykonane, a ograniczony wynik wyświetlony.
Potrzebujemy więc kilku rzeczy;
1. Wyzwalacza sprawdzającego numer departamentu danego pracownika.
2. Pakietu w którym znajdą się:
- zmienna przechowująca wartość owego numeru departamentu
- procedura ustawiająca wartość w w/w zmiennej , wywoływana przez wyzwalacz
- funkcja która będzie dodawała warunki do zapytań
3. Konfiguracja która powiąże zadawanie zapytań przez tego użytkownika z ograniczeniami obsługiwanymi przez pakiet.
W pierwszej kolejności tworzymy więc pakiet:
Następnie wyzwalacz który będzie sprawdzał nazwę logującego się użytkownika i na tej podstawie będzie szukał numeru departamentu do którego przypisany jest pracownik o adresie email takim jak nazwa logującego się użytkownika.
Wyzwalacz znaleziony numer departamentu przekazuje do procedury ustaw_departament w pakiecie koledzy, która wstawia numer tego departamentu do zmiennej w pakiecie.
Został ostatni element, a mianowicie ogniwo które to wszystko ze sobą zwiąże.
Dodajemy politykę. Pierwsze dwa parametry dotyczą obiektu którego polityka ma dotyczyć. Schemat w którym znajduje się dany obiekt, oraz nazwa tego obiektu. Trzeci parametr to nazwa polityki. Jeden obiekt może mieć wiele polityk. Czwarty i piąty parametr dotyczą pakietu który zarządza dostępem a który przed momentem stworzyliśmy. Schemat w którym znajduje się owy pakiet, oraz nazwa funkcji która zwraca warunki do zapytań. Ostatni parametr to operacje których nasza polityka ma dotyczyć.
Sprawdzamy efekty. Tworzę sobie użytkownika o nazwie SKING (pracownik o employee_id=100).
Trzeba mu też nadać standardowy zestaw uprawnień , oraz uprawnienia do operacji na tabeli employees w schemacie użytkownika hr.
Teraz już tylko się loguję i sprawdzam czy działa:
Gdyby objawiły się jakoweś ORA-XXXX, sprawdź trace file, albowiem tam właśnie objawia się oświecenie zaprawdę powiadam Ci :)
PS. Pytanie roku na szkoleniu dzisiaj. Pytanie dotyczyło wyników znajdujących się w RESULT_CACHE , które w związku ze zmianą danych na podstawie których owe wyniki zostały wyliczone stają się INVALID , czyli nieprawidłowe: "Ale po co trzymać tych inwalidów? Nie lepiej usunąć?" : D
Thanks :) You made my day :) Już myślałem że po pobudce przy użyciu kosiarek pod blokiem o 6 rano (słownie: szóstej rano) i kilkukrotnym wyrwaniu ze snu przez kretynów bez tłumika nic tego dnia nie uratuje. A jednak :)
PS2. I jeszcze po serii dziwnych testów i obliczeń doszliśmy dziś do wniosku że Arabowie i Chińczycy mają ograniczoną wolność wypowiedzi w kolumnach typu varchar2 ze względu pochodzenie i język. Nie pytajcie.... :)
Brak komentarzy:
Prześlij komentarz