{"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\/de\/blog\/administrirovanie\/realizacziya-rolevoj-modeli-dostupa-s-ispolzovaniem-row-level-security-v-postgresql","title":{"rendered":"Implementierung eines Rollenmodells f\u00fcr den Zugriff mit Row Level Security in PostgreSQL","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Entwicklung des Themas <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/515896\/\">\u00c9tude zur Implementierung von Row Level Security in PostgreSQL<\/a><\/noindex> und <b>f\u00fcr eine umfassende Antwort<\/b> auf <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/515628\/#comment_21973176\">Kommentar.<\/a><\/noindex><\/p>\n<p>Die verwendete Strategie basiert auf dem Konzept \"Business-Logik in der Datenbank\", was hier etwas ausf\u00fchrlicher beschrieben wurde - <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/515628\/\">Studienbericht \u00fcber die Implementierung der Gesch\u00e4ftslogik auf Ebene von gespeicherten Funktionen in PostgreSQL<\/a><\/noindex><\/p>\n<p>Der theoretische Teil ist in der Dokumentation hervorragend beschrieben <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\">Datensicherheitspolitiken<\/a><\/noindex>. Im Folgenden wird die praktische Umsetzung <b>einer spezifischen Gesch\u00e4ftsanforderung - das rollenbasierte Zugriffsmodell - behandelt.<\/b><\/p>\n<p><img decoding=\"async\" alt=\"Implementierung eines Rollenmodells f\u00fcr den Zugriff mit Row Level Security in PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/08\/df69397b8638421732a67e457c99857c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<blockquote><p>Der Artikel enth\u00e4lt nichts Neues, es gibt keine versteckte Bedeutung oder geheimes Wissen. Es ist einfach eine Skizze zur praktischen Umsetzung einer theoretischen Idee. Wer interessiert ist \u2014 lesen Sie. Wer nicht interessiert ist \u2014 verschwenden Sie nicht Ihre Zeit.<\/p><\/blockquote>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Aufgabenstellung<\/h2>\n<p>\nEs ist notwendig, den Zugriff auf das Anzeigen \/ Einf\u00fcgen \/ \u00c4ndern \/ L\u00f6schen von Dokumenten entsprechend der Rolle des Benutzers der Anwendung zu unterscheiden. Unter einer Rolle wird ein Eintrag in der Tabelle verstanden <b>roles<\/b> die durch eine viele-zu-viele Beziehung mit der Tabelle verbunden ist. <b>users<\/b>. Die Details zur Implementierung der Tabellen wurden aus Gr\u00fcnden der Einfachheit ausgelassen. Ebenso wurden spezifische Implementierungsdetails in Bezug auf den Anwendungsbereich weggelassen.<\/p>\n<h2>Implementierung<\/h2>\n<p><\/p>\n<h4>Wir erstellen Rollen, Schemata, eine Tabelle<\/h4>\n<p><\/p>\n<p>                        <b class=\"spoiler_title\">Erstellung von Datenbankobjekten<\/b><\/p>\n<pre><code class=\"pgsql\">CREATE ROLE store;\nCREATE SCHEMA store AUTHORIZATION store;\nCREATE TABLE store.docs\n(\n  id integer ,         --ID des Dokuments\n  man_id integer , --ID des Dokumentenmanagers\n  stat_id integer ,  --ID des Dokumentenstatus\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>Wir erstellen Funktionen zur Implementierung von RLS<\/h4>\n<p>\n\u00dcberpr\u00fcfung der M\u00f6glichkeit, eine Zeile auszuw\u00e4hlen<\/p>\n<p>                        <b class=\"spoiler_title\">check_select<\/b><\/p>\n<pre><code class=\"pgsql\">ERSTELLEN ODER ERSETZEN DER FUNKTION store.check_select ( current_id store.docs.id%TYPE ) GIBT BOOLEAN ZUR\u00dcCK AS $$\nDECLARE\n  result BOOLEAN;\n  curr_pid INTEGER;\n  curr_stat_id INTEGER;\n  doc_man_id INTEGER;\nBEGIN\n  -- DBA hat Zugriff auf alle Dokumente\n  IF SESSION_USER = 'curr_dba'\n  THEN\n    RETURN TRUE;\n  END IF;\n  --------------------------------\n\n  --Wenn das Dokument das Label 'gel\u00f6scht' hat, nicht in der Auswahl anzeigen\n  SELECT\n    is_del\n  INTO\n    result\n  FROM\n    store.docs\n  WHERE\n    id = current_id;\n IF result = TRUE\n THEN\n   RETURN FALSE;\n END IF;\n --------------------------------\n\n --Aktuelle Benutzer-ID abrufen\n SELECT\n   service_function.get_curr_pid()\n INTO\n   curr_pid;\n --------------------------------\n\n --ID des Dokumentenmanagers abrufen\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 --Wenn der Dokumentenmanager nicht der aktuelle Benutzer oder kein Manager zugewiesen ist\n --das Dokument zur Auswahl hinzuf\u00fcgen\n IF doc_man_id != curr_pid OR doc_man_id IS NULL\n THEN\n   RETURN TRUE;\n ELSE\n   --Aktuellen Dokumentenstatus abrufen\n   SELECT\n     stat_id                                        \n   INTO\n     curr_statid\n   FROM\n     store.docs\n   WHERE\n     id = current_id;\n    \n   --Wenn der Status das Ansehen des Dokuments erlaubt - Dokument zur Auswahl hinzuf\u00fcgen                     \n   IF curr_statid = 4 OR curr_statid = 9\n   THEN\n     RETURN TRUE;\n   ELSE\n   --Sonst - Dokument von der Auswahl ausschlie\u00dfen\n     RETURN FALSE;\n    END IF;\n  END IF;\n  --------------------------------\n\n RETURN FALSE;\nEND\n$$ SPRACHE plpgsql SICHERHEITSDEFINIERER;\n\u00c4NDERN FUNKTION store.check_select( store.docs.id%TYPE ) EIGENT\u00dcMER ZU store;\nWIDERRUFEN AUSF\u00dcHRUNG F\u00dcR FUNKTION store.check_select( store.docs.id%TYPE ) VON public;\nGew\u00e4hren Sie AUSF\u00dcHRUNG F\u00dcR FUNKTION store.check_select( store.docs.id%TYPE ) AN service_functions; \n<\/code><\/pre>\n<p>\n\u00dcberpr\u00fcfung der M\u00f6glichkeit, eine Zeile INSERT zu erstellen<\/p>\n<p>                        <b class=\"spoiler_title\">check_insert<\/b><\/p>\n<pre><code class=\"pgsql\">ERSTELLEN ODER ERSETZEN DER FUNKTION store.check_insert ( current_id store.docs.id%TYPE ) GIBT BOOLEAN ZUR\u00dcCK AS $$\nDECLARE\n  curr_role_id INTEGER;\nBEGIN\n  --DBA kann in jedem Fall eine Zeile hinzuf\u00fcgen\n  IF SESSION_USER = 'curr_dba'\n  THEN\n    RETURN TRUE;\n  END IF;\n  --------------------------------\n\n --ID der Rolle des aktuellen Benutzers abrufen \n SELECT\n   service_functions.current_rid()\n  INTO\n    curr_role_id;\n --------------------------------\n\n--Wenn die Rolle die Erstellung eines neuen Dokuments erlaubt\n--erlauben\nIF curr_role_id = 3 OR curr_role_id = 5     \nTHEN\n  RETURN TRUE;\nEND IF;\n--------------------------------\nRETURN FALSE;\nEND\n$$ SPRACHE plpgsql SICHERHEITSDEFINIERER;\n\u00c4NDERN FUNKTION store.check_insert( store.docs.id%TYPE ) EIGENT\u00dcMER ZU store;\nWIDERRUFEN AUSF\u00dcHRUNG F\u00dcR FUNKTION store.check_insert( store.docs.id%TYPE ) VON public;\nGew\u00e4hren Sie AUSF\u00dcHRUNG F\u00dcR FUNKTION store.check_insert( store.docs.id%TYPE ) AN service_functions; \n<\/code><\/pre>\n<p>\n\u00dcberpr\u00fcfung der M\u00f6glichkeit, eine Zeile DELETE auszuf\u00fchren<\/p>\n<p>                        <b class=\"spoiler_title\">check_delete<\/b><\/p>\n<pre><code class=\"pgsql\">ERSTELLEN ODER ERSETZEN DER FUNKTION store.check_delete ( current_id store.docs.id%TYPE )\nGIBT BOOLEAN ZUR\u00dcCK AS $$\nBEGIN  \n  --Nur DBA kann eine Zeile l\u00f6schen \n  IF SESSION_USER = 'curr_dba'\n  THEN\n    RETURN TRUE;\n  END IF;\n  --------------------------------\n\n  RETURN FALSE;\nEND\n$$ SPRACHE plpgsql\nSICHERHEITSDEFINIERER;\n\u00c4NDERN FUNKTION store.check_delete( store.docs.id%TYPE ) EIGENT\u00dcMER ZU store;\nWIDERRUFEN AUSF\u00dcHRUNG F\u00dcR FUNKTION store.check_delete( store.docs.id%TYPE ) VON public;<\/code><\/pre>\n<p>\n\u00dcberpr\u00fcfung der M\u00f6glichkeit, eine Zeile UPDATE auszuf\u00fchren.<\/p>\n<p>                        <b class=\"spoiler_title\">update_using<\/b><\/p>\n<pre><code class=\"pgsql\">ERSTELLEN ODER ERSETZEN FUNKTION store.update_using ( current_id store.docs.id%TYPE , is_del boolean )\nGIBT boolean ZUR\u00dcCK AS $$\nBEGIN  \n   --Dokumente mit dem Status ' gel\u00f6scht ' k\u00f6nnen nicht bearbeitet werden\n   WENN is_del \n   DANN\n     ZUR\u00dcCKGEBEN FALSE ;\n SONST\n    ZUR\u00dcCKGEBEN TRUE ;\n  END IF ;\n\nEND\n$$ SPRACHE plpgsql SICHERHEITSDEFINIERER;\nALTERE FUNKTION store.update_using( store.docs.id%TYPE , boolean ) EIGENT\u00dcMER ZU store ;\nWIDERRUFEN AUSF\u00dcHRUNG AUF FUNKTION store.update_using( store.docs.id%TYPE , boolean ) VON public;\nGEW\u00c4HREN AUSF\u00dcHRUNG AUF FUNKTION store.update_using( store.docs.id%TYPE ) AN service_functions;<\/code><\/pre>\n<p><\/p>\n<p>                        <b class=\"spoiler_title\">update_check<\/b><\/p>\n<pre><code class=\"pgsql\">ERSTELLEN ODER ERSETZEN FUNKTION store.update_with_check ( current_id store.docs.id%TYPE , is_del boolean )\nGIBT boolean ZUR\u00dcCK AS $$\nDEKLARIEREN\n  current_rid integer ;\n  current_statid integer ;\nBEGIN                \n\n  --DBA kann Zeile anzeigen \n  WENN SESSION_USER = 'curr_dba'\n  DANN\n    ZUR\u00dcCKGEBEN TRUE ;\n  END IF ;\n  --------------------------------\n\n --Aktuelle Benutzerrolle abrufen \n SELECT\n   service_functions.current_rid()\n  IN\ner\tcurr_role_id ;\n --------------------------------                            \n\n --L\u00f6schung des Dokuments - Status \u00e4ndern \n WENN is_deleted\n DANN\n   --Wenn Benutzerrolle ***\n   WENN current_role_id = 3        \n   DANN\n      SELECT\n        stat_id                                          \n      IN\ner\tcurr_statid\n      VON\n        store.docs\n      WO\n        id = current_id ;\n\n      --Dokument im Status *** kann nicht gel\u00f6scht werden \n      WENN current_status_id = 11\n      DANN\n         ZUR\u00dcCKGEBEN FALSE ;\n      SONST\n      --Dokument in anderen Status kann gel\u00f6scht werden\n        ZUR\u00dcCKGEBEN TRUE ;\n      END IF ;\n\n    --Sonst, wenn Benutzerrolle ***\n    ELSIF current_role_id = 5            \n    DANN\n      --Alle Dokumentstatus \n      ZUR\u00dcCKGEBEN TRUE ;\n    SONST\n      --Andere Benutzer k\u00f6nnen Dokumente nicht l\u00f6schen\n      ZUR\u00dcCKGEBEN FALSE ;\n    END IF ;\n SONST      \n   --Aktualisierung des Dokuments erlaubt\n    ZUR\u00dcCKGEBEN TRUE ;\nEND IF ;\n\nZUR\u00dcCKGEBEN FALSE ;\nEND\n$$ SPRACHE plpgsql SICHERHEITSDEFINIERER;\nALTERE FUNKTION store.update_with_check( storg.docs.id%TYPE , boolean ) EIGENT\u00dcMER ZU store ;\nWIDERRUFEN AUSF\u00dcHRUNG AUF FUNKTION store.update_with_check( storg.docs.id%TYPE , boolean ) VON public;\nGEW\u00c4HREN AUSF\u00dcHRUNG AUF FUNKTION store.update_with_check( store.docs.id%TYPE ) AN service_functions;<\/code><\/pre>\n<p>\nAktivierung der Zeilenebene-Sicherheitsrichtlinie f\u00fcr die Tabelle.<\/p>\n<p>                        <b class=\"spoiler_title\">ZEILENEBENE-SICHERHEIT AKTIVIEREN<\/b><\/p>\n<pre><code class=\"pgsql\">ALTER TABLE store.docs ZEILENEBENE-SICHERHEIT AKTIVIEREN ;\n\nERSTELLEN RICHTLINIE doc_select AUF store.docs F\u00dcR SELECT AN service_functions VERWENDEN ( (SELECT store.check_select(id)) );\nERSTELLEN RICHTLINIE doc_insert AUF store.docs F\u00dcR INSERT AN service_functions MIT PR\u00dcFUNG ( (SELECT store.check_insert(id)) );\nERSTELLEN RICHTLINIE docs_delete AUF store.docs F\u00dcR DELETE AN service_functions VERWENDEN ( (SELECT store.check_delete(id)) );\n\nERSTELLEN RICHTLINIE doc_update_using AUF store.docs F\u00dcR UPDATE AN service_functions VERWENDEN ( (SELECT store.update_using(id , is_del )) );\nERSTELLEN RICHTLINIE doc_update_check AUF store.docs F\u00dcR UPDATE AN service_functions  MIT PR\u00dcFUNG ( (SELECT store.update_with_check(id , is_del )) );<\/code><\/pre>\n<p><\/p>\n<h2>Fazit<\/h2>\n<p>\nDas funktioniert.<\/p>\n<p>Die vorgeschlagene Strategie erm\u00f6glichte es, die Implementierung des Rollenmodells von der Ebene der Gesch\u00e4ftsprozesse auf die Ebene der Datenspeicherung zu verlagern. <\/p>\n<p>Funktionen k\u00f6nnen als Vorlage f\u00fcr die Implementierung ausgekl\u00fcgelterer Datenverbergungsmodelle dienen, wenn dies die Gesch\u00e4ftserfordernisse verlangen.<br \/>\n<br \/>Quelle: <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\/de\/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=\"de_DE\" \/>\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\/de\/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\udd47Implementierung des Rollenzugriffsmodells unter Verwendung von Row Level Security in PostgreSQL | ProHoster","description":"Entwicklung des Themas Etude zur Implementierung von Row Level Security in PostgreSQL und f\u00fcr eine ausf\u00fchrliche Antwort auf","canonical_url":"https:\/\/prohoster.info\/de\/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":"de_DE","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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/92114","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=92114"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/92114\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/92115"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=92114"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=92114"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=92114"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}