{"id":30288,"date":"2024-01-19T08:00:00","date_gmt":"2024-01-19T07:00:00","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/?p=30288"},"modified":"2024-01-25T13:18:50","modified_gmt":"2024-01-25T12:18:50","slug":"postgresql-17-copy-and-save_error_to","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/postgresql-17-copy-and-save_error_to\/","title":{"rendered":"PostgreSQL 17: copy and SAVE_ERROR_TO"},"content":{"rendered":"\n<p>Another great feature just got committed for PostgreSQL 17 and hopefully will not be reverted until the final release later this year. You probably already know <a href=\"https:\/\/www.postgresql.org\/docs\/current\/sql-copy.html\">copy<\/a>. Whenever you want to load something into or unload something out of PostgreSQL, this is the tool to use. When loading into PostgreSQL there is something to consider up to PostgreSQL 16 which might be very annoying: Whenever there is a line copy cannot write into the target table the whole process will be aborted and nothing will be loaded at all. Maybe this is something you want to have, but for other use cases the preferred behavior would be either to just ignore those lines and\/or write the error messages somewhere else. In both cases you would not loose the rest of the data and don&#8217;t need to start from scratch after fixing the data to be loaded.<\/p>\n\n\n\n<p>As usual lets start with a little test case: Suppose we have this text file:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; highlight: [1]; title: ; notranslate\" title=\"\">\npostgres=# \\! cat data.txt\n1 aaaa 1 aaaa\n2 bbbb 2 bbbb\n3 cccc 3 cccc\n4 dddd 4 dddd\n5 eeee 5 eeee\n6 ffff 6 ffff\n7 gggg 7 gggg\n8 hhhh 8 hhhh\n<\/pre><\/div>\n\n\n<p>A table which can hold this data might look like this:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; highlight: [1,3]; title: ; notranslate\" title=\"\">\npostgres=# create table import ( a int, b varchar(4), c int, d varchar(4));\nCREATE TABLE\npostgres=# \\d import\n                     Table &quot;public.import&quot;\n Column |         Type         | Collation | Nullable | Default \n--------+----------------------+-----------+----------+---------\n a      | integer              |           |          | \n b      | character varying(4) |           |          | \n c      | integer              |           |          | \n d      | character varying(4) |           |          | \n<\/pre><\/div>\n\n\n<p>All you need to do, to get that data from the text file into the table is this:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; highlight: [1,3]; title: ; notranslate\" title=\"\">\npostgres=# copy import from &#039;\/home\/postgres\/data.txt&#039; with (delimiter &#039; &#039;);\nCOPY 8\npostgres=# select * from import;\n a |  b   | c |  d   \n---+------+---+------\n 1 | aaaa | 1 | aaaa\n 2 | bbbb | 2 | bbbb\n 3 | cccc | 3 | cccc\n 4 | dddd | 4 | dddd\n 5 | eeee | 5 | eeee\n 6 | ffff | 6 | ffff\n 7 | gggg | 7 | gggg\n 8 | hhhh | 8 | hhhh\n(8 rows)\n<\/pre><\/div>\n\n\n<p>Pretty simple. The trouble might start if the file to be loaded does look like this:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; highlight: [1,3]; title: ; notranslate\" title=\"\">\npostgres=# truncate import;\nTRUNCATE TABLE\npostgres=# \\! cat data.txt2\n1 aaaa 1 aaaa\n2 bbbb 2 bbbb\n3 cccc 3 cccc\n4 dddd 4 dddd\n5 eeee 5 eeee\n6 ffff 6 ffff\n7 gggg 7 gggg\n8 hhhh 8 hhhh\n9 jjjjjjjjj 9 jjjj\n10 kkkk 10 kkkk\n11 llll 11 lllllll\n12 mmmm 12 mmmm\n13 nnnn 13 nnnn\n<\/pre><\/div>\n\n\n<p>Lines 9 and 12 will definitely not fit into the table and when you try to load this the whole process will fail and nothing will be loaded at all:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; highlight: [1,4]; title: ; notranslate\" title=\"\">\npostgres=# copy import from &#039;\/home\/postgres\/data.txt2&#039; with (delimiter &#039; &#039;);\nERROR:  value too long for type character varying(4)\nCONTEXT:  COPY import, line 9, column b: &quot;jjjjjjjjj&quot;\npostgres=# select * from import;\n a | b | c | d \n---+---+---+---\n(0 rows)\n<\/pre><\/div>\n\n\n<p>Starting with PostgreSQL 17 you will have another option:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; highlight: [1,27]; title: ; notranslate\" title=\"\">\npostgres=# \\h copy\nCommand:     COPY\nDescription: copy data between a file and a table\nSyntax:\nCOPY table_name &#x5B; ( column_name &#x5B;, ...] ) ]\n    FROM { &#039;filename&#039; | PROGRAM &#039;command&#039; | STDIN }\n    &#x5B; &#x5B; WITH ] ( option &#x5B;, ...] ) ]\n    &#x5B; WHERE condition ]\n\nCOPY { table_name &#x5B; ( column_name &#x5B;, ...] ) ] | ( query ) }\n    TO { &#039;filename&#039; | PROGRAM &#039;command&#039; | STDOUT }\n    &#x5B; &#x5B; WITH ] ( option &#x5B;, ...] ) ]\n\nwhere option can be one of:\n\n    FORMAT format_name\n    FREEZE &#x5B; boolean ]\n    DELIMITER &#039;delimiter_character&#039;\n    NULL &#039;null_string&#039;\n    DEFAULT &#039;default_string&#039;\n    HEADER &#x5B; boolean | MATCH ]\n    QUOTE &#039;quote_character&#039;\n    ESCAPE &#039;escape_character&#039;\n    FORCE_QUOTE { ( column_name &#x5B;, ...] ) | * }\n    FORCE_NOT_NULL { ( column_name &#x5B;, ...] ) | * }\n    FORCE_NULL { ( column_name &#x5B;, ...] ) | * }\n    SAVE_ERROR_TO &#039;location&#039;\n    ENCODING &#039;encoding_name&#039;\n\nURL: https:\/\/www.postgresql.org\/docs\/devel\/sql-copy.html\n<\/pre><\/div>\n\n\n<p>Using the option &#8220;SAVE_ERROR_TO&#8221; you can ask PostgreSQL to just ignore any data which does not fit into the target table:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; highlight: [1,3]; title: ; notranslate\" title=\"\">\npostgres=# copy import from &#039;\/home\/postgres\/data.txt2&#039; with (delimiter &#039; &#039;, save_error_to &#039;none&#039;);\nCOPY 11\npostgres=# select * from import;\n a  |  b   | c  |  d   \n----+------+----+------\n  1 | aaaa |  1 | aaaa\n  2 | bbbb |  2 | bbbb\n  3 | cccc |  3 | cccc\n  4 | dddd |  4 | dddd\n  5 | eeee |  5 | eeee\n  6 | ffff |  6 | ffff\n  7 | gggg |  7 | gggg\n  8 | hhhh |  8 | hhhh\n 10 | kkkk | 10 | kkkk\n 12 | mmmm | 12 | mmmm\n 13 | nnnn | 13 | nnnn\n(11 rows)\n<\/pre><\/div>\n\n\n<p>Everything is there, except lines 9 and 11. Great. For now you can only ignore the errors or stop on the first error (which is the default, as before). There might be more to come in the future. The commit is <a href=\"https:\/\/git.postgresql.org\/gitweb\/?p=postgresql.git;a=commitdiff;h=9e2d8701194fa1d280b73c024759950c74c1c637\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a>.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Update 25-JAN-2024<\/strong>: Please note that the option for copy has been renamed to &#8220;ON_ERROR&#8221; and the parameters now are &#8220;stop&#8221; and &#8220;ignore&#8221;, see <a href=\"https:\/\/www.postgresql.org\/docs\/devel\/sql-copy.html\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Another great feature just got committed for PostgreSQL 17 and hopefully will not be reverted until the final release later this year. You probably already know copy. Whenever you want to load something into or unload something out of PostgreSQL, this is the tool to use. When loading into PostgreSQL there is something to consider [&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,198],"tags":[77],"type_dbi":[],"class_list":["post-30288","post","type-post","status-publish","format-standard","hentry","category-database-administration-monitoring","category-database-management","tag-postgresql"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>PostgreSQL 17: copy and SAVE_ERROR_TO - 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-17-copy-and-save_error_to\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PostgreSQL 17: copy and SAVE_ERROR_TO\" \/>\n<meta property=\"og:description\" content=\"Another great feature just got committed for PostgreSQL 17 and hopefully will not be reverted until the final release later this year. You probably already know copy. Whenever you want to load something into or unload something out of PostgreSQL, this is the tool to use. When loading into PostgreSQL there is something to consider [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/postgresql-17-copy-and-save_error_to\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2024-01-19T07:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-01-25T12:18:50+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-17-copy-and-save_error_to\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-17-copy-and-save_error_to\\\/\"},\"author\":{\"name\":\"Daniel Westermann\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"headline\":\"PostgreSQL 17: copy and SAVE_ERROR_TO\",\"datePublished\":\"2024-01-19T07:00:00+00:00\",\"dateModified\":\"2024-01-25T12:18:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-17-copy-and-save_error_to\\\/\"},\"wordCount\":336,\"commentCount\":0,\"keywords\":[\"PostgreSQL\"],\"articleSection\":[\"Database Administration &amp; Monitoring\",\"Database management\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-17-copy-and-save_error_to\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-17-copy-and-save_error_to\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-17-copy-and-save_error_to\\\/\",\"name\":\"PostgreSQL 17: copy and SAVE_ERROR_TO - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\"},\"datePublished\":\"2024-01-19T07:00:00+00:00\",\"dateModified\":\"2024-01-25T12:18:50+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-17-copy-and-save_error_to\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-17-copy-and-save_error_to\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-17-copy-and-save_error_to\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PostgreSQL 17: copy and SAVE_ERROR_TO\"}]},{\"@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 17: copy and SAVE_ERROR_TO - 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-17-copy-and-save_error_to\/","og_locale":"en_US","og_type":"article","og_title":"PostgreSQL 17: copy and SAVE_ERROR_TO","og_description":"Another great feature just got committed for PostgreSQL 17 and hopefully will not be reverted until the final release later this year. You probably already know copy. Whenever you want to load something into or unload something out of PostgreSQL, this is the tool to use. When loading into PostgreSQL there is something to consider [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/postgresql-17-copy-and-save_error_to\/","og_site_name":"dbi Blog","article_published_time":"2024-01-19T07:00:00+00:00","article_modified_time":"2024-01-25T12:18:50+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-17-copy-and-save_error_to\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-17-copy-and-save_error_to\/"},"author":{"name":"Daniel Westermann","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"headline":"PostgreSQL 17: copy and SAVE_ERROR_TO","datePublished":"2024-01-19T07:00:00+00:00","dateModified":"2024-01-25T12:18:50+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-17-copy-and-save_error_to\/"},"wordCount":336,"commentCount":0,"keywords":["PostgreSQL"],"articleSection":["Database Administration &amp; Monitoring","Database management"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/postgresql-17-copy-and-save_error_to\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-17-copy-and-save_error_to\/","url":"https:\/\/www.dbi-services.com\/blog\/postgresql-17-copy-and-save_error_to\/","name":"PostgreSQL 17: copy and SAVE_ERROR_TO - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2024-01-19T07:00:00+00:00","dateModified":"2024-01-25T12:18:50+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-17-copy-and-save_error_to\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/postgresql-17-copy-and-save_error_to\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-17-copy-and-save_error_to\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"PostgreSQL 17: copy and SAVE_ERROR_TO"}]},{"@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\/30288","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=30288"}],"version-history":[{"count":6,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/30288\/revisions"}],"predecessor-version":[{"id":30449,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/30288\/revisions\/30449"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=30288"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=30288"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=30288"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=30288"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}