{"id":12612,"date":"2019-06-29T12:14:40","date_gmt":"2019-06-29T10:14:40","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/modifying-pg_hba-conf-from-inside-postgresql\/"},"modified":"2019-06-29T12:14:40","modified_gmt":"2019-06-29T10:14:40","slug":"modifying-pg_hba-conf-from-inside-postgresql","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/modifying-pg_hba-conf-from-inside-postgresql\/","title":{"rendered":"Modifying pg_hba.conf from inside PostgreSQL"},"content":{"rendered":"<p>During one of the sessions from the last <a href=\"https:\/\/www.pgday.ch\/2019\/\" target=\"_blank\" rel=\"noopener noreferrer\">Swiss PGDay<\/a> there was a question which could not be answered during the talk: Is it possible to modify <a href=\"https:\/\/www.postgresql.org\/docs\/current\/auth-pg-hba-conf.html\" target=\"_blank\" rel=\"noopener noreferrer\">pg_hba.conf<\/a> from inside PostgreSQL without having access to the operating system? What everybody agreed on is, that there currently is no build-in function for doing this. <\/p>\n<p><!--more--><\/p>\n<p>When you are on a recent version of PostgreSQL there is a view you can use to display the rules in pg_hba.conf:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# select * from pg_hba_file_rules ;\n line_number | type  |   database    | user_name |  address  |                 netmask                 | auth_method | options | error \n-------------+-------+---------------+-----------+-----------+-----------------------------------------+-------------+---------+-------\n          84 | local | {all}         | {all}     |           |                                         | trust       |         | \n          86 | host  | {all}         | {all}     | 127.0.0.1 | 255.255.255.255                         | trust       |         | \n          88 | host  | {all}         | {all}     | ::1       | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | trust       |         | \n          91 | local | {replication} | {all}     |           |                                         | trust       |         | \n          92 | host  | {replication} | {all}     | 127.0.0.1 | 255.255.255.255                         | trust       |         | \n          93 | host  | {replication} | {all}     | ::1       | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | trust       |         | \n          94 | host  | {all}         | {mydb}    | ::1       | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | trust       |         | \n(7 rows)\n<\/pre>\n<p>But there is nothing which allows you to directly modify that. When you are lucky and you have enough permissions there is a way to do it, though. First, lets check where pg_hba.conf is located:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# select setting from pg_settings where name like '%hba%';\n           setting           \n-----------------------------\n \/u02\/pgdata\/DEV\/pg_hba.conf\n<\/pre>\n<p>Having that information we can load that file to a table:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# create table hba ( lines text ); \nCREATE TABLE\npostgres=# copy hba from '\/u02\/pgdata\/DEV\/pg_hba.conf';\nCOPY 93\n<\/pre>\n<p>Once it is loaded we have the whole content in our table (skipping the comments and empty lines here):<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# select * from hba where lines !~ '^#' and lines !~ '^$';\n                                 lines                                 \n-----------------------------------------------------------------------\n local   all             all                                     trust\n host    all             all             127.0.0.1\/32            trust\n host    all             all             ::1\/128                 trust\n local   replication     all                                     trust\n host    replication     all             127.0.0.1\/32            trust\n host    replication     all             ::1\/128                 trust\n(6 rows)\n<\/pre>\n<p>As this is a normal table we can of course add a row:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1; highlight: [12]\">\npostgres=# insert into hba (lines) values ('host  all mydb  ::1\/128                 trust');\nINSERT 0 1\npostgres=# select * from hba where lines !~ '^#' and lines !~ '^$';\n                                 lines                                 \n-----------------------------------------------------------------------\n local   all             all                                     trust\n host    all             all             127.0.0.1\/32            trust\n host    all             all             ::1\/128                 trust\n local   replication     all                                     trust\n host    replication     all             127.0.0.1\/32            trust\n host    replication     all             ::1\/128                 trust\n host  all mydb  ::1\/128                 trust\n(7 rows)\n<\/pre>\n<p>And now we can write it back:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# copy hba to '\/u02\/pgdata\/DEV\/pg_hba.conf';\nCOPY 94\n<\/pre>\n<p>Reading the whole file confirms that our new rule is there:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# select pg_read_file('pg_hba.conf');\n                               pg_read_file                               \n--------------------------------------------------------------------------\n # PostgreSQL Client Authentication Configuration File                   +\n # ===================================================                   +\n #                                                                       +\n # Refer to the \"Client Authentication\" section in the PostgreSQL        +\n # documentation for a complete description of this file.  A short       +\n # synopsis follows.                                                     +\n #                                                                       +\n # This file controls: which hosts are allowed to connect, how clients   +\n # are authenticated, which PostgreSQL user names they can use, which    +\n # databases they can access.  Records take one of these forms:          +\n #                                                                       +\n # local      DATABASE  USER  METHOD  [OPTIONS]                          +\n # host       DATABASE  USER  ADDRESS  METHOD  [OPTIONS]                 +\n # hostssl    DATABASE  USER  ADDRESS  METHOD  [OPTIONS]                 +\n # hostnossl  DATABASE  USER  ADDRESS  METHOD  [OPTIONS]                 +\n #                                                                       +\n # (The uppercase items must be replaced by actual values.)              +\n #                                                                       +\n # The first field is the connection type: \"local\" is a Unix-domain      +\n # socket, \"host\" is either a plain or SSL-encrypted TCP\/IP socket,      +\n # \"hostssl\" is an SSL-encrypted TCP\/IP socket, and \"hostnossl\" is a     +\n # plain TCP\/IP socket.                                                  +\n #                                                                       +\n # DATABASE can be \"all\", \"sameuser\", \"samerole\", \"replication\", a       +\n # database name, or a comma-separated list thereof. The \"all\"           +\n # keyword does not match \"replication\". Access to replication           +\n # must be enabled in a separate record (see example below).             +\n #                                                                       +\n # USER can be \"all\", a user name, a group name prefixed with \"+\", or a  +\n # comma-separated list thereof.  In both the DATABASE and USER fields   +\n # you can also write a file name prefixed with \"@\" to include names     +\n # from a separate file.                                                 +\n #                                                                       +\n # ADDRESS specifies the set of hosts the record matches.  It can be a   +\n # host name, or it is made up of an IP address and a CIDR mask that is  +\n # an integer (between 0 and 32 (IPv4) or 128 (IPv6) inclusive) that     +\n # specifies the number of significant bits in the mask.  A host name    +\n # that starts with a dot (.) matches a suffix of the actual host name.  +\n # Alternatively, you can write an IP address and netmask in separate    +\n # columns to specify the set of hosts.  Instead of a CIDR-address, you  +\n # can write \"samehost\" to match any of the server's own IP addresses,   +\n # or \"samenet\" to match any address in any subnet that the server is    +\n # directly connected to.                                                +\n #                                                                       +\n # METHOD can be \"trust\", \"reject\", \"md5\", \"password\", \"scram-sha-256\",  +\n # \"gss\", \"sspi\", \"ident\", \"peer\", \"pam\", \"ldap\", \"radius\" or \"cert\".    +\n # Note that \"password\" sends passwords in clear text; \"md5\" or          +\n # \"scram-sha-256\" are preferred since they send encrypted passwords.    +\n #                                                                       +\n # OPTIONS are a set of options for the authentication in the format     +\n # NAME=VALUE.  The available options depend on the different            +\n # authentication methods -- refer to the \"Client Authentication\"        +\n # section in the documentation for a list of which options are          +\n # available for which authentication methods.                           +\n #                                                                       +\n # Database and user names containing spaces, commas, quotes and other   +\n # special characters must be quoted.  Quoting one of the keywords       +\n # \"all\", \"sameuser\", \"samerole\" or \"replication\" makes the name lose    +\n # its special character, and just match a database or username with     +\n # that name.                                                            +\n #                                                                       +\n # This file is read on server startup and when the server receives a    +\n # SIGHUP signal.  If you edit the file on a running system, you have to +\n # SIGHUP the server for the changes to take effect, run \"pg_ctl reload\",+\n # or execute \"SELECT pg_reload_conf()\".                                 +\n #                                                                       +\n # Put your actual configuration here                                    +\n # ----------------------------------                                    +\n #                                                                       +\n # If you want to allow non-local connections, you need to add more      +\n # \"host\" records.  In that case you will also need to make PostgreSQL   +\n # listen on a non-local interface via the listen_addresses              +\n # configuration parameter, or via the -i or -h command line switches.   +\n                                                                         +\n # CAUTION: Configuring the system for local \"trust\" authentication      +\n # allows any local user to connect as any PostgreSQL user, including    +\n # the database superuser.  If you do not trust all your local users,    +\n # use another authentication method.                                    +\n                                                                         +\n                                                                         +\n # TYPE  DATABASE        USER            ADDRESS                 METHOD  +\n                                                                         +\n # \"local\" is for Unix domain socket connections only                    +\n local   all             all                                     trust   +\n # IPv4 local connections:                                               +\n host    all             all             127.0.0.1\/32            trust   +\n # IPv6 local connections:                                               +\n host    all             all             ::1\/128                 trust   +\n # Allow replication connections from localhost, by a user with the      +\n # replication privilege.                                                +\n local   replication     all                                     trust   +\n host    replication     all             127.0.0.1\/32            trust   +\n host    replication     all             ::1\/128                 trust   +\n host  all mydb  ::1\/128                 trust                           +\n(1 row)\n<\/pre>\n<p>All you need to do from now on is to reload the configuration and you&#8217;re done:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# select pg_reload_conf();\n pg_reload_conf \n----------------\n t\n(1 row)\n<\/pre>\n<p>Of course: Use with caution!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>During one of the sessions from the last Swiss PGDay there was a question which could not be answered during the talk: Is it possible to modify pg_hba.conf from inside PostgreSQL without having access to the operating system? What everybody agreed on is, that there currently is no build-in function for doing this.<\/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-12612","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>Modifying pg_hba.conf from inside PostgreSQL - 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\/modifying-pg_hba-conf-from-inside-postgresql\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Modifying pg_hba.conf from inside PostgreSQL\" \/>\n<meta property=\"og:description\" content=\"During one of the sessions from the last Swiss PGDay there was a question which could not be answered during the talk: Is it possible to modify pg_hba.conf from inside PostgreSQL without having access to the operating system? What everybody agreed on is, that there currently is no build-in function for doing this.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/modifying-pg_hba-conf-from-inside-postgresql\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2019-06-29T10:14:40+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=\"5 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\/modifying-pg_hba-conf-from-inside-postgresql\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/modifying-pg_hba-conf-from-inside-postgresql\/\"},\"author\":{\"name\":\"Daniel Westermann\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"headline\":\"Modifying pg_hba.conf from inside PostgreSQL\",\"datePublished\":\"2019-06-29T10:14:40+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/modifying-pg_hba-conf-from-inside-postgresql\/\"},\"wordCount\":206,\"commentCount\":2,\"keywords\":[\"PostgreSQL\"],\"articleSection\":[\"Database Administration &amp; Monitoring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/modifying-pg_hba-conf-from-inside-postgresql\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/modifying-pg_hba-conf-from-inside-postgresql\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/modifying-pg_hba-conf-from-inside-postgresql\/\",\"name\":\"Modifying pg_hba.conf from inside PostgreSQL - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2019-06-29T10:14:40+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/modifying-pg_hba-conf-from-inside-postgresql\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/modifying-pg_hba-conf-from-inside-postgresql\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/modifying-pg_hba-conf-from-inside-postgresql\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Modifying pg_hba.conf from inside PostgreSQL\"}]},{\"@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":"Modifying pg_hba.conf from inside PostgreSQL - 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\/modifying-pg_hba-conf-from-inside-postgresql\/","og_locale":"en_US","og_type":"article","og_title":"Modifying pg_hba.conf from inside PostgreSQL","og_description":"During one of the sessions from the last Swiss PGDay there was a question which could not be answered during the talk: Is it possible to modify pg_hba.conf from inside PostgreSQL without having access to the operating system? What everybody agreed on is, that there currently is no build-in function for doing this.","og_url":"https:\/\/www.dbi-services.com\/blog\/modifying-pg_hba-conf-from-inside-postgresql\/","og_site_name":"dbi Blog","article_published_time":"2019-06-29T10:14:40+00:00","author":"Daniel Westermann","twitter_card":"summary_large_image","twitter_creator":"@westermanndanie","twitter_misc":{"Written by":"Daniel Westermann","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/modifying-pg_hba-conf-from-inside-postgresql\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/modifying-pg_hba-conf-from-inside-postgresql\/"},"author":{"name":"Daniel Westermann","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"headline":"Modifying pg_hba.conf from inside PostgreSQL","datePublished":"2019-06-29T10:14:40+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/modifying-pg_hba-conf-from-inside-postgresql\/"},"wordCount":206,"commentCount":2,"keywords":["PostgreSQL"],"articleSection":["Database Administration &amp; Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/modifying-pg_hba-conf-from-inside-postgresql\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/modifying-pg_hba-conf-from-inside-postgresql\/","url":"https:\/\/www.dbi-services.com\/blog\/modifying-pg_hba-conf-from-inside-postgresql\/","name":"Modifying pg_hba.conf from inside PostgreSQL - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2019-06-29T10:14:40+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/modifying-pg_hba-conf-from-inside-postgresql\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/modifying-pg_hba-conf-from-inside-postgresql\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/modifying-pg_hba-conf-from-inside-postgresql\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Modifying pg_hba.conf from inside PostgreSQL"}]},{"@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\/12612","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=12612"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/12612\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=12612"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=12612"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=12612"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=12612"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}