Frage

Wir haben ein Schema in Postgres bekommen, und wir wollen eine gute Methode einzuleiten Schema Patches anzuwenden.

Derzeit haben wir eine Reihe von DDL Dateien, die das Schema, Tabellen, Sequenzen, Funktionen zu erstellen, etc. Wir haben auch eine Bevölkerung Skript für Testumgebungen haben. Diese Dateien werden verwendet, um unsere Datenbankumgebungen neu erstellen, für die Entwicklung, Prüfung, etc.

Wir haben auch eine Reihe von ‚Patch‘ Dateien, die Versionen unseres Systems entsprechen. dh. Patches / 1.0.0.sql, Patches / 1.0.1.sql usw. Diese Dateien verwendet unser Staging und Produktionsdatenbanken zu aktualisieren.

Dieser Prozess funktioniert für uns so weit, aber es gab einige Diskussionen im Hause, wie am besten, das Schema patchen.

Ich bin gespannt, was andere da draußen hat, als ein Prozess, Inszenierung und Produktionsschema zu flicken und wie Versionen der Datenbank zu verwalten.

Danke!

War es hilfreich?

Lösung

Bei der Arbeit, für SQL Server, schreiben wir Schemaänderung Skripte, die erste Rolle wieder die Änderung vorgenommen werden (idempotently, so dass der Rollback-Abschnitt in Ordnung läuft, auch wenn die Schemaänderung noch nicht angewandt wird), und dann wird ein Abschnitt die Änderung zu übernehmen. In TSQL ist es einfach im Systemkatalog oder anderen Tabellen spähen nichts zu sehen, ob Tabellen / Spalten / Indizes / Zeilen bereits vorhanden sein und tun, wenn nicht.

In PostgreSQL, du bist ein bisschen mehr eingeschränkt mit, welche Befehle Sie einfach auf die server-- senden können, aber auf der anderen Seite, ist DDL Transaktions-, so dass eine Halb angewendet Schemaänderung nicht passieren sollte. Ich habe das Programm ich auf meinen eigenen kleine Projekte bei der Arbeit ist es gewöhnt, angepasst ganz gut zu verwenden, zum Beispiel (Overkill aber auch hier hat ich einen dev / Test db und eine „echte“ db?):

\echo Rolling back schema change #35

BEGIN;

DELETE FROM schema_version WHERE schema_id = 35;

DROP TABLE IF EXISTS location_coordinates;
DROP FUNCTION IF EXISTS location_coordinates_populate();

END;

\echo Applying schema change #35

BEGIN;

INSERT INTO schema_version(schema_id, description) VALUES(35, 'Add location_coordinates table');

CREATE TABLE location_coordinates(
 location_id INT PRIMARY KEY REFERENCES location(location_id),
 latitude FLOAT NOT NULL,
 longitude FLOAT NOT NULL,
 earth_coordinates earth NOT NULL,
 box_10miles cube NOT NULL
);

GRANT SELECT, INSERT, UPDATE, DELETE ON location_coordinates TO ui;

CREATE FUNCTION location_coordinates_populate() RETURNS TRIGGER LANGUAGE 'plpgsql' AS $$
BEGIN
  new.earth_coordinates := ll_to_earth(new.latitude, new.longitude);
  new.box_10miles := earth_box(new.earth_coordinates, 10 * 1609.344);
  RETURN new;
END
$$;

CREATE TRIGGER location_coordinates_populate BEFORE INSERT OR UPDATE ON location_coordinates
 FOR EACH ROW EXECUTE PROCEDURE location_coordinates_populate();

INSERT INTO location_coordinates(location_id, latitude, longitude)
 SELECT location_id, latitude, longitude FROM location WHERE latitude IS NOT NULL AND longitude IS NOT NULL;

CREATE INDEX location_coordinates_10miles ON location_coordinates USING gist (box_10miles);

END;

\echo Done

Dieses Skript kann mit „psql -f Schema-Änderungen / 35.sql“ nur auf der Datenbank ausgeführt werden. Mit nur Ausschneiden bis zum „Anwendung ...“ angezeigt wird, kann ich die Befehle bekommen, um es rückgängig zu machen. Und wie Sie sehen können, unterhält die Änderung eine Metadatentabelle „SCHEMA_VERSION“ so kann ich sehen, welche Änderungen übernommen werden. Die gesamte Veränderung wird als Transaktion, Datenmigration und alles getan. Hier habe ich die „IF exists“ Fähigkeit des DROP verwendete Befehle den Rollback-Abschnitt glücklich zu machen, auch wenn die Änderung nicht übernommene ist. Istr eine Sache haben wir bei der Arbeit für Oracle wurden Schreibschemaänderungen als PL / SQL-- Sie vielleicht einige Funktionen in plpgsql mit Änderungen an Hilfe haben könnten?

Beachten Sie, dass oben in der Änderung, wo ich die „Breite“ und „Länge“ Spalten bin Migration (die NULL-Werte zulassen waren) aus „location“ zu einer separaten „location_coordinates“ Beziehung (und das Hinzufügen in den earthdistance Sachen), ich habe nicht die alten Spalten fallen. Eine Sache, die wir vorsichtig sein müssen, ist zu Schemaänderungen rückwärtskompatibel, wenn möglich zu machen. So kann ich dieses Schema ändern anwenden vor die App zu aktualisieren, die neuen Tabellen zu verwenden. Ich würde eine zweite Änderung, die alten Spalten fallen anzuwenden, nachdem die Aktualisierung der App. Bei der Arbeit, würden diese in zwei verschiedenen Release-Zyklen durchgeführt werden, so bei der Freigabe X haben wir noch die optional von Rollen der App X-1 freizugeben zurück, ohne dass zunächst alle Schemaänderungen rückgängig zu machen; sowie in der Lage, Schemaänderungen in einem separaten Fenster, bevor die Anwendungen zu implementieren. (Technisch ich einen Trigger geschrieben haben sollte, so Aktualisierungen der alten Tabelle in die neue Tabelle synchronisiert werden, aber ich habe nicht, denn das ist zu viel, wie Arbeit:))

Wir haben auch Dinge wie eine Anwendung, die alle unsere Datenbanken zu sehen, Spinnen, was in der schema_version Tabelle ist, und verfolgt Änderungen, so dass die Leute auch sehen können, welche Änderungen ohne eine Verbindung mit gemacht wurden, und eine Vorstellung von der Geschichte von jedem bekommen Änderung (wir verfolgen "zurückgerollt in dev", "angewendet in dev" usw.). Bei der Arbeit unserer SCHEMA_VERSION Tabelle enthält auch die Urheberinformationen etc. eine magische Art und Weise die Versionsinformationen aus der Versionskontrolle der Anwendung wäre kühl- ein Problem, das wir haben, ist, dass, wenn ein SC in QA angewandt wird, zum Beispiel, dann in Perforce geändert, vielleicht nein -man erkennt. So ein Weg 35, dass die Schemaänderung Revision zu verfolgen # 4 aufgebracht wäre gut.

Eine Sache Note- Schemaänderungen für uns unabhängig von Anwendungsversionen nummeriert sind. Offensichtlich sie verwandt sind --- das ist eine andere Sache, die Spidern App Leute eingeben können --- aber wir versuchen viele kleine Änderungen zu haben, als ein Riese „hier ist alles, was für die Freigabe X“ Patch. Schemaänderungen werden auch für Dinge wie das Hinzufügen neuer Indizes verwendet, so kann überhaupt nicht app-getrieben sein. Im Allgemeinen werden Schemaänderungen „im Besitz“ von den Entwicklern, nicht DBAs- obwohl in dem „create index“ Beispiel oben wird die DBA im Grunde in einer Entwicklerrolle wirken und die Schemaänderung zu besitzen. Ja, bestehen wir auf einem hohen Niveau von SQL-Fähigkeit von developers- obwohl anderen Gruppen in der Gesellschaft ein wenig anders arbeiten und mehr Arbeit in das DB-Team geben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top