Ga naar inhoud

Environment Diff

De functie Environment Diff stelt je in staat om de databaseschema’s van twee omgevingen naast elkaar te vergelijken. Dit is handig om te begrijpen welke schemawijzigingen zijn doorgevoerd in een branch voordat je deze merge terug naar de parent, of om structurele verschillen tussen twee omgevingen te auditen.

Vergelijking van omgevingsschema-diff


De vergelijkingsengine identificeert structurele verschillen tussen omgevingen in drie fasen:

  1. Schema-analyse: Het systeem introspeert zowel de bron- als doelomgeving om hun volledige structuur te begrijpen — inclusief tabellen, kolommen, indexen, constraints en relaties.
  2. Vergelijking: De twee structuren worden vergeleken volgens forward-only semantiek (hieronder uitgelegd). De engine identificeert precies welke wijzigingen van de bronomgeving ontbreken in het doel.
  3. Migratiegeneratie: Voor elke gedetecteerde wijziging genereert het systeem automatisch de bijbehorende SQL-opdrachten die nodig zijn om die wijziging veilig toe te passen op de doelomgeving.

De diff-engine gebruikt forward-only semantiek. Dit betekent:

  • Objecten die in bron bestaan maar NIET in doel → getoond als CREATED (ze moeten in doel worden aangemaakt)
  • Objecten die in BEIDE bestaan → veld voor veld vergeleken, verschillen getoond als wijzigingen
  • Objecten die ALLEEN in doel bestaanNIET getoond als DROPPED

Dit is een belangrijk ontwerpbesluit. Als een tabel alleen in de doelomgeving bestaat, was deze nooit aanwezig in de bron. Deze tonen als TABLE_DROPPED zou misleidend zijn omdat er nooit een drop-bewerking in de bron is uitgevoerd. De diff richt zich uitsluitend op wijzigingen die in de bron zijn ontstaan en naar het doel moeten worden doorgevoerd.

Uitzondering: Voor wijzigingen op kolomniveau binnen tabellen die in beide omgevingen bestaan, wordt COLUMN_DROPPED WEL gedetecteerd omdat het een daadwerkelijke kolomverwijderingsbewerking vertegenwoordigt die in de bron is uitgevoerd.


De diff-engine detecteert de volgende categorieën schemawijzigingen:

WijzigingstypeBeschrijvingBreaking
TABLE_CREATEDEen tabel bestaat in bron maar niet in doelNee
COLUMN_ADDEDEen nieuwe kolom is toegevoegd aan een tabel in bronNee
COLUMN_DROPPEDEen kolom bestaat in doel maar is verwijderd in bronJa
COLUMN_TYPE_CHANGEDHet gegevenstype van een kolom is gewijzigdAfhankelijk*
COLUMN_NULLABLE_CHANGEDDe nullable-constraint van een kolom is gewijzigdAfhankelijk
COLUMN_DEFAULT_CHANGEDDe standaardwaarde van een kolom is gewijzigdNee
INDEX_CREATEDEen nieuwe index is toegevoegdNee
INDEX_DROPPEDEen index is verwijderdNee
ENUM_CREATEDEen nieuw enum-type bestaat in bron maar niet in doelNee
ENUM_VALUE_ADDEDEen nieuwe waarde is toegevoegd aan een enumNee
ENUM_VALUE_REMOVEDEen waarde is verwijderd uit een enumJa
VIEW_CREATEDEen view bestaat in bron maar niet in doelNee
VIEW_MODIFIEDDe SQL-definitie van een view is gewijzigdNee
RELATIONSHIP_ADDEDEen nieuwe foreign key-relatie is toegevoegdNee
RELATIONSHIP_DROPPEDEen foreign key-relatie is verwijderdJa

* Type-vernauwing (bijv. textvarchar(50) of int8int4) wordt als breaking geclassificeerd omdat dit gegevensverlies kan veroorzaken. Type-verbreding (bijv. varchartext) wordt als veilig geclassificeerd.

Let op: Top-level TABLE_DROPPED, ENUM_DROPPED en VIEW_DROPPED worden niet gegenereerd door de forward-only diff. Objecten die alleen in doel bestaan worden niet als “dropped” beschouwd vanuit het bronperspectief.


De diff-weergave ondersteunt selectieve wijzigingstoepassing. Gebruikers kunnen:

  • Individuele wijzigingen selecteren of deselecteren met selectievakjes
  • Alle wijzigingen binnen een groep selecteren of deselecteren (bijv. alle wijzigingen voor een specifieke tabel) met het groepsselectievakje
  • Breaking wijzigingen (destructief) zijn standaard niet vooraf geselecteerd — de gebruiker moet expliciet kiezen

Alleen geselecteerde wijzigingen worden meegenomen bij het toepassen van de merge.


query EnvironmentDiff($input: EnvironmentDiffInput!) {
environmentDiff(input: $input) {
success
message
changes {
changeType
objectType
objectName
fieldName
oldValue
newValue
isBreaking
sql
}
summary {
totalChanges
breakingChanges
addedTables
droppedTables
modifiedTables
}
}
}

Variables:

{
"input": {
"projectId": "f7e4a264-d659-4719-91e8-c2d74654e529",
"sourceEnvironment": "master",
"targetEnvironment": "staging"
}
}

Elke vermelding in de changes-array vertegenwoordigt een enkele schemawijziging met de volgende velden:

  • changeType: Een van de hierboven genoemde wijzigingstype-identifiers.
  • objectType: Het soort databaseobject dat is aangetast (table, column, index, enum, view, relationship).
  • objectName: De naam van het aangetaste object (bijv. de tabelnaam).
  • fieldName: Voor wijzigingen op kolomniveau, de naam van de specifieke kolom.
  • oldValue / newValue: De voor- en nawarden voor wijzigingen (bijv. "varchar(255)""text").
  • isBreaking: Een boolean die aangeeft of deze wijziging gegevensverlies of API-breuk kan veroorzaken.
  • sql: De gegenereerde DDL-instructie om deze wijziging toe te passen.