wtorek, 11 września 2012

VPD : Virtual Private Database

W dużym skrócie, VPD umożliwia odgórne ustawienie filtrowania tabeli dla różnych użytkowników.  Najlepiej sprawdzić to na przykładzie. Dla mnie to przypomnienie tematu i notatka, ale może kogoś ten temat zainteresuje.
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