Cloudspend part 1: The move to the cloud

Migration Without the Moving Drama
Migrating a data platform can sometimes feel like moving from a well-furnished house into a brand-new build. Everything must come along, nothing can break, and the new place has to fit your lifestyle perfectly. More and more organizations are considering this step—the switch from familiar proprietary database solutions to open-source alternatives like PostgreSQL. In this blog, Edco Wallet explains how to carry out a stress-free migration from SQL Server to PostgreSQL. He highlights the three biggest pitfalls and outlines the three key focus areas. That way, you won’t be left in a chaotic heap of boxes full of unwelcome surprises.
At first glance, a datatype in SQL Server and PostgreSQL can appear identical, think VARCHAR(MAX)
versus TEXT
, or how DATETIME
is handled compared to TIMESTAMP WITH TIME ZONE
. If these differences aren’t mapped out carefully, nasty surprises await.
You’ll encounter truncation errors when strings are too long, mismatched date interpretations that throw off your reports, or unexpected rounding differences in numeric calculations. It’s like labeling all your moving boxes “books,” only to discover a mix of comics, textbooks, and magazines inside. Not everything will fit on the same bookshelf in the new house.
Tip: Plan a thorough datatype-mapping strategy in advance. Test it on representative samples of your data so you can uncover issues before the full migration begins.
SQL Server loves T-SQL, with constructs like TRY…CATCH
, MERGE
, and FORMAT()
. PostgreSQL, however, uses PL/pgSQL, which has its own syntax and feature set.
In practice, this often means rewriting code. Fortunately, you’re not limited to PL/pgSQL alone, PostgreSQL supports stored procedures in other languages such as PL/Java, PL/Perl, or PL/Python. But T-SQL must be refactored.
Migrating without a thorough code rewrite is like plugging an American kitchen appliance into a European outlet without an adapter: it simply won’t fit, and you risk a short circuit. You’ll hit unsupported functions, differences in cursor management and transaction control, and challenges handling return values and OUT parameters.
Tip: Inventory all your stored procedures early. Prioritize them by complexity and usage so you can tackle the most critical code first.
SQL Server is case-insensitive by default; PostgreSQL is not. Tables, columns, or indexes that work fine when you aren’t exact about capitalization will suddenly break or behave unexpectedly in PostgreSQL.
It’s like the difference between a laid-back landlord who doesn’t mind “Edco,” “edco,” or “EDCO,” and a strict doorman who only grants access if your name matches the list exactly. What sailed smoothly in one environment will get you locked out in another.
The result? Queries that run perfectly in development fail in production. You’ll see index- and key-conflicts during pg_dump
/pg_restore
, and confusion in joins or dynamic SQL.
Tip: Test your application not just in a local dev setup but also against production-like data. That way, you’ll catch capitalization issues before they disrupt your live environment.
Before moving everything, run a small-scale pilot. Just as you’d check the shower and the Wi-Fi in your new home, select a representative subset of tables, data, and business logic. Test data conversions at scale, performance of key queries, and the completeness of stored procedures.
Use tools like pgloader for straightforward migrations, or AWS Database Migration Service (DMS) if you’re in the cloud. These help you quickly spot conversion errors and performance bottlenecks. A robust pilot can save weeks of debugging and hotfixes down the road.
A moving day without a plan ends in chaos. Migration isn’t a one-and-done affair but an iterative process. Build pipelines that automatically compare schemas (e.g., with sqitch or Flyway), dump and load data, validate test results, and run performance benchmarks.
This minimizes manual steps and human error—no more last-minute trips to the hardware store for forgotten screws. Plus, every migration iteration becomes reproducible, which is crucial for audits and compliance. Automation frees your team to focus on strategic work rather than repetitive tasks.
Once you’ve moved in, the real work begins: arranging the furniture so you can sit comfortably, hanging the curtains, and adjusting that squeaky door. Early performance tuning prevents frustration and lets you enjoy your new setup right away.
Optimizing PostgreSQL means thinking about index strategies—GiST, GIN, or BRIN for full-text and geospatial data—using EXPLAIN ANALYZE and auto_explain to find hotspots, and rebuilding statistics with VACUUM ANALYZE and CLUSTER.
Configuration tuning also matters: shared_buffers, work_mem, effective_cache_size, and max_parallel_workers_per_gather. Establish a performance baseline in both SQL Server and PostgreSQL so you can pinpoint exactly where bottlenecks lie.
Data Volume and Growth: How many gigabytes or terabytes must you move, and how quickly do they grow? These figures shape your migration strategy and downtime requirements.
Downtime Tolerance: Can you afford a brief outage, or do you need zero-downtime? For the latter, consider logical replication or a hybrid setup.
Team Expertise and Training: Do your developers know PL/pgSQL, or is there a learning curve? Plan workshops or pair-programming sessions to smooth the transition.
Ecosystem and Tooling: Are you using SQL Server–specific monitoring or backup tools? Replace them with PostgreSQL-friendly alternatives like pgBackRest, Prometheus with Grafana, or pgAdmin.
pgloader: Open-source ETL tool for bulk migrations
AWS DMS: Cloud-native service supporting continuous replication
Ora2Pg: Handy for complex schema conversions (not just Oracle)
SQL Server Migration Assistant (SSMA): Microsoft’s first-pass mapping tool
Flyway & Sqitch: For database versioning and automated deployments
pgAdmin & DBeaver: GUI tools to explore and manage your new database
Babelfish for PostgreSQL: it offers full T-SQL syntax and semantics while preserving TDS connectivity, yet it runs on PostgreSQL: https://aws.amazon.com/rds/aurora/babelfish/ It’s also available as a completely open-source project: https://github.com/babelfish-for-postgresql
Migrating from SQL Server to PostgreSQL truly is like moving to a house with a different electrical system, kitchen layout, and light switches. You want your espresso machine to still work and your fridge to stay cold.
By being aware of the three major pitfalls—datatype mismatches, T-SQL logic, and collation issues—and focusing on proof-of-concept, automation, and performance tuning, you’ll build a solid foundation.
With the right tools and a thoughtful plan, what began as a stressful expedition turns into a smooth upgrade to a future-proof data platform. You’ll gain not only greater control over your infrastructure but also the flexibility to scale without vendor lock-in.
Considering the move from SQL Server to PostgreSQL? Struggling with complex migration challenges where you could use some expertise? Get in touch for a no-strings-attached conversation. We’re happy to share our experience and help you craft a migration plan tailored to your needs.