Edition-basierte Neudefinition. Teil 2

Hallo! Wie in einem früheren Beitrag über Edition-Based Redefinition versprochen, ist dies der zweite Teil.



Womit arbeiten wir also? Unser Hauptproduktionsserver ist Oracle 12C, Enterprise Edition. Und was wichtig ist, es werden mehrere Dutzend Anwendungen gleichzeitig ausgeführt. Warum konzentrieren wir uns darauf? Die Technologie ist relativ neu, sie ist nicht sehr gut eingefahren. Und es wäre unlogisch, einige kritische Systeme sofort darauf zu übertragen. Aus diesem Grund haben wir uns entschlossen, langsam von weniger kritischen zu kritischeren Systemen überzugehen. Dementsprechend mussten wir das nächste Problem verstehen: wie man mit EBR-Technologie arbeitet und wie man die Integration in der Situation organisiert, in der wir eine versionierte Version haben und die andere nicht. Wie sich herausstellte, können Sie in Version 12 von Oracle nichtversionierte Objekte, nichtversionierte Pakete und nichtversionierte Darstellungen in einem versionierten Schema erstellen, um die Integration zu organisieren.

Natürlich können wir eine nicht versionierte API erstellen und sie dem nicht versionierten Schema zur Verwendung geben. Aber was ist, wenn diese Nicht-Versions-API (oder ein Teil davon) in unserer Anwendung verwendet wird und wir sie in uns selbst versionieren und nicht-Versions-Objekte zur Seite stellen müssen? Dies ist nur das nächste Problem, mit dem wir zu kämpfen hatten. Wir verwenden die API häufig, aber wie Sie sich erinnern, gibt es eine Einschränkung, dass versionierte Objekte nicht ohne Version verwendet werden können. Vorausgesetzt, dass mehrere Anwendungen auf dem Server ausgeführt wurden, war es natürlich erforderlich zu verstehen, wie wir eine Anwendung auf die neue Edition umstellen und die API dieses Schemas mit anderen Datenbankschemata verwenden können.

Es gibt verschiedene Optionen für die Installation von Edition:

  • Legen Sie den Standardwert für die Edition auf die gesamte Datenbank fest
  • Installieren Sie die Umgebung erneut in der gesamten Datenbank.

Diese Optionen werden sofort verworfen, da zumindest einige Anwendungen nicht auf die Verwendung von EBR umstellen.

Es ist auch möglich, einen Dienst zum Ermitteln der Version oder zum Ermitteln der Version beim Verbinden der Anwendung mit der Schaltung zu erstellen. Dies ist praktisch, wenn wir über eine Drittanbieteranwendung eine Verbindung zur Datenbank herstellen.

Und wenn wir Jobs brauchen, die planmäßig ausgeführt werden und in einer bestimmten Ausgabe arbeiten? Dementsprechend gibt es eine andere Möglichkeit, zu einer neuen Version zu wechseln - dies dient dazu, die aktuelle Sitzung an einer bestimmten Version auszurichten .

Eigentlich haben wir uns das als Lösung ausgesucht. Sie können nach der Anmeldung einen Trigger an das versionierte Schema anhängen, der besagt, dass die aktuelle Sitzung in diesem Schema in dieser Edition funktioniert.



Zurück zur Integration und Vervielfältigung der Logik. Es gibt Aufgaben: Ich möchte eine Art Anwendungslogik in meinem Schema versionieren und sie auch einem Benutzer ohne Version zur Verfügung stellen. Zuerst schien es, dass dies nicht implementiert werden konnte, aber nachdem wir uns mit der Frage befasst hatten, sahen wir, dass das übliche dbms_sql-Paket, das im Prinzip auf die Durchführung dynamischer Abfragen abzielt, zur Lösung dieses Problems beitragen kann. Wie? Sehr einfach: Wenn Sie eine Anforderung verarbeiten oder einen anonymen Block aufrufen, können Sie den Bedingungsnamen als Parameter ausgeben und so die Version angeben, in der dieser Code analysiert und ausgeführt wird. Wenn wir eine Prozedur in uns selbst verwenden und dieselbe Prozedur einem Schema eines Drittanbieters zuweisen müssen, schließen wir sie einfach mit einem Aufruf in die Prozedur dbms_sql.parse ein und erstellen so einen Wrapper, der in ein Objekt ohne Version eingefügt werden kann, und - bitte, wir können unser versioniertes Objekt verwenden nicht versionierter Benutzer.

Was sehen Sie hier? Aus irgendeinem Grund werden bei der Angabe der Bedingung keine Out-Parameter in den Prozeduren ausgegeben. Warum - es ist nicht klar, aber in den Schemata, in denen wir gearbeitet haben, wird dies nicht oft verwendet. Vielleicht werden wir die Logik irgendwie wiederholen oder nach weiteren Lösungen suchen.



Die folgenden Probleme sind Fehler oder Funktionen des EBR, auf die wir gestoßen sind. Das erste ist ein Problem mit konstruierten Typen und Pipeline-Funktionen. Was hat Pipeline damit zu tun? Neben der Tatsache, dass wir wirklich bestimmte Algorithmen haben, die auf der Basis von Pipeline-Funktionen arbeiten, ist Pipeline eine bestimmte Lösung, um die versionierte Ansicht zur Seite zu stellen. Wir haben die Ansichten geerbt, die eine ziemlich komplizierte Logik für die Datenvorverarbeitung enthalten, und Schemata von Drittanbietern verwenden diese Ansichten ebenfalls. Dementsprechend war es notwendig zu verstehen, wie unsere Versionsansichten auf eine Nicht-Versionsdaten-Verbraucherschaltung gesetzt werden, vorausgesetzt, der Ausgabensatz von Spalten ändert sich nicht. Als eine Lösung dieser Art war klar, dass Sie alle diese Ansichten mit dbms_sql in die Pipeline-Funktion einschließen und sie für den Verbraucher in die endgültige Ansicht einfügen können. Ja, dies ist ressourcenintensiv für den Server, erfordert jedoch keine Änderungen seitens des empfangenden Systems.

Zurück zur Verwendung von Pipeline-Funktionen stellte sich heraus, dass das Paket einfach nicht kompiliert wird und auseinanderfällt, wenn der zu erstellende Typ nicht in dem erstellten Versionspaket erstellt wird und zum ersten Mal erstellt wird. Sofort kam keine Lösung, ging nach suchen, was von anderen Programmierern vorgeschlagen wurde? Jemand sagte, dass es erforderlich ist, diesen Typ in der Nullversion des Pakets oder ein Paket mit dem entsprechenden Typ in der Nullversion der Datenbank zu erstellen. Es war nicht klar, warum das so war. Sie fanden eine Lösung, dass diese Typen, die implizit beim Kompilieren des Pakets erstellt wurden, einfach als Datenbankobjekt in einen separaten Typ eingefügt werden können. Dadurch wird das Problem mit den Förderfunktionen gelöst.
Das nächste Feature, auf das wir gestoßen sind, ist das nicht standardmäßige Verhalten versionierter Ansichten.

Denken Sie daran, ich habe darüber gesprochen, dass Objekte geerbt und aktualisiert werden. Es stellte sich also heraus, dass wir, wenn Sie und ich eine versionierte Ansicht für eine Ausgabe mit bedingtem Nullwert erstellten, bei der fünften Ausgabe feststellten, dass die Kommentare Ungenauigkeiten aufwiesen. Ich stelle zum Beispiel fest, dass ich in einem Kommentar zu einer Spalte zwei Buchstaben an bestimmten Stellen austauschen kann. Hinterlasse keine solche Unvollkommenheit!

Der übliche Kommentarbefehl führt also dazu, dass unsere versionierte Ansicht in der aktuellen Version aktualisiert wird. Aus diesem Grund fallen alle abhängigen Pakete auseinander und wie geht man damit um? Zu diesem Zweck haben sie ein bestimmtes Skript geschrieben, das beim Erstellen einer neuen Edition die Versionsansicht jedes Mal aktualisiert, wenn die nächste Version veröffentlicht wird. Dies stellt keine große Belastung für das Datenbankwörterbuch dar. Nehmen Sie jedoch bei Bedarf geringfügige Korrekturen vor oder stellen Sie beispielsweise neue Zuschüsse aus. Wir müssen keine neue Edition erstellen

Nun, der letzte Fehler oder diese Funktion ... Es ist nicht klar, warum beim Ändern von nicht null die Einschränkungen für die Spalte der versionierten Ansichten auseinanderfielen. Das heißt, sobald wir sagen, dass unsere Spalte der Basistabelle jetzt keine Null-Einschränkungen haben sollte, fällt die Ansicht selbst bei Verwendung der DBMS-Redifinition auseinander. Wir konnten dieses Ding in keiner Weise besiegen, vielleicht sind die Leser darauf gestoßen, es wird interessant sein herauszufinden, ob eine Lösung gefunden wurde.



Was möchte ich abschließend sagen? Die Edition-basierte Neudefinition ist eine effektive Technologie für eine echte Möglichkeit, eine Version oder einen Hotfix im Benutzermodus online zu stellen. Wir haben berührt, gefühlt und erkannt, dass das Organisieren der Integration auf einem Server, wenn nicht alle Schemata diese Technologie verwenden, real ist, ganz zu schweigen davon, dass das versionierte Schema auf einem dedizierten Server oder in einer separaten Containerdatenbank funktionieren kann.

Und als Anwendung und als Antwort auf die Schlüsselfrage: "Ist es in der Produktion möglich?" ... Wir hoffen, dass die Edition-basierte Neudefinition früher oder später in alle unsere Projekte übergeht, und vielleicht ist dies die letzte Station unserer Anwendungen und garantiert eine Ruhe Schlaf des Entwicklers, der für die Installation der neuen Version verantwortlich ist.

Eigentlich ist das alles. Vielen Dank für Ihre Aufmerksamkeit.

Source: https://habr.com/ru/post/de470423/


All Articles