{"id":14737,"date":"2020-09-23T07:28:28","date_gmt":"2020-09-23T05:28:28","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/using-postgresqls-adminpack-extension-to-write-files\/"},"modified":"2020-09-23T07:28:28","modified_gmt":"2020-09-23T05:28:28","slug":"using-postgresqls-adminpack-extension-to-write-files","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/using-postgresqls-adminpack-extension-to-write-files\/","title":{"rendered":"Using PostgreSQL&#8217;s adminpack extension to write files"},"content":{"rendered":"<p>In PostgreSQL you have several ways of working with files and you can find quite some examples here on our blog, e.g. <a href=\"https:\/\/www.dbi-services.com\/blog\/modifying-pg_hba-conf-from-inside-postgresql\/\" target=\"_blank\" rel=\"noopener noreferrer\">Modifying pg_hba.conf from inside PostgreSQL<\/a>, <a href=\"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-4-external-tables\/\" target=\"_blank\" rel=\"noopener noreferrer\">Can I do it with PostgreSQL? \u2013 4 \u2013 External tables<\/a> or <a href=\"https:\/\/www.dbi-services.com\/blog\/working-with-files-on-the-filesystem-in-postgresql\/\" target=\"_blank\" rel=\"noopener noreferrer\">Working with files on the filesystem in PostgreSQL<\/a>. There is also <a href=\"https:\/\/www.postgresql.org\/docs\/current\/sql-copy.html\" target=\"_blank\" rel=\"noopener noreferrer\">copy<\/a> which allows you to load or unload tables and there is the <a href=\"https:\/\/www.postgresql.org\/docs\/current\/adminpack.html\" target=\"_blank\" rel=\"noopener noreferrer\">adminpack<\/a> extension which is the topic of this post.<\/p>\n<p><!--more--><\/p>\n<p>As adminpack comes as an extension it obviously needs to be added to the database you want to use it in:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1; highlight: [1,8,10,14]\">\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\npostgres=# create extension adminpack;\nCREATE EXTENSION\npostgres=# dx\n                        List of installed extensions\n   Name    | Version |   Schema   |               Description               \n-----------+---------+------------+-----------------------------------------\n adminpack | 2.1     | pg_catalog | administrative functions for PostgreSQL\n plpgsql   | 1.0     | pg_catalog | PL\/pgSQL procedural language\n(2 rows)\n<\/pre>\n<p>Basically adminpack adds theses functions for working with files:<\/p>\n<ul>\n<li>pg_file_write: writes or appends to files<\/li>\n<li>pg_file_sync: forces the flush of a given file (new in PostgreSQL 13)<\/li>\n<li>pg_file_rename: renames a file<\/li>\n<li>pg_file_unlink: deletes a file<\/li>\n<li>pg_logdir_ls : lists the log files in the log directory<\/li>\n<\/ul>\n<p>To have something to work with let&#8217;s start by creating a simple file and add some text to it:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# select pg_file_write('\/var\/tmp\/a.txt','test test', 'false');\n pg_file_write \n---------------\n             9\n(1 row)\n<\/pre>\n<p>The last parameter of the function specifies if you want to append to a file or not. Doing exactly the same again will give you an error as the file is already existing:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# select pg_file_write('\/var\/tmp\/a.txt','test test', 'false');\nERROR:  file \"\/var\/tmp\/a.txt\" exists\n<\/pre>\n<p>Looking at the content of the file it contains exactly what we just wrote (everything else would be very surprising anyway):<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# select pg_read_file('\/var\/tmp\/a.txt');\n pg_read_file \n--------------\n test test\n(1 row)\n<\/pre>\n<p>Note that <a href=\"https:\/\/www.postgresql.org\/docs\/13\/functions-admin.html#FUNCTIONS-ADMIN-GENFILE-TABLE\" target=\"_blank\" rel=\"noopener noreferrer\">pg_read_file<\/a> is not coming with the adminpack extension but is there by default. Adding additional content to the file is done using the same function but switching the append parameter to true:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# select pg_file_write('\/var\/tmp\/a.txt','blubb blubb', 'true');\n pg_file_write \n---------------\n            11\n(1 row)\n\npostgres=# select pg_read_file('\/var\/tmp\/a.txt');\n     pg_read_file     \n----------------------\n test testblubb blubb\n(1 row)\n<\/pre>\n<p>Renaming the file is easy as well:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# select pg_file_rename('\/var\/tmp\/a.txt','\/var\/tmp\/b.txt');\n pg_file_rename \n----------------\n t\n(1 row)\n\npostgres=# ! cat \/var\/tmp\/b.txt\ntest testblubb blubbpostgres=# \n<\/pre>\n<p>&#8230; and finally deleting when you&#8217;re done:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# select pg_file_unlink('\/var\/tmp\/b.txt');\n pg_file_unlink \n----------------\n t\n(1 row)\n\npostgres=# ! ls \/var\/tmp\/b.txt\nls: cannot access '\/var\/tmp\/b.txt': No such file or directory\npostgres=# \n<\/pre>\n<p>All quite easy and convenient to use. But there are some security considerations. As I am connected as a superuser I can easily do all that stuff. But that also means I can potentially destroy my cluster:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# ! echo $PGDATA\n\/u02\/pgdata\/DEV\npostgres=# ! ls \/u02\/pgdata\/DEV\nbase              pg_commit_ts  pg_ident.conf  pg_multixact  pg_serial     pg_stat_tmp  pg_twophase  pg_xact               postmaster.opts\ncurrent_logfiles  pg_dynshmem   pg_log         pg_notify     pg_snapshots  pg_subtrans  PG_VERSION   postgresql.auto.conf  postmaster.pid\nglobal            pg_hba.conf   pg_logical     pg_replslot   pg_stat       pg_tblspc    pg_wal       postgresql.conf\n\npostgres=# select pg_file_write('\/u02\/pgdata\/DEV\/postmaster.opts','do not do that',true);\n pg_file_write \n---------------\n            14\n(1 row)\n\npostgres=# ! cat \/u02\/pgdata\/DEV\/postmaster.opts\n\/u01\/app\/postgres\/product\/DEV\/db_1\/bin\/postgres \"-D\" \"\/u02\/pgdata\/DEV\"\ndo not do that\n<\/pre>\n<p>In this case nothing really happens as that file is not super important but potentially you can write to all the files in $PGDATA and all the files in the operating system the postgres user has access to.<\/p>\n<p>Standard users, however, do not have access to these functions by default:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# create user u with login password 'u';\nCREATE ROLE\npostgres=# c postgres u\nYou are now connected to database \"postgres\" as user \"u\".\npostgres=&gt; select pg_file_write('\/var\/tmp\/c.txt','dummy',false);\nERROR:  permission denied for function pg_file_write\n<\/pre>\n<p>If you really trust a specific user you may grant access to these functions:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# c postgres postgres\nYou are now connected to database \"postgres\" as user \"postgres\".\npostgres=# grant EXECUTE on function pg_file_write to u;\nGRANT\npostgres=# c postgres u\nYou are now connected to database \"postgres\" as user \"u\".\npostgres=&gt; ! pwd\n\/home\/postgres\npostgres=&gt; select pg_file_write('a.txt','dummy',true);\n pg_file_write \n---------------\n             5\n(1 row)\n\npostgres=&gt; ! ls \/u02\/pgdata\/DEV\/a.txt\n\/u02\/pgdata\/DEV\/a.txt\npostgres=&gt; \n<\/pre>\n<p>If you do it like that the user can write files in $PGDATA only. Writing to another location in the operating system will not work:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=&gt; select pg_file_write('\/var\/tmp\/a.txt','dummy',true);\nERROR:  absolute path not allowed\npostgres=&gt; select pg_file_write('..\/..\/..\/var\/tmp\/a.txt','dummy',true);\nERROR:  path must be in or below the current directory\n<\/pre>\n<p>If you want to have that as well for a specific user you need to give additional permissions:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=&gt; c postgres postgres\nYou are now connected to database \"postgres\" as user \"postgres\".\npostgres=# grant pg_write_server_files to u;\nGRANT ROLE\npostgres=# c postgres u\nYou are now connected to database \"postgres\" as user \"u\".\npostgres=&gt; select pg_file_write('\/var\/tmp\/a.txt','dummy',true);\n pg_file_write \n---------------\n             5\n(1 row)\n<\/pre>\n<p>But again, be careful with such powerful permissions.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In PostgreSQL you have several ways of working with files and you can find quite some examples here on our blog, e.g. Modifying pg_hba.conf from inside PostgreSQL, Can I do it with PostgreSQL? \u2013 4 \u2013 External tables or Working with files on the filesystem in PostgreSQL. There is also copy which allows you to [&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-14737","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.5) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Using PostgreSQL&#039;s adminpack extension to write files - 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\/using-postgresqls-adminpack-extension-to-write-files\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Using PostgreSQL&#039;s adminpack extension to write files\" \/>\n<meta property=\"og:description\" content=\"In PostgreSQL you have several ways of working with files and you can find quite some examples here on our blog, e.g. Modifying pg_hba.conf from inside PostgreSQL, Can I do it with PostgreSQL? \u2013 4 \u2013 External tables or Working with files on the filesystem in PostgreSQL. There is also copy which allows you to [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/using-postgresqls-adminpack-extension-to-write-files\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-09-23T05:28:28+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\\\/using-postgresqls-adminpack-extension-to-write-files\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/using-postgresqls-adminpack-extension-to-write-files\\\/\"},\"author\":{\"name\":\"Daniel Westermann\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"headline\":\"Using PostgreSQL&#8217;s adminpack extension to write files\",\"datePublished\":\"2020-09-23T05:28:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/using-postgresqls-adminpack-extension-to-write-files\\\/\"},\"wordCount\":430,\"commentCount\":0,\"keywords\":[\"PostgreSQL\"],\"articleSection\":[\"Database Administration &amp; Monitoring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/using-postgresqls-adminpack-extension-to-write-files\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/using-postgresqls-adminpack-extension-to-write-files\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/using-postgresqls-adminpack-extension-to-write-files\\\/\",\"name\":\"Using PostgreSQL's adminpack extension to write files - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\"},\"datePublished\":\"2020-09-23T05:28:28+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/using-postgresqls-adminpack-extension-to-write-files\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/using-postgresqls-adminpack-extension-to-write-files\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/using-postgresqls-adminpack-extension-to-write-files\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Using PostgreSQL&#8217;s adminpack extension to write files\"}]},{\"@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":"Using PostgreSQL's adminpack extension to write files - 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\/using-postgresqls-adminpack-extension-to-write-files\/","og_locale":"en_US","og_type":"article","og_title":"Using PostgreSQL's adminpack extension to write files","og_description":"In PostgreSQL you have several ways of working with files and you can find quite some examples here on our blog, e.g. Modifying pg_hba.conf from inside PostgreSQL, Can I do it with PostgreSQL? \u2013 4 \u2013 External tables or Working with files on the filesystem in PostgreSQL. There is also copy which allows you to [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/using-postgresqls-adminpack-extension-to-write-files\/","og_site_name":"dbi Blog","article_published_time":"2020-09-23T05:28:28+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\/using-postgresqls-adminpack-extension-to-write-files\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/using-postgresqls-adminpack-extension-to-write-files\/"},"author":{"name":"Daniel Westermann","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"headline":"Using PostgreSQL&#8217;s adminpack extension to write files","datePublished":"2020-09-23T05:28:28+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/using-postgresqls-adminpack-extension-to-write-files\/"},"wordCount":430,"commentCount":0,"keywords":["PostgreSQL"],"articleSection":["Database Administration &amp; Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/using-postgresqls-adminpack-extension-to-write-files\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/using-postgresqls-adminpack-extension-to-write-files\/","url":"https:\/\/www.dbi-services.com\/blog\/using-postgresqls-adminpack-extension-to-write-files\/","name":"Using PostgreSQL's adminpack extension to write files - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2020-09-23T05:28:28+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/using-postgresqls-adminpack-extension-to-write-files\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/using-postgresqls-adminpack-extension-to-write-files\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/using-postgresqls-adminpack-extension-to-write-files\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Using PostgreSQL&#8217;s adminpack extension to write files"}]},{"@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\/14737","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=14737"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/14737\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=14737"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=14737"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=14737"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=14737"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}