{"id":92114,"date":"2020-08-23T19:41:56","date_gmt":"2020-08-23T17:41:56","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/realizacziya-rolevoj-modeli-dostupa-s-ispolzovaniem-row-level-security-v-postgresql"},"modified":"2020-08-23T19:41:56","modified_gmt":"2020-08-23T17:41:56","slug":"realizacziya-rolevoj-modeli-dostupa-s-ispolzovaniem-row-level-security-v-postgresql","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/realizacziya-rolevoj-modeli-dostupa-s-ispolzovaniem-row-level-security-v-postgresql","title":{"rendered":"Realizacja modelu dost\u0119pu w oparciu o Row Level Security w PostgreSQL","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Rozw\u00f3j tematu <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/515896\/\">Studium przypadku implementacji Row Level Security w PostgreSQL<\/a><\/noindex> i <b>dla rozszerzonej odpowiedzi<\/b> na <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/515628\/#comment_21973176\">komentarz.<\/a><\/noindex><\/p>\n<p>U\u017cyta strategia zak\u0142ada zastosowanie koncepcji \u201eLogika biznesowa w bazie danych\u201d, co zosta\u0142o opisane nieco szerzej tutaj \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/515628\/\">Studium dotycz\u0105ce wdra\u017cania logiki biznesowej na poziomie funkcji przechowywanych PostgreSQL.<\/a><\/noindex><\/p>\n<p>Cz\u0119\u015b\u0107 teoretyczna jest doskonale opisana w dokumentacji <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/\">Postgres Pro<\/a><\/noindex> \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgrespro\/11\/ddl-rowsecurity\">Polityka ochrony wierszy<\/a><\/noindex>. Poni\u017cej om\u00f3wiono praktyczn\u0105 realizacj\u0119 <b>konkretnego zadania biznesowego \u2014 model dost\u0119pu do danych oparty na rolach.<\/b><\/p>\n<p><img decoding=\"async\" alt=\"Realizacja modelu dost\u0119pu w oparciu o Row Level Security w PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/08\/df69397b8638421732a67e457c99857c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<blockquote><p>Artyku\u0142 nie zawiera nic nowego, nie ma ukrytego sensu ani tajemnej wiedzy. To po prostu szkic dotycz\u0105cy praktycznej realizacji teoretycznej idei. Je\u015bli kogo\u015b to interesuje \u2014 niech czyta. Kto nie jest zainteresowany \u2014 niech nie marnuje swojego czasu.<\/p><\/blockquote>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Sformu\u0142owanie zadania<\/h2>\n<p>\nNale\u017cy ograniczy\u0107 dost\u0119p do przegl\u0105dania\/wstawiania\/zmiany\/usuwania dokumentu zgodnie z rol\u0105 u\u017cytkownika aplikacji. Pod rol\u0105 rozumie si\u0119 wpis w tabeli <b>roles<\/b> zwi\u0105zan\u0105 relacj\u0105 wiele-do-wielu z tabel\u0105 <b>users<\/b>. Szczeg\u00f3\u0142y realizacji tabel z uwagi na trywialno\u015b\u0107 zosta\u0142y pomini\u0119te. R\u00f3wnie\u017c pomini\u0119to konkretne szczeg\u00f3\u0142y realizacji zwi\u0105zane z dziedzin\u0105.<\/p>\n<h2>Realizacja<\/h2>\n<p><\/p>\n<h4>Tworzymy role, schemy, tabel\u0119<\/h4>\n<p><\/p>\n<p>                        <b class=\"spoiler_title\">Tworzenie obiekt\u00f3w Bazy Danych<\/b><\/p>\n<pre><code class=\"pgsql\">CREATE ROLE store;\nCREATE SCHEMA store AUTHORIZATION store;\nCREATE TABLE store.docs\n(\n  id integer ,         --id dokumentu\n  man_id integer , --id mened\u017cera dokumentu\n  stat_id integer ,  --id statusu dokumentu\n  ...\n  is_del BOOLEAN DEFAULT FALSE \n);\nALTER TABLE store.docs ADD CONSTRAINT doc_pk PRIMARY KEY (id);\nALTER TABLE store.docs OWNER TO store ;\n<\/code><\/pre>\n<p><\/p>\n<h4>Tworzymy funkcje do realizacji RLS<\/h4>\n<p>\nSprawdzenie mo\u017cliwo\u015bci wykonania SELECT wiersza<\/p>\n<p>                        <b class=\"spoiler_title\">check_select<\/b><\/p>\n<pre><code class=\"pgsql\">UTW\u00d3RZ LUB ZAST\u0104P FUNKCJ\u0118 store.check_select ( current_id store.docs.id%TYPE ) ZWRACA boolean AS $$\nDEKLARUJ\n  wynik boolean ;\n  curr_pid integer ;\n  curr_stat_id integer ;\n  doc_man_id integer ;\nBEGIN \n  -- DBA ma dost\u0119p do wszystkich dokument\u00f3w\n  IF SESSION_USER = 'curr_dba'\n  THEN\n    ZWR\u00d3\u0106 PRAWDA ;\n  END IF ;\n  --------------------------------\n\n  --Je\u015bli dokument ma etykiet\u0119 'usuni\u0119ty' - nie pokazuj w wyborze\n  SELECT\n    is_del\n  INTO\n    wynik\n  FROM\n    store.docs\n  WHERE\n    id = current_id ;\n IF wynik = PRAWDA\n THEN\n   ZWR\u00d3\u0106 FA\u0141SZ ;\n END IF ;\n --------------------------------\n\n --Pobierz id aktualnego u\u017cytkownika\n SELECT\n   service_function.get_curr_pid ()\n INTO\n   curr_pid ;\n --------------------------------\n\n --Pobierz id mened\u017cera dokumentu\n SELECT\n   man_id\n INTO\n   doc_man_id\n FROM\n   store.docs\n WHERE\n   id = current_id ;\n --------------------------------\n\n --Je\u015bli mened\u017cer dokumentu nie jest aktualnym u\u017cytkownikiem lub mened\u017cer nie jest przypisany\n --dodaj dokument do wyboru\n IF doc_man_id != curr_pid OR doc_man_id IS NULL\n THEN\n   ZWR\u00d3\u0106 PRAWDA  ;\n ELSE\n   --Pobierz aktualny status dokumentu\n   SELECT\n     stat_id                                         \n   INTO\n     curr_statid\n   FROM\n     store.docs\n   WHERE\n     id = current_id ;\n    \n   --Je\u015bli status pozwala na przegl\u0105danie dokumentu - dodaj dokument do wyboru                     \n   IF curr_statid = 4 OR curr_statid = 9\n   THEN\n     ZWR\u00d3\u0106 PRAWDA ;\n   ELSE\n   --W przeciwnym razie - wyklucz dokument z wyboru\n     ZWR\u00d3\u0106 FA\u0141SZ ;\n    END IF ;\n  END IF ;\n  --------------------------------\n\n ZWR\u00d3\u0106 FA\u0141SZ ;\nEND\n$$ J\u0118ZYK plpgsql DEFINER SECURITY;\nALTER FUNKCJ\u0118 store.check_select( store.docs.id%TYPE  ) W\u0141A\u015aCICIEL DO store ;\nODWO\u0141AJ WYKONANIE FUNKCJI store.check_select( store.docs.id%TYPE  ) OD public; \nPRZYZNAJ WYKONANIE FUNKCJI store.check_select( store.docs.id%TYPE  ) DO service_functions; \n<\/code><\/pre>\n<p>\nSprawdzenie mo\u017cliwo\u015bci wykonania INSERT wiersza<\/p>\n<p>                        <b class=\"spoiler_title\">check_insert<\/b><\/p>\n<pre><code class=\"pgsql\">UTW\u00d3RZ LUB ZAST\u0104P FUNKCJ\u0118 store.check_insert ( current_id store.docs.id%TYPE ) ZWRACA boolean AS $$\nDEKLARUJ\n  curr_role_id integer ;\nBEGIN\n  --DBA mo\u017ce doda\u0107 wiersz w ka\u017cdym przypadku\n  IF SESSION_USER = 'curr_dba'\n  THEN\n    ZWR\u00d3\u0106 PRAWDA ;\n  END IF ;\n  --------------------------------\n\n --Pobierz id roli aktualnego u\u017cytkownika \n SELECT\n   service_functions.current_rid()\n  INTO\n    curr_role_id ;\n --------------------------------\n\n--Je\u015bli rola pozwala na utworzenie nowego dokumentu\n--zezw\u00f3l\nIF curr_role_id = 3 OR curr_role_id = 5     \nTHEN\n  ZWR\u00d3\u0106 PRAWDA ;\nEND IF ;\n--------------------------------\nZWR\u00d3\u0106 FA\u0141SZ  ;\nEND\n$$ J\u0118ZYK plpgsql DEFINER SECURITY;\nALTER FUNKCJ\u0118 store.check_insert( store.docs.id%TYPE  ) W\u0141A\u015aCICIEL DO store ;\nODWO\u0141AJ WYKONANIE FUNKCJI store.check_insert( store.docs.id%TYPE  ) OD public;\nPRZYZNAJ WYKONANIE FUNKCJI store.check_insert( store.docs.id%TYPE  ) DO service_functions; \n<\/code><\/pre>\n<p>\nSprawdzenie mo\u017cliwo\u015bci wykonania DELETE wiersza<\/p>\n<p>                        <b class=\"spoiler_title\">check_delete<\/b><\/p>\n<pre><code class=\"pgsql\">UTW\u00d3RZ LUB ZAST\u0104P FUNKCJ\u0118 store.check_delete ( current_id store.docs.id%TYPE )\nZWRACA boolean AS $$\nBEGIN  \n  --Tylko DBA mo\u017ce usun\u0105\u0107 wiersz \n  IF SESSION_USER = 'curr_dba'\n  THEN\n    ZWR\u00d3\u0106 PRAWDA ;\n  END IF ;\n  --------------------------------\n\n  ZWR\u00d3\u0106 FA\u0141SZ ;\nEND\n$$ J\u0118ZYK plpgsql\nDEFINER SECURITY;\nALTER FUNKCJ\u0118 store.check_delete( store.docs.id%TYPE  ) W\u0141A\u015aCICIEL DO store ;\nODWO\u0141AJ WYKONANIE FUNKCJI store.check_delete( store.docs.id%TYPE  ) OD public;<\/code><\/pre>\n<p>\nSprawdzenie mo\u017cliwo\u015bci wykonania UPDATE wiersza.<\/p>\n<p>                        <b class=\"spoiler_title\">aktualizuj_u\u017cywaj\u0105c<\/b><\/p>\n<pre><code class=\"pgsql\">STW\u00d3RZ LUB ZAST\u0104P FUNKCJ\u0118 store.update_using ( current_id store.docs.id%TYPE , is_del boolean )\nZWRA\u0106 BOOL AS $$\nBEGIN  \n   --Dokumenty maj\u0105ce status 'usuni\u0119ty' nie mog\u0105 by\u0107 edytowane\n   IF is_del \n   THEN\n     ZWR\u00d3\u0106 FA\u0141SZ ;\n ELSE\n    ZWR\u00d3\u0106 PRAWDA ;\n  END IF ;\n\nEND\n$$ J\u0118ZYK plpgsql BEZPIECZNO\u015a\u0106 DEFINER;\nZMIANA FUNKCJI store.update_using( store.docs.id%TYPE , boolean ) W\u0141A\u015aCICIEL DO store ;\nODWOLAJ WYKONANIE FUNKCJI store.update_using( store.docs.id%TYPE , boolean ) Z public;\nPRZYZNAJ WYKONANIE FUNKCJI store.update_using( store.docs.id%TYPE ) DO service_functions;<\/code><\/pre>\n<p><\/p>\n<p>                        <b class=\"spoiler_title\">aktualizuj_sprawd\u017a<\/b><\/p>\n<pre><code class=\"pgsql\">STW\u00d3RZ LUB ZAST\u0104P FUNKCJ\u0118 store.update_with_check ( current_id store.docs.id%TYPE , is_del boolean )\nZWRA\u0106 BOOL AS $$\nDECLARE\n  current_rid integer ;\n  current_statid integer ;\nBEGIN                \n\n  --DBA mo\u017ce przegl\u0105da\u0107 wiersz \n  IF SESSION_USER = 'curr_dba'\n  THEN\n    ZWR\u00d3\u0106 PRAWDA ;\n  END IF ;\n  --------------------------------\n\n --Uzyskaj id roli bie\u017c\u0105cego u\u017cytkownika \n SELECT\n   service_functions.current_rid()\n  INTO\n    curr_role_id ;\n --------------------------------                            \n\n --Usuni\u0119cie dokumentu - zmiana flagi \n IF is_deleted\n THEN\n   --Je\u015bli rola u\u017cytkownika ***\n   IF current_role_id = 3        \n   THEN\n      SELECT\n        stat_id                                          \n      INTO\n        curr_statid\n      FROM\n        store.docs\n      WHERE\n        id = current_id ;\n\n      --Dokument w statusie *** nie mo\u017ce by\u0107 usuni\u0119ty \n      IF current_status_id = 11\n      THEN\n         ZWR\u00d3\u0106 FA\u0141SZ ;\n      ELSE\n      --Mo\u017cna usun\u0105\u0107 dokument w innych statusach\n        ZWR\u00d3\u0106 PRAWDA ;\n      END IF ;\n\n    --W przeciwnym razie, je\u015bli rola u\u017cytkownika ***\n    ELSIF current_role_id = 5            \n    THEN\n      --Wszystkie statusy dokumentu \n      ZWR\u00d3\u0106 PRAWDA ;\n    ELSE\n      --Inni u\u017cytkownicy nie mog\u0105 usuwa\u0107 dokument\u00f3w\n      ZWR\u00d3\u0106 FA\u0141SZ ;\n    END IF ;\n ELSE      \n   --Aktualizacja dokumentu jest dozwolona\n    ZWR\u00d3\u0106 PRAWDA ;\nEND IF ;\n\nZWR\u00d3\u0106 FA\u0141SZ ;\nEND\n$$ J\u0118ZYK plpgsql BEZPIECZNO\u015a\u0106 DEFINER;\nZMIANA FUNKCJI store.update_with_check( storg.docs.id%TYPE ,  boolean ) W\u0141A\u015aCICIEL DO store ;\nODWOLAJ WYKONANIE FUNKCJI store.update_with_check( storg.docs.id%TYPE ,  boolean )  Z public;\nPRZYZNAJ WYKONANIE FUNKCJI store.update_with_check( store.docs.id%TYPE ) DO service_functions;<\/code><\/pre>\n<p>\nW\u0142\u0105czenie polityki Row Level Security dla tabeli.<\/p>\n<p>                        <b class=\"spoiler_title\">W\u0141\u0104CZ R\u00d3W LEVEL SECURITY<\/b><\/p>\n<pre><code class=\"pgsql\">ZMIANA TABELI store.docs W\u0141\u0104CZ R\u00d3W LEVEL SECURITY ;\n\nSTW\u00d3RZ POLITYK\u0118 doc_select NA store.docs DLA WYBORU DO service_functions U\u017bYWAJ\u0104C ( (SELECT store.check_select(id)) );\nSTW\u00d3RZ POLITYK\u0118 doc_insert NA store.docs DLA WSTAWIANIA DO service_functions Z KONTROL\u0104 ( (SELECT store.check_insert(id)) );\nSTW\u00d3RZ POLITYK\u0118 docs_delete NA store.docs DLA USUNI\u0118CIA DO service_functions U\u017bYWAJ\u0104C ( (SELECT store.check_delete(id)) );\n\nSTW\u00d3RZ POLITYK\u0118 doc_update_using NA store.docs DLA AKTUALIZACJI DO service_functions U\u017bYWAJ\u0104C ( (SELECT store.update_using(id , is_del )) );\nSTW\u00d3RZ POLITYK\u0118 doc_update_check NA store.docs DLA AKTUALIZACJI DO service_functions Z KONTROL\u0104 ( (SELECT store.update_with_check(id , is_del )) );<\/code><\/pre>\n<p><\/p>\n<h2>Podsumowanie<\/h2>\n<p>\nTo dzia\u0142a.<\/p>\n<p>Zaproponowana strategia umo\u017cliwi\u0142a przeniesienie realizacji modelu r\u00f3l z poziomu funkcji biznesowych na poziom przechowywania danych. <\/p>\n<p>Funkcje mog\u0105 by\u0107 u\u017cywane jako szablon do wdra\u017cania bardziej z\u0142o\u017conych modeli ukrywania danych, je\u015bli wymaga tego zapotrzebowanie biznesowe.<br \/>\n<br \/>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/516040\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0420\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u0442\u0435\u043c\u044b \u042d\u0442\u044e\u0434 \u043f\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Row Level Secutity \u0432 PostgreSQL \u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 \u00ab\u0411\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430 \u0432 \u0411\u0414\u00bb, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0447\u0443\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0437\u0434\u0435\u0441\u044c \u2014 \u042d\u0442\u044e\u0434 \u043f\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 PostgreSQL \u0422\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Postgres Pro \u2014 \u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0437\u0430\u0449\u0438\u0442\u044b \u0441\u0442\u0440\u043e\u043a. \u041d\u0438\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":92115,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-92114","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0420\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u0442\u0435\u043c\u044b \u042d\u0442\u044e\u0434 \u043f\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Row Level Secutity \u0432 PostgreSQL \u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/realizacziya-rolevoj-modeli-dostupa-s-ispolzovaniem-row-level-security-v-postgresql\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u043e\u043b\u0435\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Row Level Security \u0432 PostgreSQL | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0420\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u0442\u0435\u043c\u044b \u042d\u0442\u044e\u0434 \u043f\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Row Level Secutity \u0432 PostgreSQL \u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/realizacziya-rolevoj-modeli-dostupa-s-ispolzovaniem-row-level-security-v-postgresql\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-08-23T17:41:56+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-08-23T17:41:56+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Realizacja modelu dost\u0119pu opartego na rolach z wykorzystaniem Row Level Security w PostgreSQL | ProHoster","description":"Rozw\u00f3j tematu studium na temat realizacji Row Level Security w PostgreSQL oraz na rozbudowan\u0105 odpowied\u017a na","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/realizacziya-rolevoj-modeli-dostupa-s-ispolzovaniem-row-level-security-v-postgresql","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u043e\u043b\u0435\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Row Level Security \u0432 PostgreSQL | ProHoster","og:description":"\u0420\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u0442\u0435\u043c\u044b \u042d\u0442\u044e\u0434 \u043f\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Row Level Secutity \u0432 PostgreSQL \u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/realizacziya-rolevoj-modeli-dostupa-s-ispolzovaniem-row-level-security-v-postgresql","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-08-23T17:41:56+00:00","article:modified_time":"2020-08-23T17:41:56+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"92114","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 12:14:23","updated":"2022-10-06 10:04:45","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/92114","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=92114"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/92114\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/92115"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=92114"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=92114"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=92114"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}