pgroll/pkg
Andrew Farries f2bb2f9581
Make set_unique operations respect the contract for old schema versions (#118)
When `pg-roll` makes a schema change, the contract with the user is that
it will leave the old version of schema unchanged.

When the operation to add a `UNIQUE` constraint was implemented
(https://github.com/xataio/pg-roll/pull/53), this contract was not
respected. The operation adds a unique index to the existing column,
changing the behaviour for users of the old schema.

This PR changes the operation so that it follows a similar pattern to
other operations that were implemented later:
* On `Start`:
  * Duplicate the column.
  * Add a `UNIQUE` index concurrently
* Create `up` and `down` triggers to copy values between the old and new
columns.
  * Backfill values from the old column into the new using `up` SQL
* On `Complete`
  * Create a unique constraint on the new column using the unique index.
  * Drop the old column
  * Rename the column to its old name.
  * Remove `up` and `down` triggers.

Writing correct `up` SQL for the operation is a little more difficult
than for other operations (eg set `NOT NULL`) as it is up to the user to
ensure uniqueness of values. The example migration in this PR appends a
random suffix to each value.
2023-09-22 08:52:15 +00:00
..
migrations Make set_unique operations respect the contract for old schema versions (#118) 2023-09-22 08:52:15 +00:00
roll Rollback operation on Start failure (#73) 2023-09-06 05:42:40 +01:00
schema Remove unused Schema.Replace method (#78) 2023-09-01 13:38:53 +01:00
state Allow to migrate existing databases (#112) 2023-09-21 22:41:38 +02:00