{"id":9453,"date":"2016-11-30T17:17:27","date_gmt":"2016-11-30T16:17:27","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-5-generating-ddl-commands\/"},"modified":"2016-11-30T17:17:27","modified_gmt":"2016-11-30T16:17:27","slug":"can-i-do-it-with-postgresql-5-generating-ddl-commands","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-5-generating-ddl-commands\/","title":{"rendered":"Can I do it with PostgreSQL? \u2013 5 \u2013 Generating DDL commands"},"content":{"rendered":"<p>From time to time it is very useful that you can generate the DDL commands for existing objects (Tables, Indexes, whole Schema &#8230;). In Oracle you can either use the <a href=\"http:\/\/docs.oracle.com\/database\/122\/ARPLS\/DBMS_METADATA.htm#ARPLS026\" target=\"_blank\" rel=\"noopener\">dbms_metadata<\/a> PL\/SQL package for this or use <a href=\"http:\/\/docs.oracle.com\/database\/121\/SUTIL\/toc.htm\" target=\"_blank\" rel=\"noopener\">expdp\/impdp<\/a> to generate the statements out of a dump file. What options do you have in PostgreSQL? Note: We&#8217;ll not look at any third party tools you could use for that, only plain PostgreSQL.<\/p>\n<p><!--more--><\/p>\n<p>As always we&#8217;ll need some objects to test with, so here we go:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\nc postgres\ndrop database if exists ddl;\ncreate database ddl;\nc ddl\ncreate table t1 ( a int, b int );\ninsert into t1 (a,b)\n       values (generate_series(1,1000000)\n              ,generate_series(1,1000000));\nselect count(*) from t1;\ncreate index i1 on t1(a);\ncreate unique index i2 on t1(b);\ncreate view v1 as select a from t1;\nalter table t1 add constraint con1 check ( a &lt; 2000000 );\nd t1\nCREATE FUNCTION add(integer, integer) RETURNS integer\n    AS &#039;select $1 + $2;&#039;\n    LANGUAGE SQL\n    IMMUTABLE\n    RETURNS NULL ON NULL INPUT;\n<\/pre>\n<p>PostgreSQL comes with a set of <a href=\"https:\/\/www.postgresql.org\/docs\/current\/static\/functions-info.html\" target=\"_blank\" rel=\"noopener\">administration functions<\/a> which can be used to query various stuff. Some are there to get the definitions for your objects.<\/p>\n<p>You can get the definition of a view:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n(postgres@[local]:5439) [ddl] &gt; select pg_get_viewdef('v1'::regclass, true);\n pg_get_viewdef \n----------------\n  SELECT t1.a  +\n    FROM t1;\n(1 row)\n<\/pre>\n<p>You can get the definition of a constraint:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n(postgres@[local]:5439) [ddl] &gt; SELECT conname\n                                     , pg_get_constraintdef(r.oid, true) as definition\n                                  FROM pg_constraint r\n                                 WHERE r.conrelid = 't1'::regclass;\n conname |     definition      \n---------+---------------------\n con1    | CHECK (a &lt; 2000000)\n<\/pre>\n<p>You can get the definition of  a function:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n(postgres@[local]:5439) [ddl] &gt; SELECT proname\n     , pg_get_functiondef(a.oid)\n  FROM pg_proc a\n WHERE a.proname = 'add';\n proname |                   pg_get_functiondef                    \n---------+---------------------------------------------------------\n add     | CREATE OR REPLACE FUNCTION public.add(integer, integer)+\n         |  RETURNS integer                                       +\n         |  LANGUAGE sql                                          +\n         |  IMMUTABLE STRICT                                      +\n         | AS $function$select $1 + $2;$function$                 +\n         | \n--OR\n(postgres@[local]:5439) [ddl] &gt; SELECT pg_get_functiondef(to_regproc('add'));\n                   pg_get_functiondef                    \n---------------------------------------------------------\n CREATE OR REPLACE FUNCTION public.add(integer, integer)+\n  RETURNS integer                                       +\n  LANGUAGE sql                                          +\n  IMMUTABLE STRICT                                      +\n AS $function$select $1 + $2;$function$                 +\n\n<\/pre>\n<p>You can get the definition of an index:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n(postgres@[local]:5439) [ddl] &gt; select pg_get_indexdef('i1'::regclass);\n            pg_get_indexdef            \n---------------------------------------\n CREATE INDEX i1 ON t1 USING btree (a)\n(1 row)\n<\/pre>\n<p>But surprisingly you can not get the DDL for a table. There is just no function available to do this. How can you do that without concatenating the definitions you can get out of the PostgreSQL catalog? The only option I am aware of is pg_dump:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres@pgbox:\/home\/postgres\/ [PG961] pg_dump -s -t t1 ddl | egrep -v \"^--|^$\"\nSET statement_timeout = 0;\nSET lock_timeout = 0;\nSET idle_in_transaction_session_timeout = 0;\nSET client_encoding = 'UTF8';\nSET standard_conforming_strings = on;\nSET check_function_bodies = false;\nSET client_min_messages = warning;\nSET row_security = off;\nSET search_path = public, pg_catalog;\nSET default_tablespace = '';\nSET default_with_oids = false;\nCREATE TABLE t1 (\n    a integer,\n    b integer,\n    CONSTRAINT con1 CHECK ((a &lt; 2000000))\n);\nALTER TABLE t1 OWNER TO postgres;\nCREATE INDEX i1 ON t1 USING btree (a);\nCREATE UNIQUE INDEX i2 ON t1 USING btree (b);\n<\/pre>\n<p>Using the &#8220;-s&#8221; (schema only) and &#8220;-t&#8221; (tables) options you get the DDL for the complete table. Not as handy as in Oracle where you can do this in sqlplus but it works and produces a result you can work with.<\/p>\n<p>Of course you can always create the DDLs for your own by querying the catalog, e.g. pg_attribute which holds all the column definitions for the tables:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n    Table \"pg_catalog.pg_attribute\"\n    Column     |   Type    | Modifiers \n---------------+-----------+-----------\n attrelid      | oid       | not null\n attname       | name      | not null\n atttypid      | oid       | not null\n attstattarget | integer   | not null\n attlen        | smallint  | not null\n attnum        | smallint  | not null\n attndims      | integer   | not null\n attcacheoff   | integer   | not null\n atttypmod     | integer   | not null\n attbyval      | boolean   | not null\n attstorage    | \"char\"    | not null\n attalign      | \"char\"    | not null\n attnotnull    | boolean   | not null\n atthasdef     | boolean   | not null\n attisdropped  | boolean   | not null\n attislocal    | boolean   | not null\n attinhcount   | integer   | not null\n attcollation  | oid       | not null\n attacl        | aclitem[] | \n attoptions    | text[]    | \n attfdwoptions | text[]    | \nIndexes:\n    \"pg_attribute_relid_attnam_index\" UNIQUE, btree (attrelid, attname)\n    \"pg_attribute_relid_attnum_index\" UNIQUE, btree (attrelid, attnum)\n<\/pre>\n<p>One nasty way which which is even documented on the <a href=\"https:\/\/wiki.postgresql.org\/wiki\/User:Ziga\/xpg_dump\" target=\"_blank\" rel=\"noopener\">PostgreSQL wiki<\/a> is this:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n(postgres@[local]:5439) [ddl] &gt; create extension plperlu;\nCREATE EXTENSION\nTime: 90.074 ms\n(postgres@[local]:5439) [ddl] &gt; dx\n                      List of installed extensions\n  Name   | Version |   Schema   |              Description               \n---------+---------+------------+----------------------------------------\n plperlu | 1.0     | pg_catalog | PL\/PerlU untrusted procedural language\n plpgsql | 1.0     | pg_catalog | PL\/pgSQL procedural language\n\n(postgres@[local]:5439) [ddl] &gt; CREATE OR REPLACE FUNCTION system(text) RETURNS text \nAS 'my $cmd=shift; return `cd \/tmp;$cmd`;' LANGUAGE plperlu;\nCREATE FUNCTION\n\n(postgres@[local]:5439) [ddl] &gt; select system('pg_dump -s -t t1 ddl | egrep -v \"^--|^$\"');\n                    system                     \n-----------------------------------------------\n SET statement_timeout = 0;                   +\n SET lock_timeout = 0;                        +\n SET idle_in_transaction_session_timeout = 0; +\n SET client_encoding = 'UTF8';                +\n SET standard_conforming_strings = on;        +\n SET check_function_bodies = false;           +\n SET client_min_messages = warning;           +\n SET row_security = off;                      +\n SET search_path = public, pg_catalog;        +\n SET default_tablespace = '';                 +\n SET default_with_oids = false;               +\n CREATE TABLE t1 (                            +\n     a integer,                               +\n     b integer,                               +\n     CONSTRAINT con1 CHECK ((a &lt; 2000000))    +\n );                                           +\n ALTER TABLE t1 OWNER TO postgres;            +\n CREATE INDEX i1 ON t1 USING btree (a);       +\n CREATE UNIQUE INDEX i2 ON t1 USING btree (b);+\n \n<\/pre>\n<p>Can be a workaround. Hope this helps&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>From time to time it is very useful that you can generate the DDL commands for existing objects (Tables, Indexes, whole Schema &#8230;). In Oracle you can either use the dbms_metadata PL\/SQL package for this or use expdp\/impdp to generate the statements out of a dump file. What options do you have in PostgreSQL? Note: [&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-9453","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>Can I do it with PostgreSQL? \u2013 5 \u2013 Generating DDL commands - 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\/can-i-do-it-with-postgresql-5-generating-ddl-commands\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Can I do it with PostgreSQL? \u2013 5 \u2013 Generating DDL commands\" \/>\n<meta property=\"og:description\" content=\"From time to time it is very useful that you can generate the DDL commands for existing objects (Tables, Indexes, whole Schema &#8230;). In Oracle you can either use the dbms_metadata PL\/SQL package for this or use expdp\/impdp to generate the statements out of a dump file. What options do you have in PostgreSQL? Note: [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-5-generating-ddl-commands\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-11-30T16:17:27+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=\"4 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\/can-i-do-it-with-postgresql-5-generating-ddl-commands\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-5-generating-ddl-commands\/\"},\"author\":{\"name\":\"Daniel Westermann\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"headline\":\"Can I do it with PostgreSQL? \u2013 5 \u2013 Generating DDL commands\",\"datePublished\":\"2016-11-30T16:17:27+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-5-generating-ddl-commands\/\"},\"wordCount\":292,\"commentCount\":0,\"keywords\":[\"PostgreSQL\"],\"articleSection\":[\"Database Administration &amp; Monitoring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-5-generating-ddl-commands\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-5-generating-ddl-commands\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-5-generating-ddl-commands\/\",\"name\":\"Can I do it with PostgreSQL? \u2013 5 \u2013 Generating DDL commands - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2016-11-30T16:17:27+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-5-generating-ddl-commands\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-5-generating-ddl-commands\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-5-generating-ddl-commands\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Can I do it with PostgreSQL? \u2013 5 \u2013 Generating DDL commands\"}]},{\"@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":"Can I do it with PostgreSQL? \u2013 5 \u2013 Generating DDL commands - 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\/can-i-do-it-with-postgresql-5-generating-ddl-commands\/","og_locale":"en_US","og_type":"article","og_title":"Can I do it with PostgreSQL? \u2013 5 \u2013 Generating DDL commands","og_description":"From time to time it is very useful that you can generate the DDL commands for existing objects (Tables, Indexes, whole Schema &#8230;). In Oracle you can either use the dbms_metadata PL\/SQL package for this or use expdp\/impdp to generate the statements out of a dump file. What options do you have in PostgreSQL? Note: [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-5-generating-ddl-commands\/","og_site_name":"dbi Blog","article_published_time":"2016-11-30T16:17:27+00:00","author":"Daniel Westermann","twitter_card":"summary_large_image","twitter_creator":"@westermanndanie","twitter_misc":{"Written by":"Daniel Westermann","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-5-generating-ddl-commands\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-5-generating-ddl-commands\/"},"author":{"name":"Daniel Westermann","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"headline":"Can I do it with PostgreSQL? \u2013 5 \u2013 Generating DDL commands","datePublished":"2016-11-30T16:17:27+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-5-generating-ddl-commands\/"},"wordCount":292,"commentCount":0,"keywords":["PostgreSQL"],"articleSection":["Database Administration &amp; Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-5-generating-ddl-commands\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-5-generating-ddl-commands\/","url":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-5-generating-ddl-commands\/","name":"Can I do it with PostgreSQL? \u2013 5 \u2013 Generating DDL commands - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2016-11-30T16:17:27+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-5-generating-ddl-commands\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-5-generating-ddl-commands\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-5-generating-ddl-commands\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Can I do it with PostgreSQL? \u2013 5 \u2013 Generating DDL commands"}]},{"@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\/9453","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=9453"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/9453\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=9453"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=9453"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=9453"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=9453"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}