{"id":13342,"date":"2020-01-22T15:33:17","date_gmt":"2020-01-22T14:33:17","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/adding-postgresql-extensions-without-being-super-user\/"},"modified":"2020-01-22T15:33:17","modified_gmt":"2020-01-22T14:33:17","slug":"adding-postgresql-extensions-without-being-super-user","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/adding-postgresql-extensions-without-being-super-user\/","title":{"rendered":"Adding PostgreSQL extensions without being super user?"},"content":{"rendered":"<p>Usually, when you need to install a PostgreSQL extension you do this as superuser (or at least I am doing it like this). The downside of that is, of course, that a super user must be available once a new extension is required or that all the extensions are installed by default (e.g. in template1). Recently the question popped up internally if you can install extensions without being super user. The answer is: yes and no. It depends on the objects that get created by the extensions and it depends on the permissions of the user that wants to install the extension. As always, lets do some demos as this is the easiest way to understand how things work.<\/p>\n<p><!--more--><\/p>\n<p>Currently there are no extensions installed in my database except for the standard <a href=\"https:\/\/www.postgresql.org\/docs\/current\/plpgsql.html\" target=\"_blank\" rel=\"noopener noreferrer\">PL\/pgSQLl<\/a> extension:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# dx\n                 List of installed extensions\n  Name   | Version |   Schema   |         Description          \n---------+---------+------------+------------------------------\n plpgsql | 1.0     | pg_catalog | PL\/pgSQL procedural language\n(1 row)\n<\/pre>\n<p>For the purpose of this post lets create a new user without any special permissions other than login:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# create user a with login password 'a';\nCREATE ROLE\npostgres=# du a\n           List of roles\n Role name | Attributes | Member of \n-----------+------------+-----------\n a         |            | {}\n<\/pre>\n<p>This user, even if not granted anything, by default has permissions to create objects in the public schema (you should definitely avoid that, <a href=\"https:\/\/www.dbi-services.com\/blog\/avoiding-access-to-the-public-schema-in-postgresql\/\" target=\"_blank\" rel=\"noopener noreferrer\">check here<\/a>):<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# c postgres a\nYou are now connected to database \"postgres\" as user \"a\".\npostgres=&gt; select current_database();\n current_database \n------------------\n postgres\n(1 row)\npostgres=&gt; create table tab1 ( a int );\nCREATE TABLE\n<\/pre>\n<p>What this user is not able to do, is to use <a href=\"https:\/\/www.postgresql.org\/docs\/current\/sql-createextension.html\" target=\"_blank\" rel=\"noopener noreferrer\">create extension&#8221;<\/a> to install a new extension into the database:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=&gt; create extension lo;\nERROR:  permission denied to create extension \"lo\"\nHINT:  Must be superuser to create this extension.\npostgres=&gt; \n<\/pre>\n<p>Why is that? If we take a look at the extension&#8217;s SQL file the first statement is this:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\nCREATE FUNCTION ltree_in(cstring)\nRETURNS ltree\nAS 'MODULE_PATHNAME'\nLANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;\n<\/pre>\n<p>&#8220;CREATE FUNCTION&#8221; does work as we are able to create objects in the public schema. The issue is this:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1; highlight: [5]\">\npostgres=&gt; CREATE FUNCTION ltree_in(cstring)\npostgres-&gt; RETURNS ltree\npostgres-&gt; AS 'MODULE_PATHNAME'\npostgres-&gt; LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;\nERROR:  permission denied for language c\npostgres=&gt; \n<\/pre>\n<p>We do not have access to the language. Lets try to grant the required privilege for using the language:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# grant USAGE on LANGUAGE c to a;\nERROR:  language \"c\" is not trusted\nDETAIL:  GRANT and REVOKE are not allowed on untrusted languages, because only superusers can use untrusted languages.\n<\/pre>\n<p>That does not work as well, as c is <a href=\"https:\/\/www.postgresql.org\/docs\/current\/sql-createlanguage.html\" target=\"_blank\" rel=\"noopener noreferrer\">untrusted<\/a>. The same is true for &#8220;language internal&#8221; as in intagg&#8211;1.1.sql:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=&gt; CREATE FUNCTION int_agg_state (internal, int4)\npostgres-&gt; RETURNS internal\npostgres-&gt; AS 'array_agg_transfn'\npostgres-&gt; PARALLEL SAFE\npostgres-&gt; LANGUAGE INTERNAL;\nERROR:  permission denied for language internal\n<\/pre>\n<p>As all the extensions in standard PostgreSQL community do reference either &#8220;c&#8221; or &#8220;internal&#8221; somehow we do not have any chance to get an extension installed as user &#8220;a&#8221;. Lets do another test and create a new database with user &#8220;a&#8221; as it&#8217;s owner:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres=&gt; c postgres postgres\nYou are now connected to database \"postgres\" as user \"postgres\".\npostgres=# create database dba with owner a;\nCREATE DATABASE\npostgres=# c dba a\nYou are now connected to database \"dba\" as user \"a\".\ndba=&gt; \n<\/pre>\n<p>Can we install extensions now?<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\ndba=&gt; create extension lo;\nERROR:  permission denied to create extension \"lo\"\nHINT:  Must be superuser to create this extension.\ndba=&gt; \n<\/pre>\n<p>Another error message but it still does not work. We can, however, install PL\/Perl as this is a trusted language:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\ndba=&gt; create extension plperl;\nCREATE EXTENSION\ndba=&gt; \n<\/pre>\n<p>Actually PL\/Perl is the only extension that can be installed in this scenario, which can be confirmed by a simply PL\/pgSQL code block:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\ndba=&gt; drop extension plperl;\nDROP EXTENSION\ndba=&gt; do $$\ndba$&gt; declare\ndba$&gt;   ext record;\ndba$&gt;   exception_text text;\ndba$&gt; begin\ndba$&gt;   for ext in\ndba$&gt;       select name\ndba$&gt;         from pg_available_extensions\ndba$&gt;        order by name\ndba$&gt;   loop\ndba$&gt;     begin\ndba$&gt;        execute 'create extension '||ext.name;\ndba$&gt;        raise notice 'SUCCESS for %', ext.name;\ndba$&gt;     exception\ndba$&gt;        when others\ndba$&gt;          then get stacked diagnostics exception_text = MESSAGE_TEXT;\ndba$&gt;          raise notice '% failed with %', ext.name, exception_text;\ndba$&gt;     end;\ndba$&gt;   end loop;\ndba$&gt; end $$;\nNOTICE:  adminpack failed with permission denied to create extension \"adminpack\"\nNOTICE:  amcheck failed with permission denied to create extension \"amcheck\"\nNOTICE:  autoinc failed with permission denied to create extension \"autoinc\"\nNOTICE:  bloom failed with permission denied to create extension \"bloom\"\nNOTICE:  btree_gin failed with permission denied to create extension \"btree_gin\"\nNOTICE:  btree_gist failed with permission denied to create extension \"btree_gist\"\nNOTICE:  citext failed with permission denied to create extension \"citext\"\nNOTICE:  cube failed with permission denied to create extension \"cube\"\nNOTICE:  dblink failed with permission denied to create extension \"dblink\"\nNOTICE:  dict_int failed with permission denied to create extension \"dict_int\"\nNOTICE:  dict_xsyn failed with permission denied to create extension \"dict_xsyn\"\nNOTICE:  earthdistance failed with required extension \"cube\" is not installed\nNOTICE:  file_fdw failed with permission denied to create extension \"file_fdw\"\nNOTICE:  fuzzystrmatch failed with permission denied to create extension \"fuzzystrmatch\"\nNOTICE:  hstore failed with permission denied to create extension \"hstore\"\nNOTICE:  hstore_plperl failed with required extension \"hstore\" is not installed\nNOTICE:  hstore_plperlu failed with required extension \"hstore\" is not installed\nNOTICE:  hstore_plpython2u failed with required extension \"hstore\" is not installed\nNOTICE:  hstore_plpython3u failed with required extension \"hstore\" is not installed\nNOTICE:  hstore_plpythonu failed with required extension \"hstore\" is not installed\nNOTICE:  insert_username failed with permission denied to create extension \"insert_username\"\nNOTICE:  intagg failed with permission denied to create extension \"intagg\"\nNOTICE:  intarray failed with permission denied to create extension \"intarray\"\nNOTICE:  isn failed with permission denied to create extension \"isn\"\nNOTICE:  jsonb_plperl failed with required extension \"plperl\" is not installed\nNOTICE:  jsonb_plperlu failed with required extension \"plperlu\" is not installed\nNOTICE:  jsonb_plpython2u failed with required extension \"plpython2u\" is not installed\nNOTICE:  jsonb_plpython3u failed with required extension \"plpython3u\" is not installed\nNOTICE:  jsonb_plpythonu failed with required extension \"plpythonu\" is not installed\nNOTICE:  lo failed with permission denied to create extension \"lo\"\nNOTICE:  ltree failed with permission denied to create extension \"ltree\"\nNOTICE:  ltree_plpython2u failed with required extension \"ltree\" is not installed\nNOTICE:  ltree_plpython3u failed with required extension \"ltree\" is not installed\nNOTICE:  ltree_plpythonu failed with required extension \"ltree\" is not installed\nNOTICE:  moddatetime failed with permission denied to create extension \"moddatetime\"\nNOTICE:  pageinspect failed with permission denied to create extension \"pageinspect\"\nNOTICE:  pg_buffercache failed with permission denied to create extension \"pg_buffercache\"\nNOTICE:  pg_freespacemap failed with permission denied to create extension \"pg_freespacemap\"\nNOTICE:  pg_prewarm failed with permission denied to create extension \"pg_prewarm\"\nNOTICE:  pg_stat_statements failed with permission denied to create extension \"pg_stat_statements\"\nNOTICE:  pg_trgm failed with permission denied to create extension \"pg_trgm\"\nNOTICE:  pg_visibility failed with permission denied to create extension \"pg_visibility\"\nNOTICE:  pgcrypto failed with permission denied to create extension \"pgcrypto\"\nNOTICE:  pgrowlocks failed with permission denied to create extension \"pgrowlocks\"\nNOTICE:  pgstattuple failed with permission denied to create extension \"pgstattuple\"\nNOTICE:  SUCCESS for plperl\nNOTICE:  plperlu failed with permission denied to create extension \"plperlu\"\nNOTICE:  plpgsql failed with extension \"plpgsql\" already exists\nNOTICE:  plpython3u failed with permission denied to create extension \"plpython3u\"\nNOTICE:  postgres_fdw failed with permission denied to create extension \"postgres_fdw\"\nNOTICE:  refint failed with permission denied to create extension \"refint\"\nNOTICE:  seg failed with permission denied to create extension \"seg\"\nNOTICE:  sslinfo failed with permission denied to create extension \"sslinfo\"\nNOTICE:  tablefunc failed with permission denied to create extension \"tablefunc\"\nNOTICE:  tcn failed with permission denied to create extension \"tcn\"\nNOTICE:  tsm_system_rows failed with permission denied to create extension \"tsm_system_rows\"\nNOTICE:  tsm_system_time failed with permission denied to create extension \"tsm_system_time\"\nNOTICE:  unaccent failed with permission denied to create extension \"unaccent\"\nNOTICE:  xml2 failed with permission denied to create extension \"xml2\"\nDO\n<\/pre>\n<p>If you want to install an extension that only creates objects you are allowed to create anyway, that would succeed. The probably best way to handle extensions is to install all the required ones by default and then grant permissions to the users who need them.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Usually, when you need to install a PostgreSQL extension you do this as superuser (or at least I am doing it like this). The downside of that is, of course, that a super user must be available once a new extension is required or that all the extensions are installed by default (e.g. in template1). [&hellip;]<\/p>\n","protected":false},"author":29,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[229],"tags":[77],"type_dbi":[],"class_list":["post-13342","post","type-post","status-publish","format-standard","hentry","category-database-administration-monitoring","tag-postgresql"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Adding PostgreSQL extensions without being super user? - dbi Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/adding-postgresql-extensions-without-being-super-user\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Adding PostgreSQL extensions without being super user?\" \/>\n<meta property=\"og:description\" content=\"Usually, when you need to install a PostgreSQL extension you do this as superuser (or at least I am doing it like this). The downside of that is, of course, that a super user must be available once a new extension is required or that all the extensions are installed by default (e.g. in template1). [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/adding-postgresql-extensions-without-being-super-user\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-01-22T14:33:17+00:00\" \/>\n<meta name=\"author\" content=\"Daniel Westermann\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@westermanndanie\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Daniel Westermann\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/adding-postgresql-extensions-without-being-super-user\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/adding-postgresql-extensions-without-being-super-user\/\"},\"author\":{\"name\":\"Daniel Westermann\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"headline\":\"Adding PostgreSQL extensions without being super user?\",\"datePublished\":\"2020-01-22T14:33:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/adding-postgresql-extensions-without-being-super-user\/\"},\"wordCount\":427,\"commentCount\":0,\"keywords\":[\"PostgreSQL\"],\"articleSection\":[\"Database Administration &amp; Monitoring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/adding-postgresql-extensions-without-being-super-user\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/adding-postgresql-extensions-without-being-super-user\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/adding-postgresql-extensions-without-being-super-user\/\",\"name\":\"Adding PostgreSQL extensions without being super user? - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2020-01-22T14:33:17+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/adding-postgresql-extensions-without-being-super-user\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/adding-postgresql-extensions-without-being-super-user\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/adding-postgresql-extensions-without-being-super-user\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Adding PostgreSQL extensions without being super user?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\",\"name\":\"Daniel Westermann\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"caption\":\"Daniel Westermann\"},\"description\":\"Daniel Westermann is Principal Consultant and Technology Leader Open Infrastructure at dbi services. He has more than 15 years of experience in management, engineering and optimization of databases and infrastructures, especially on Oracle and PostgreSQL. Since the beginning of his career, he has specialized in Oracle Technologies and is Oracle Certified Professional 12c and Oracle Certified Expert RAC\/GridInfra. Over time, Daniel has become increasingly interested in open source technologies, becoming \u201cTechnology Leader Open Infrastructure\u201d and PostgreSQL expert. \u00a0Based on community or EnterpriseDB tools, he develops and installs complex high available solutions with PostgreSQL. He is also a certified PostgreSQL Plus 9.0 Professional and a Postgres Advanced Server 9.4 Professional. He is a regular speaker at PostgreSQL conferences in Switzerland and Europe. Today Daniel is also supporting our customers on AWS services such as AWS RDS, database migrations into the cloud, EC2 and automated infrastructure management with AWS SSM (System Manager). He is a certified AWS Solutions Architect Professional. Prior to dbi services, Daniel was Management System Engineer at LC SYSTEMS-Engineering AG in Basel. Before that, he worked as Oracle Developper &amp;\u00a0Project Manager at Delta Energy Solutions AG in Basel (today Powel AG). Daniel holds a diploma in Business Informatics (DHBW, Germany). His branch-related experience mainly covers the pharma industry, the financial sector, energy, lottery and telecommunications.\",\"sameAs\":[\"https:\/\/x.com\/westermanndanie\"],\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/daniel-westermann\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Adding PostgreSQL extensions without being super user? - dbi Blog","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:\/\/www.dbi-services.com\/blog\/adding-postgresql-extensions-without-being-super-user\/","og_locale":"en_US","og_type":"article","og_title":"Adding PostgreSQL extensions without being super user?","og_description":"Usually, when you need to install a PostgreSQL extension you do this as superuser (or at least I am doing it like this). The downside of that is, of course, that a super user must be available once a new extension is required or that all the extensions are installed by default (e.g. in template1). [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/adding-postgresql-extensions-without-being-super-user\/","og_site_name":"dbi Blog","article_published_time":"2020-01-22T14:33:17+00:00","author":"Daniel Westermann","twitter_card":"summary_large_image","twitter_creator":"@westermanndanie","twitter_misc":{"Written by":"Daniel Westermann","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/adding-postgresql-extensions-without-being-super-user\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/adding-postgresql-extensions-without-being-super-user\/"},"author":{"name":"Daniel Westermann","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"headline":"Adding PostgreSQL extensions without being super user?","datePublished":"2020-01-22T14:33:17+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/adding-postgresql-extensions-without-being-super-user\/"},"wordCount":427,"commentCount":0,"keywords":["PostgreSQL"],"articleSection":["Database Administration &amp; Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/adding-postgresql-extensions-without-being-super-user\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/adding-postgresql-extensions-without-being-super-user\/","url":"https:\/\/www.dbi-services.com\/blog\/adding-postgresql-extensions-without-being-super-user\/","name":"Adding PostgreSQL extensions without being super user? - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2020-01-22T14:33:17+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/adding-postgresql-extensions-without-being-super-user\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/adding-postgresql-extensions-without-being-super-user\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/adding-postgresql-extensions-without-being-super-user\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Adding PostgreSQL extensions without being super user?"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66","name":"Daniel Westermann","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","caption":"Daniel Westermann"},"description":"Daniel Westermann is Principal Consultant and Technology Leader Open Infrastructure at dbi services. He has more than 15 years of experience in management, engineering and optimization of databases and infrastructures, especially on Oracle and PostgreSQL. Since the beginning of his career, he has specialized in Oracle Technologies and is Oracle Certified Professional 12c and Oracle Certified Expert RAC\/GridInfra. Over time, Daniel has become increasingly interested in open source technologies, becoming \u201cTechnology Leader Open Infrastructure\u201d and PostgreSQL expert. \u00a0Based on community or EnterpriseDB tools, he develops and installs complex high available solutions with PostgreSQL. He is also a certified PostgreSQL Plus 9.0 Professional and a Postgres Advanced Server 9.4 Professional. He is a regular speaker at PostgreSQL conferences in Switzerland and Europe. Today Daniel is also supporting our customers on AWS services such as AWS RDS, database migrations into the cloud, EC2 and automated infrastructure management with AWS SSM (System Manager). He is a certified AWS Solutions Architect Professional. Prior to dbi services, Daniel was Management System Engineer at LC SYSTEMS-Engineering AG in Basel. Before that, he worked as Oracle Developper &amp;\u00a0Project Manager at Delta Energy Solutions AG in Basel (today Powel AG). Daniel holds a diploma in Business Informatics (DHBW, Germany). His branch-related experience mainly covers the pharma industry, the financial sector, energy, lottery and telecommunications.","sameAs":["https:\/\/x.com\/westermanndanie"],"url":"https:\/\/www.dbi-services.com\/blog\/author\/daniel-westermann\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/13342","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/29"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=13342"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/13342\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=13342"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=13342"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=13342"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=13342"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}