{"id":34794,"date":"2024-09-23T11:51:59","date_gmt":"2024-09-23T09:51:59","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/?p=34794"},"modified":"2024-09-23T11:52:02","modified_gmt":"2024-09-23T09:52:02","slug":"postgresql-pg_dump-and-extension-ownership","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/postgresql-pg_dump-and-extension-ownership\/","title":{"rendered":"PostgreSQL: pg_dump and extension ownership"},"content":{"rendered":"\n<p>While <a href=\"https:\/\/www.postgresql.org\/docs\/current\/app-pgdump.html\">pg_dump<\/a> must not be considered a backup tool (please use physical backups for this), it is widely used to dump and reload data. One of the main advantages is, that you can do this across major versions of PostgreSQL. Other advantages are the plenty of options you have for dumping data out of a PostgreSQL database: Only the schema, only the data, only specific tables and much more. While pg_dump will also dump the statements to create the extensions which are present in the source database, there is something you need to be aware of when it comes to permissions and ownership.<\/p>\n\n\n\n<p>As usual, we&#8217;ll start by creating a little test case:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; highlight: [1,7,9]; title: ; notranslate\" title=\"\">\npostgres=# select current_user;\n current_user \n--------------\n postgres\n(1 row)\n\npostgres=# create user u with login password &#039;u&#039;;\nCREATE ROLE\npostgres=# \\du\n                             List of roles\n Role name |                         Attributes                         \n-----------+------------------------------------------------------------\n postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS\n u         | \n\n<\/pre><\/div>\n\n\n<p>We&#8217;ve created a new user with the login privilege and now we want to use this user to create an extension in the postgres database:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; highlight: [1,3]; title: ; notranslate\" title=\"\">\npostgres=# \\c postgres u\nYou are now connected to database &quot;postgres&quot; as user &quot;u&quot;.\npostgres=&gt; create extension pg_trgm;\nERROR:  permission denied to create extension &quot;pg_trgm&quot;\nHINT:  Must have CREATE privilege on current database to create this extension.\n<\/pre><\/div>\n\n\n<p>The hint in the error message is pretty clear: For being able to do this we need the &#8220;create&#8221; privilege on the database, so:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; highlight: [1,3,5,7]; title: ; notranslate\" title=\"\">\npostgres=&gt; \\c postgres postgres\nYou are now connected to database &quot;postgres&quot; as user &quot;postgres&quot;.\npostgres=# grant create on database postgres to u;\nGRANT\npostgres=# \\c postgres u\nYou are now connected to database &quot;postgres&quot; as user &quot;u&quot;.\npostgres=&gt; create extension pg_trgm;\nCREATE EXTENSION\n<\/pre><\/div>\n\n\n<p>Using the corresponding meta command of <a href=\"https:\/\/www.postgresql.org\/docs\/current\/app-psql.html\">psql<\/a>, you&#8217;ll not see any ownership information of the extension just installed:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; highlight: [1]; title: ; notranslate\" title=\"\">\npostgres=&gt; \\dx\n                                    List of installed extensions\n  Name   | Version |   Schema   |                            Description                            \n---------+---------+------------+-------------------------------------------------------------------\n pg_trgm | 1.6     | public     | text similarity measurement and index searching based on trigrams\n plpgsql | 1.0     | pg_catalog | PL\/pgSQL procedural language\n(2 rows)\n<\/pre><\/div>\n\n\n<p>You can see this, however, in the <a href=\"https:\/\/www.postgresql.org\/docs\/current\/catalog-pg-extension.html\">pg_extension<\/a> catalog table, which lists all the extensions currently installed in the database you&#8217;re connected to:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; highlight: [1]; title: ; notranslate\" title=\"\">\npostgres=&gt; select * from pg_extension;\n  oid  | extname | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition \n-------+---------+----------+--------------+----------------+------------+-----------+--------------\n 13575 | plpgsql |       10 |           11 | f              | 1.0        |           | \n 16390 | pg_trgm |    16388 |         2200 | t              | 1.6        |           | \n(2 rows)\n<\/pre><\/div>\n\n\n<p>Looking at this, it becomes clear that the &#8220;plgsql&#8221; extension (which was already there when we started) does not have the same owner as the &#8220;pg_trgm&#8221; extension we&#8217;ve just installed. We can easily get the names of the those users (or roles) by joining pg_extension to <a href=\"https:\/\/www.postgresql.org\/docs\/current\/view-pg-user.html\">pg_user<\/a>:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\npostgres=&gt; select e.extname, u.usename \n             from pg_extension e \n             join pg_user u on e.extowner = u.usesysid;\n extname | usename  \n---------+----------\n plpgsql | postgres\n pg_trgm | u\n(2 rows)\n<\/pre><\/div>\n\n\n<p>Not a big surprise: The &#8220;plgsql&#8221; extension is owned by the postgres superuser, and the &#8220;pg_trgm&#8221; extension is owned by our &#8220;u&#8221; user. Let&#8217;s dump this database, drop the extension we&#8217;ve installed and the reload the dump and the verify the ownership of the extension:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; highlight: [1,2,4,22]; title: ; notranslate\" title=\"\">\npostgres=&gt; \\! pg_dump &gt; a.dmp\npostgres=&gt; drop extension pg_trgm;\nDROP EXTENSION\npostgres=&gt; \\! psql &lt; a.dmp\nSET\nSET\nSET\nSET\nSET\nSET\n set_config \n------------\n \n(1 row)\n\nSET\nSET\nSET\nSET\nCREATE EXTENSION\nCOMMENT\npostgres=&gt; select e.extname, u.usename from pg_extension e join pg_user u on e.extowner = u.usesysid;\n extname | usename  \n---------+----------\n plpgsql | postgres\n pg_trgm | postgres\n(2 rows)\n<\/pre><\/div>\n\n\n<p>Now we have the surprise: The extension is not anymore owned by &#8220;u&#8221;, but by &#8220;postgres&#8221; because we&#8217;ve loaded the dump with the postgres superuser. This is a known <a href=\"https:\/\/www.postgresql.org\/message-id\/flat\/18625-77d1e2609972c616%40postgresql.org\" target=\"_blank\" rel=\"noreferrer noopener\">behavior\/limitation<\/a> of pg_dump, and if you look into the dump file it becomes clear why it is that way:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; highlight: [1]; title: ; notranslate\" title=\"\">\npostgres=&gt; \\! cat a.dmp\n--\n-- PostgreSQL database dump\n--\n\n-- Dumped from database version 18devel\n-- Dumped by pg_dump version 18devel\n\nSET statement_timeout = 0;\nSET lock_timeout = 0;\nSET idle_in_transaction_session_timeout = 0;\nSET transaction_timeout = 0;\nSET client_encoding = &#039;UTF8&#039;;\nSET standard_conforming_strings = on;\nSELECT pg_catalog.set_config(&#039;search_path&#039;, &#039;&#039;, false);\nSET check_function_bodies = false;\nSET xmloption = content;\nSET client_min_messages = warning;\nSET row_security = off;\n\n--\n-- Name: pg_trgm; Type: EXTENSION; Schema: -; Owner: -\n--\n\nCREATE EXTENSION IF NOT EXISTS pg_trgm WITH SCHEMA public;\n\n\n--\n-- Name: EXTENSION pg_trgm; Type: COMMENT; Schema: -; Owner: \n--\n\nCOMMENT ON EXTENSION pg_trgm IS &#039;text similarity measurement and index searching based on trigrams&#039;;\n\n\n--\n-- PostgreSQL database dump complete\n--\n\n<\/pre><\/div>\n\n\n<p>There is nothing which attempts to change the ownership of the extension (and all the objects it comes with), or to create the extension with a specific owner. Loading the dump with the &#8220;u&#8221; user will result in the correct permissions of the extension:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; highlight: [1,3,5,7,25]; title: ; notranslate\" title=\"\">\npostgres=&gt; drop extension pg_trgm;\nERROR:  must be owner of extension pg_trgm\npostgres=&gt; \\c postgres postgres\nYou are now connected to database &quot;postgres&quot; as user &quot;postgres&quot;.\npostgres=# drop extension pg_trgm;\nDROP EXTENSION\npostgres=# \\! psql -U u postgres &lt; a.dmp\nSET\nSET\nSET\nSET\nSET\nSET\n set_config \n------------\n \n(1 row)\n\nSET\nSET\nSET\nSET\nCREATE EXTENSION\nCOMMENT\npostgres=# select e.extname, u.usename from pg_extension e join pg_user u on e.extowner = u.usesysid;\n extname | usename  \n---------+----------\n plpgsql | postgres\n pg_trgm | u\n(2 rows)\n<\/pre><\/div>\n\n\n<p>This is not a big deal if you are aware of it, but this might be a surprise if you aren&#8217;t. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>While pg_dump must not be considered a backup tool (please use physical backups for this), it is widely used to dump and reload data. One of the main advantages is, that you can do this across major versions of PostgreSQL. Other advantages are the plenty of options you have for dumping data out of a [&hellip;]<\/p>\n","protected":false},"author":29,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[229],"tags":[77],"type_dbi":[],"class_list":["post-34794","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>PostgreSQL: pg_dump and extension ownership - 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\/postgresql-pg_dump-and-extension-ownership\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PostgreSQL: pg_dump and extension ownership\" \/>\n<meta property=\"og:description\" content=\"While pg_dump must not be considered a backup tool (please use physical backups for this), it is widely used to dump and reload data. One of the main advantages is, that you can do this across major versions of PostgreSQL. Other advantages are the plenty of options you have for dumping data out of a [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/postgresql-pg_dump-and-extension-ownership\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2024-09-23T09:51:59+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-09-23T09:52:02+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=\"2 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\/postgresql-pg_dump-and-extension-ownership\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/postgresql-pg_dump-and-extension-ownership\/\"},\"author\":{\"name\":\"Daniel Westermann\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"headline\":\"PostgreSQL: pg_dump and extension ownership\",\"datePublished\":\"2024-09-23T09:51:59+00:00\",\"dateModified\":\"2024-09-23T09:52:02+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/postgresql-pg_dump-and-extension-ownership\/\"},\"wordCount\":432,\"commentCount\":0,\"keywords\":[\"PostgreSQL\"],\"articleSection\":[\"Database Administration &amp; Monitoring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/postgresql-pg_dump-and-extension-ownership\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/postgresql-pg_dump-and-extension-ownership\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/postgresql-pg_dump-and-extension-ownership\/\",\"name\":\"PostgreSQL: pg_dump and extension ownership - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2024-09-23T09:51:59+00:00\",\"dateModified\":\"2024-09-23T09:52:02+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/postgresql-pg_dump-and-extension-ownership\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/postgresql-pg_dump-and-extension-ownership\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/postgresql-pg_dump-and-extension-ownership\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PostgreSQL: pg_dump and extension ownership\"}]},{\"@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":"PostgreSQL: pg_dump and extension ownership - 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\/postgresql-pg_dump-and-extension-ownership\/","og_locale":"en_US","og_type":"article","og_title":"PostgreSQL: pg_dump and extension ownership","og_description":"While pg_dump must not be considered a backup tool (please use physical backups for this), it is widely used to dump and reload data. One of the main advantages is, that you can do this across major versions of PostgreSQL. Other advantages are the plenty of options you have for dumping data out of a [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/postgresql-pg_dump-and-extension-ownership\/","og_site_name":"dbi Blog","article_published_time":"2024-09-23T09:51:59+00:00","article_modified_time":"2024-09-23T09:52:02+00:00","author":"Daniel Westermann","twitter_card":"summary_large_image","twitter_creator":"@westermanndanie","twitter_misc":{"Written by":"Daniel Westermann","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-pg_dump-and-extension-ownership\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-pg_dump-and-extension-ownership\/"},"author":{"name":"Daniel Westermann","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"headline":"PostgreSQL: pg_dump and extension ownership","datePublished":"2024-09-23T09:51:59+00:00","dateModified":"2024-09-23T09:52:02+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-pg_dump-and-extension-ownership\/"},"wordCount":432,"commentCount":0,"keywords":["PostgreSQL"],"articleSection":["Database Administration &amp; Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/postgresql-pg_dump-and-extension-ownership\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-pg_dump-and-extension-ownership\/","url":"https:\/\/www.dbi-services.com\/blog\/postgresql-pg_dump-and-extension-ownership\/","name":"PostgreSQL: pg_dump and extension ownership - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2024-09-23T09:51:59+00:00","dateModified":"2024-09-23T09:52:02+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-pg_dump-and-extension-ownership\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/postgresql-pg_dump-and-extension-ownership\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-pg_dump-and-extension-ownership\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"PostgreSQL: pg_dump and extension ownership"}]},{"@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\/34794","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=34794"}],"version-history":[{"count":10,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/34794\/revisions"}],"predecessor-version":[{"id":34804,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/34794\/revisions\/34804"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=34794"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=34794"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=34794"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=34794"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}