{"id":433,"date":"2017-01-04T12:01:13","date_gmt":"2017-01-04T11:01:13","guid":{"rendered":"http:\/\/explainit.pl\/wordpress\/?p=433"},"modified":"2017-01-04T12:01:13","modified_gmt":"2017-01-04T11:01:13","slug":"oracle-database-fgacvpd-blaski-i-cienie-a-k-a-context_sensitive","status":"publish","type":"post","link":"https:\/\/explainit.pl\/wordpress\/2017\/01\/04\/oracle-database-fgacvpd-blaski-i-cienie-a-k-a-context_sensitive\/","title":{"rendered":"Oracle Database FGAC\/VPD &#8211; blaski i cienie (a.k.a. CONTEXT_SENSITIVE)"},"content":{"rendered":"<p>Drobnoziarnista kontrola dost\u0119pu (Fine-Grained Access Control &#8211; FGAC) jest popularn\u0105 technik\u0105 kontroli dost\u0119pu u\u017cytkownik\u00f3w do danych <strong>na poziomie rekord\u00f3w<\/strong> (w przeciwie\u0144stwie do kontroli dost\u0119pu na poziomie tabeli &#8211; realizowanej poleceniami GRANT), pozwalaj\u0105c\u0105 udost\u0119pnia\u0107 r\u00f3\u017cnym u\u017cytkownikom r\u00f3\u017cne zestawy rekord\u00f3w z tej samej tabeli (co daje efekt tzw. Virtual Private Database &#8211; VPD). Og\u00f3lna idea FGAC sprowadza si\u0119 do implementacji funkcji PL\/SQL, kt\u00f3re generuj\u0105 tre\u015bci predykat\u00f3w selekcji &#8211; automatycznie i nieodwo\u0142alnie do\u0142\u0105czanych do klauzuli WHERE ka\u017cdego zapytania kierowanego do tabeli. Poni\u017csza ilustracja przedstawia przebieg realizacji zapytania na tabeli obj\u0119tej drobnoziarnist\u0105 kontrol\u0105 dost\u0119pu. U\u017cytkownicy U1 i U2 pocz\u0105tkowo kieruj\u0105 identyczne zapytania do tabeli. Serwer bazy danych Oracle Database automatycznie wywo\u0142uje funkcj\u0119 generuj\u0105c\u0105 predykaty selekcji, a jej wyniki dokleja do klazul WHERE zapyta\u0144. W efekcie zapytania u\u017cytkownik\u00f3w U1 i U2 zostaj\u0105 odpowiednio zaw\u0119\u017cone np. tylko do rekord\u00f3w, w kt\u00f3rych figuruje u\u017cytkownik o nazwie zgodnej z nazw\u0105 u\u017cytkownika wykonuj\u0105cego zapytanie. St\u0105d ka\u017cdy z u\u017cytkownik\u00f3w uzyskuje inn\u0105 odpowied\u017a na pozornie identyczne zapytania.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-436 aligncenter\" src=\"https:\/\/explainit.pl\/wordpress\/wp-content\/uploads\/2017\/01\/fgac-1024x548.png\" alt=\"Oracle Database FGAC VPD\" width=\"556\" height=\"298\" srcset=\"https:\/\/explainit.pl\/wordpress\/wp-content\/uploads\/2017\/01\/fgac-1024x548.png 1024w, https:\/\/explainit.pl\/wordpress\/wp-content\/uploads\/2017\/01\/fgac-300x160.png 300w, https:\/\/explainit.pl\/wordpress\/wp-content\/uploads\/2017\/01\/fgac-768x411.png 768w, https:\/\/explainit.pl\/wordpress\/wp-content\/uploads\/2017\/01\/fgac.png 1787w\" sizes=\"(max-width: 556px) 100vw, 556px\" \/><\/p>\n<p>Programi\u015bci rozwa\u017caj\u0105cy zastosowanie mechanizm\u00f3w FGAC cz\u0119sto pytaj\u0105 o konsekwencje wydajno\u015bciowe takiego rozwi\u0105zania. Przeprowad\u017amy zatem prosty eksperyment. Dla przyk\u0142adowej tabeli PAYMENTS(PAYMENT_ID, AMOUNT, USER_ID) zdefiniujemy polityk\u0119 FGAC pozwalaj\u0105c\u0105 u\u017cytkownikom na dost\u0119p wy\u0142\u0105cznie do tych rekord\u00f3w, w kt\u00f3rych w kolumnie USER_ID znajduje si\u0119 warto\u015b\u0107 zgodna z identyfikatorem u\u017cytkownika wykonuj\u0105cego zapytanie. Funkcja generuj\u0105ca predykaty selekcji mog\u0142aby mie\u0107 nast\u0119puj\u0105c\u0105 posta\u0107:<\/p>\n<p><code>create function fgac_fun( schema_var in varchar2, table_var in varchar2) return varchar2<br \/>\nis<br \/>\nreturn_val varchar2(400);<br \/>\nbegin<br \/>\nreturn_val := 'USER_ID = '''||SYS_CONTEXT('userenv','session_user')||'''';<br \/>\nreturn return_val;<br \/>\nend;<br \/>\n\/<\/code><\/p>\n<p>W celu u\u017cycia powy\u017cszej funkcji do drobnoziarnistej kontroli dost\u0119pu tworzymy polityk\u0119 FGAC:<\/p>\n<p><code>begin<br \/>\ndbms_rls.add_policy (<br \/>\nobject_schema =&gt; 'system',<br \/>\nobject_name =&gt; 'payments',<br \/>\npolicy_name =&gt; 'payments_policy',<br \/>\nfunction_schema =&gt; 'system',<br \/>\npolicy_function =&gt; 'fgac_fun',<br \/>\nstatement_types =&gt; 'select, insert, update, delete'<br \/>\n);<br \/>\nend;<br \/>\n\/<\/code><\/p>\n<p>Od tego momentu ka\u017cde zapytanie u\u017cytkownika do tabeli PAYMENTS zostanie automatycznie &#8222;wzbogacone&#8221; o predykat selekcji zwr\u00f3cony dynamicznie przez funkcj\u0119 FGAC_FUN. (Co ciekawe, administrator bazy danych nie zobaczy tak wzbogaconej tre\u015bci w perspektywie V$SQL &#8211; nale\u017cy dodatkowo si\u0119gn\u0105\u0107 do V$VPD_POLICY). Oto co widz\u0105 u\u017cytkownicy U1 i U2 wykonuj\u0105c zapytania &#8222;SELECT * FROM PAYMENTS&#8221;:<\/p>\n<p><code>SQL&gt; connect u1<br \/>\nSQL&gt; select * from system.payments;<br \/>\nPAYMENT_ID AMOUNT\u00a0\u00a0\u00a0\u00a0 USER_ID<br \/>\n---------- ---------- -------<br \/>\n1\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 950 U1<br \/>\n2\u00a0 \u00a0\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 1500 U1<\/code><\/p>\n<p><code>SQL&gt; connect u2<br \/>\nSQL&gt; select * from system.payments;<br \/>\nPAYMENT_ID AMOUNT\u00a0\u00a0\u00a0\u00a0 USER_ID<br \/>\n---------- ---------- -------<br \/>\n3 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0 300 U2<br \/>\n4\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 875 U2<\/code><\/p>\n<p>A oto co widzi u\u017cytkownik SYS (spod polityk FGAC wyj\u0119ci s\u0105 SYSDBA i posiadacze roli EXEMPT_ACCESS_POLICY):<\/p>\n<p><code>SQL&gt; connect sys as sysdba<br \/>\nSQL&gt; select * from system.payments;<br \/>\nPAYMENT_ID AMOUNT\u00a0\u00a0\u00a0\u00a0 USER_ID<br \/>\n---------- ---------- -------<br \/>\n1\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 950 U1<br \/>\n2\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1500 U1<br \/>\n3\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 300 U2<br \/>\n4\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 875 U2<\/code><\/p>\n<p>Wr\u00f3\u0107my teraz do kwestii wydajno\u015bci. Ka\u017cde zapytanie skierowane do tabeli PAYMENTS powoduje obecnie uruchomienie funkcji FGAC_FUN, kt\u00f3ra dynamicznie generuje tre\u015b\u0107 predykatu selekcji. To istotny narzut obliczeniowy &#8211; 1 000 000 zapyta\u0144 spowoduje 1 000 000 wywo\u0142a\u0144\/wykona\u0144 funkcji PL\/SQL! Oto jak wygl\u0105da\u0142yby wska\u017aniki wydajno\u015bciowe dla powt\u00f3rzonego milion razy zapytania &#8222;SELECT COUNT(*) FROM PAYMENTS&#8221; (serwer Oracle Database 12.1.0.2, RHEL 7):<\/p>\n<p><code>SQL ordered by CPU Time<br \/>\nCPU Time(s) Executions SQL Text<br \/>\n76.23\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1,000,000\u00a0 SELECT COUNT(*) FROM SYSTEM.PAYMENTS<br \/>\n33.11\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1,000,000\u00a0 begin :con := \"FGAC_FUN\"(:sn, ...<\/code><\/p>\n<p>Zauwa\u017cmy, \u017ce w tym prostym przyk\u0142adzie czas wykonywania funkcji FGAC_FUN stanowi prawie po\u0142ow\u0119 czasu (33s) wykonania zapyta\u0144 (76s)! To bardzo du\u017ca rozrzutno\u015b\u0107&#8230;<br \/>\nCo z tym mo\u017cemy zrobi\u0107? Na przyk\u0142ad mo\u017cemy skorzysta\u0107 z technik automatycznego buforowania wynik\u00f3w funkcji generuj\u0105cej predykaty selekcji. FGAC oferuje nast\u0119puj\u0105ce poziomy buforowania [<a href=\"https:\/\/docs.oracle.com\/database\/121\/DBSEG\/vpd.htm\">https:\/\/docs.oracle.com\/database\/121\/DBSEG\/vpd.htm<\/a>]:<\/p>\n<ul>\n<li>DYNAMIC (domy\u015blny, wykorzystywany w badanym systemie): funkcja generuj\u0105ca predykaty jest wywo\u0142ywana za ka\u017cdym razem, kiedy u\u017cytkownik wykonuje operacj\u0119 SQL na chronionej tabeli<\/li>\n<li>STATIC: funkcja generuj\u0105ca predykaty jest wywo\u0142ana tylko raz, a jej wynik jest wykorzystywany przez wszystkich u\u017cytkownik\u00f3w instancji serwera bazy danych kiedy wykonuj\u0105 operacj\u0119 SQL na chronionej tabeli<\/li>\n<li>SHARED_STATIC: funkcja generuj\u0105ca predykaty jest wywo\u0142ana tylko raz, a jej wynik jest wykorzystywany przez wszystkich u\u017cytkownik\u00f3w instancji serwera bazy danych kiedy wykonuj\u0105 operacj\u0119 SQL na wszystkich tabelach chronionych z u\u017cyciem tej funkcji<\/li>\n<li>CONTEXT_SENSITIVE: funkcja generuj\u0105ca predykaty jest wywo\u0142ana gdy u\u017cytkownik(sesja) korzysta po raz pierwszy z chronionej tabeli, jej wynik jest buforowany i wykorzystywany ponownie pod warunkiem, \u017ce nie dosz\u0142o do \u017cadnych zmian w kontekstach aplikacyjnych [<a href=\"https:\/\/docs.oracle.com\/database\/121\/DBSEG\/app_context.htm\">https:\/\/docs.oracle.com\/database\/121\/DBSEG\/app_context.htm<\/a>]. Je\u017celi nast\u0105pi zmiana dowolnego kontekstu aplikacyjnego, to przy kolejnym odwo\u0142aniu u\u017cytkownika do chronionej tabeli, funkcja generuj\u0105ca predykatu zostanie wywo\u0142ana ponownie. Istnieje mo\u017cliwo\u015b\u0107 ograniczenia wra\u017cliwo\u015bci tej metody na nieistotne zmienne i konteksty aplikacyjne (parametry &#8222;namespace&#8221; i &#8222;attribute&#8221;).<\/li>\n<li>SHARED_CONTEXT_SENSITIVE: jak wy\u017cej lecz buforowany wynik mo\u017ce by\u0107 zastosowany na wszystkich tabelach chronionych z u\u017cyciem tej funkcji<\/li>\n<\/ul>\n<p>Poniewa\u017c nasza funkcja opiera swoje dzia\u0142anie wy\u0142\u0105cznie na zawarto\u015bci kontekstu aplikacyjnego USERENV, to mo\u017cemy bez obaw w\u0142\u0105czy\u0107 buforowanie na poziomie CONTEXT_SENSITIVE (parametr POLICY_TYPE):<\/p>\n<p><code>begin<br \/>\ndbms_rls.drop_policy( object_schema =&gt; 'system',<br \/>\nobject_name =&gt; 'payments',<br \/>\npolicy_name =&gt; 'payments_policy');<br \/>\nend;<br \/>\n\/<br \/>\nbegin<br \/>\ndbms_rls.add_policy (<br \/>\nobject_schema =&gt; 'system',<br \/>\nobject_name =&gt; 'payments',<br \/>\npolicy_name =&gt; 'payments_policy',<br \/>\nfunction_schema =&gt; 'system',<br \/>\npolicy_function =&gt; 'fgac_fun',<br \/>\nstatement_types =&gt; 'select, insert, update, delete',<br \/>\npolicy_type =&gt; DBMS_RLS.CONTEXT_SENSITIVE<br \/>\n);<br \/>\nend;<br \/>\n\/<\/code><\/p>\n<p>Jak teraz wygl\u0105da\u0142yby wska\u017aniki wydajno\u015bciowe dla wykonania miliona zapyta\u0144 do tabeli chronionej przez FGAC? Sprawd\u017amy:<\/p>\n<p><code>SQL ordered by CPU Time<br \/>\nCPU Time(s) Executions SQL Text<br \/>\n13.63\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1,000,000\u00a0 SELECT COUNT(*) FROM SYSTEM.PAYMENTS<br \/>\n0.00\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1\u00a0 begin :con := \"FGAC_FUN\"(:sn, ...<\/code><\/p>\n<p>Oto efekt: 13 sekund zamiast 76 sekund (czas samego wykonania funkcji PL\/SQL &#8211; niemierzalny)!!! Oczywi\u015bcie nie zawsze mo\u017cliwe jest buforowanie na poziomie CONTEXT_SENSITIVE (funkcje niedeterministyczne, funkcje wykonuj\u0105ce zapytania do tabel, itp.), jednak niew\u0105tpliwie nale\u017cy d\u0105\u017cy\u0107 do takiej implementacji funkcji generuj\u0105cej predykaty, kt\u00f3ra umo\u017cliwi ten poziom buforowania.<\/p>\n<p>Wytrawni programi\u015bci b\u0119d\u0105 pewnie kr\u0119ci\u0107 nosem na zastosowanie FGAC do rozwi\u0105zania tak trywialnego problemu bezpiecze\u0144stwa i zgodnie ze &#8222;star\u0105 szko\u0142\u0105&#8221; po prostu zbuduj\u0105 perspektyw\u0119:<\/p>\n<p><code>create view payments_restricted as select * from payments<br \/>\nwhere user_id=SYS_CONTEXT('userenv','session_user');<\/code><\/p>\n<p>Jak szybko teraz dzia\u0142a\u0142yby nasze zapytania? Jak to zwykle bywa, stare rozwi\u0105zania wygrywaj\u0105 z nowymi&#8230;:<\/p>\n<p><code>SQL ordered by CPU Time<br \/>\nCPU Time(s) Executions SQL Text<br \/>\n10.00\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1,000,000\u00a0 SELECT COUNT(*) FROM SYSTEM.PAYMENTS_RESTRICTED<\/code><\/p>\n<p>Okr\u0105g\u0142e 10 sekund zamiast wcze\u015bniejszych 13, czy nawet 76! Nie oznacza to jednak, \u017ce FGAC jest niepotrzebne &#8211; wystarczy wyobrazi\u0107 sobie bardziej skomplikowany przyk\u0142ad uprawnie\u0144 typu: &#8222;U\u017cytkownicy z tego samego miasta, co oddzia\u0142 wystawiaj\u0105cy faktur\u0119 maj\u0105 dost\u0119p do niej tylko w dni robocze w godzinach 9:00-17:00. Ograniczenie to nie dotyczy u\u017cytkownik\u00f3w pracuj\u0105cych w sieci lokalnej&#8221;.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Drobnoziarnista kontrola dost\u0119pu (Fine-Grained Access Control &#8211; FGAC) jest popularn\u0105 technik\u0105 kontroli dost\u0119pu u\u017cytkownik\u00f3w do danych na poziomie rekord\u00f3w (w przeciwie\u0144stwie do kontroli dost\u0119pu na poziomie tabeli &#8211; realizowanej poleceniami GRANT), pozwalaj\u0105c\u0105 udost\u0119pnia\u0107 r\u00f3\u017cnym u\u017cytkownikom r\u00f3\u017cne zestawy rekord\u00f3w z tej samej tabeli (co daje efekt tzw. Virtual Private Database &#8211; VPD). Og\u00f3lna idea FGAC sprowadza <a href=\"https:\/\/explainit.pl\/wordpress\/2017\/01\/04\/oracle-database-fgacvpd-blaski-i-cienie-a-k-a-context_sensitive\/\" rel=\"nofollow\"><span class=\"sr-only\">Read more about Oracle Database FGAC\/VPD &#8211; blaski i cienie (a.k.a. CONTEXT_SENSITIVE)<\/span>[&hellip;]<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[2],"tags":[29,27,28,21],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.2.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Oracle Database FGAC\/VPD - blaski i cienie (a.k.a. CONTEXT_SENSITIVE) - Explain IT<\/title>\n<meta name=\"description\" content=\"Oracle Database FGAC\/VPD - blaski i cienie (a.k.a. CONTEXT_SENSITIVE)\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/explainit.pl\/wordpress\/2017\/01\/04\/oracle-database-fgacvpd-blaski-i-cienie-a-k-a-context_sensitive\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Oracle Database FGAC\/VPD - blaski i cienie (a.k.a. CONTEXT_SENSITIVE) - Explain IT\" \/>\n<meta property=\"og:description\" content=\"Oracle Database FGAC\/VPD - blaski i cienie (a.k.a. CONTEXT_SENSITIVE)\" \/>\n<meta property=\"og:url\" content=\"https:\/\/explainit.pl\/wordpress\/2017\/01\/04\/oracle-database-fgacvpd-blaski-i-cienie-a-k-a-context_sensitive\/\" \/>\n<meta property=\"og:site_name\" content=\"Explain IT\" \/>\n<meta property=\"article:published_time\" content=\"2017-01-04T11:01:13+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/explainit.pl\/wordpress\/wp-content\/uploads\/2017\/01\/fgac-1024x548.png\" \/>\n<meta name=\"author\" content=\"Maciej Zakrzewicz\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Napisane przez\" \/>\n\t<meta name=\"twitter:data1\" content=\"Maciej Zakrzewicz\" \/>\n\t<meta name=\"twitter:label2\" content=\"Szacowany czas czytania\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minut\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/explainit.pl\/wordpress\/2017\/01\/04\/oracle-database-fgacvpd-blaski-i-cienie-a-k-a-context_sensitive\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/explainit.pl\/wordpress\/2017\/01\/04\/oracle-database-fgacvpd-blaski-i-cienie-a-k-a-context_sensitive\/\"},\"author\":{\"name\":\"Maciej Zakrzewicz\",\"@id\":\"https:\/\/explainit.pl\/wordpress\/#\/schema\/person\/740773131bc169a2dc9c0e5e07476219\"},\"headline\":\"Oracle Database FGAC\/VPD &#8211; blaski i cienie (a.k.a. CONTEXT_SENSITIVE)\",\"datePublished\":\"2017-01-04T11:01:13+00:00\",\"dateModified\":\"2017-01-04T11:01:13+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/explainit.pl\/wordpress\/2017\/01\/04\/oracle-database-fgacvpd-blaski-i-cienie-a-k-a-context_sensitive\/\"},\"wordCount\":940,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/explainit.pl\/wordpress\/#organization\"},\"keywords\":[\"bezpiecze\u0144stwo\",\"FGAC\",\"VPD\",\"wydajno\u015b\u0107\"],\"articleSection\":[\"Oracle Database\"],\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/explainit.pl\/wordpress\/2017\/01\/04\/oracle-database-fgacvpd-blaski-i-cienie-a-k-a-context_sensitive\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/explainit.pl\/wordpress\/2017\/01\/04\/oracle-database-fgacvpd-blaski-i-cienie-a-k-a-context_sensitive\/\",\"url\":\"https:\/\/explainit.pl\/wordpress\/2017\/01\/04\/oracle-database-fgacvpd-blaski-i-cienie-a-k-a-context_sensitive\/\",\"name\":\"Oracle Database FGAC\/VPD - blaski i cienie (a.k.a. CONTEXT_SENSITIVE) - Explain IT\",\"isPartOf\":{\"@id\":\"https:\/\/explainit.pl\/wordpress\/#website\"},\"datePublished\":\"2017-01-04T11:01:13+00:00\",\"dateModified\":\"2017-01-04T11:01:13+00:00\",\"description\":\"Oracle Database FGAC\/VPD - blaski i cienie (a.k.a. CONTEXT_SENSITIVE)\",\"breadcrumb\":{\"@id\":\"https:\/\/explainit.pl\/wordpress\/2017\/01\/04\/oracle-database-fgacvpd-blaski-i-cienie-a-k-a-context_sensitive\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/explainit.pl\/wordpress\/2017\/01\/04\/oracle-database-fgacvpd-blaski-i-cienie-a-k-a-context_sensitive\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/explainit.pl\/wordpress\/2017\/01\/04\/oracle-database-fgacvpd-blaski-i-cienie-a-k-a-context_sensitive\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/explainit.pl\/wordpress\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Oracle Database FGAC\/VPD &#8211; blaski i cienie (a.k.a. CONTEXT_SENSITIVE)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/explainit.pl\/wordpress\/#website\",\"url\":\"https:\/\/explainit.pl\/wordpress\/\",\"name\":\"Explain IT\",\"description\":\"Autorska pracownia doradztwa i szkole\u0144 IT - Maciej Zakrzewicz - szkolenia, ekspertyzy, wdro\u017cenia. Technologie Oracle, PostgreSQL, MySQL.\",\"publisher\":{\"@id\":\"https:\/\/explainit.pl\/wordpress\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/explainit.pl\/wordpress\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/explainit.pl\/wordpress\/#organization\",\"name\":\"Explain IT\",\"url\":\"https:\/\/explainit.pl\/wordpress\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/explainit.pl\/wordpress\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/explainit.pl\/wordpress\/wp-content\/uploads\/2016\/08\/explainITmini.png\",\"contentUrl\":\"https:\/\/explainit.pl\/wordpress\/wp-content\/uploads\/2016\/08\/explainITmini.png\",\"width\":196,\"height\":64,\"caption\":\"Explain IT\"},\"image\":{\"@id\":\"https:\/\/explainit.pl\/wordpress\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/explainit.pl\/wordpress\/#\/schema\/person\/740773131bc169a2dc9c0e5e07476219\",\"name\":\"Maciej Zakrzewicz\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/explainit.pl\/wordpress\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/9c98d020128b142a480aa35a22300a69?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/9c98d020128b142a480aa35a22300a69?s=96&d=mm&r=g\",\"caption\":\"Maciej Zakrzewicz\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Oracle Database FGAC\/VPD - blaski i cienie (a.k.a. CONTEXT_SENSITIVE) - Explain IT","description":"Oracle Database FGAC\/VPD - blaski i cienie (a.k.a. CONTEXT_SENSITIVE)","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/explainit.pl\/wordpress\/2017\/01\/04\/oracle-database-fgacvpd-blaski-i-cienie-a-k-a-context_sensitive\/","og_locale":"pl_PL","og_type":"article","og_title":"Oracle Database FGAC\/VPD - blaski i cienie (a.k.a. CONTEXT_SENSITIVE) - Explain IT","og_description":"Oracle Database FGAC\/VPD - blaski i cienie (a.k.a. CONTEXT_SENSITIVE)","og_url":"https:\/\/explainit.pl\/wordpress\/2017\/01\/04\/oracle-database-fgacvpd-blaski-i-cienie-a-k-a-context_sensitive\/","og_site_name":"Explain IT","article_published_time":"2017-01-04T11:01:13+00:00","og_image":[{"url":"https:\/\/explainit.pl\/wordpress\/wp-content\/uploads\/2017\/01\/fgac-1024x548.png"}],"author":"Maciej Zakrzewicz","twitter_card":"summary_large_image","twitter_misc":{"Napisane przez":"Maciej Zakrzewicz","Szacowany czas czytania":"6 minut"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/explainit.pl\/wordpress\/2017\/01\/04\/oracle-database-fgacvpd-blaski-i-cienie-a-k-a-context_sensitive\/#article","isPartOf":{"@id":"https:\/\/explainit.pl\/wordpress\/2017\/01\/04\/oracle-database-fgacvpd-blaski-i-cienie-a-k-a-context_sensitive\/"},"author":{"name":"Maciej Zakrzewicz","@id":"https:\/\/explainit.pl\/wordpress\/#\/schema\/person\/740773131bc169a2dc9c0e5e07476219"},"headline":"Oracle Database FGAC\/VPD &#8211; blaski i cienie (a.k.a. CONTEXT_SENSITIVE)","datePublished":"2017-01-04T11:01:13+00:00","dateModified":"2017-01-04T11:01:13+00:00","mainEntityOfPage":{"@id":"https:\/\/explainit.pl\/wordpress\/2017\/01\/04\/oracle-database-fgacvpd-blaski-i-cienie-a-k-a-context_sensitive\/"},"wordCount":940,"commentCount":0,"publisher":{"@id":"https:\/\/explainit.pl\/wordpress\/#organization"},"keywords":["bezpiecze\u0144stwo","FGAC","VPD","wydajno\u015b\u0107"],"articleSection":["Oracle Database"],"inLanguage":"pl-PL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/explainit.pl\/wordpress\/2017\/01\/04\/oracle-database-fgacvpd-blaski-i-cienie-a-k-a-context_sensitive\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/explainit.pl\/wordpress\/2017\/01\/04\/oracle-database-fgacvpd-blaski-i-cienie-a-k-a-context_sensitive\/","url":"https:\/\/explainit.pl\/wordpress\/2017\/01\/04\/oracle-database-fgacvpd-blaski-i-cienie-a-k-a-context_sensitive\/","name":"Oracle Database FGAC\/VPD - blaski i cienie (a.k.a. CONTEXT_SENSITIVE) - Explain IT","isPartOf":{"@id":"https:\/\/explainit.pl\/wordpress\/#website"},"datePublished":"2017-01-04T11:01:13+00:00","dateModified":"2017-01-04T11:01:13+00:00","description":"Oracle Database FGAC\/VPD - blaski i cienie (a.k.a. CONTEXT_SENSITIVE)","breadcrumb":{"@id":"https:\/\/explainit.pl\/wordpress\/2017\/01\/04\/oracle-database-fgacvpd-blaski-i-cienie-a-k-a-context_sensitive\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/explainit.pl\/wordpress\/2017\/01\/04\/oracle-database-fgacvpd-blaski-i-cienie-a-k-a-context_sensitive\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/explainit.pl\/wordpress\/2017\/01\/04\/oracle-database-fgacvpd-blaski-i-cienie-a-k-a-context_sensitive\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/explainit.pl\/wordpress\/"},{"@type":"ListItem","position":2,"name":"Oracle Database FGAC\/VPD &#8211; blaski i cienie (a.k.a. CONTEXT_SENSITIVE)"}]},{"@type":"WebSite","@id":"https:\/\/explainit.pl\/wordpress\/#website","url":"https:\/\/explainit.pl\/wordpress\/","name":"Explain IT","description":"Autorska pracownia doradztwa i szkole\u0144 IT - Maciej Zakrzewicz - szkolenia, ekspertyzy, wdro\u017cenia. Technologie Oracle, PostgreSQL, MySQL.","publisher":{"@id":"https:\/\/explainit.pl\/wordpress\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/explainit.pl\/wordpress\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pl-PL"},{"@type":"Organization","@id":"https:\/\/explainit.pl\/wordpress\/#organization","name":"Explain IT","url":"https:\/\/explainit.pl\/wordpress\/","logo":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/explainit.pl\/wordpress\/#\/schema\/logo\/image\/","url":"https:\/\/explainit.pl\/wordpress\/wp-content\/uploads\/2016\/08\/explainITmini.png","contentUrl":"https:\/\/explainit.pl\/wordpress\/wp-content\/uploads\/2016\/08\/explainITmini.png","width":196,"height":64,"caption":"Explain IT"},"image":{"@id":"https:\/\/explainit.pl\/wordpress\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/explainit.pl\/wordpress\/#\/schema\/person\/740773131bc169a2dc9c0e5e07476219","name":"Maciej Zakrzewicz","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/explainit.pl\/wordpress\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/9c98d020128b142a480aa35a22300a69?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/9c98d020128b142a480aa35a22300a69?s=96&d=mm&r=g","caption":"Maciej Zakrzewicz"}}]}},"_links":{"self":[{"href":"https:\/\/explainit.pl\/wordpress\/wp-json\/wp\/v2\/posts\/433"}],"collection":[{"href":"https:\/\/explainit.pl\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/explainit.pl\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/explainit.pl\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/explainit.pl\/wordpress\/wp-json\/wp\/v2\/comments?post=433"}],"version-history":[{"count":10,"href":"https:\/\/explainit.pl\/wordpress\/wp-json\/wp\/v2\/posts\/433\/revisions"}],"predecessor-version":[{"id":444,"href":"https:\/\/explainit.pl\/wordpress\/wp-json\/wp\/v2\/posts\/433\/revisions\/444"}],"wp:attachment":[{"href":"https:\/\/explainit.pl\/wordpress\/wp-json\/wp\/v2\/media?parent=433"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/explainit.pl\/wordpress\/wp-json\/wp\/v2\/categories?post=433"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/explainit.pl\/wordpress\/wp-json\/wp\/v2\/tags?post=433"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}