2 Stimmen

PostgreSQL: Aktualisieren eines Schemas, wenn Ansichten aus einem anderen Schema davon abhängen

Hier ist mein Aufbau. Ich habe zwei Schemata: my_app y static_data . Letztere wird aus einem statischen Dump importiert. Für die Bedürfnisse meiner Anwendungslogik habe ich Ansichten erstellt, die die Tabellen von static_data und ich habe sie in der my_app Schema.

Es funktioniert alles wunderbar. Aber ich muss die static_data Schema mit einem neuen Dump, und meine Ansichten verwenden die neuen Daten. Das Problem ist, was auch immer ich tue, meine Ansichten werden immer auf das alte Schema verweisen!

Ich habe versucht, den neuen Speicherauszug in ein neues Schema zu importieren, static_data_new und versucht dann zu löschen static_data und umbenennen static_data_new a static_data . Es funktioniert nicht, weil meine Ansichten von Tabellen in static_data daher lässt PostgreSQL mich diese nicht löschen.

Dann habe ich versucht, die search_path a static_data_new . Aber wenn ich das tue, verweisen die Ansichten immer noch auf die alten Tabellen!

Ist es möglich, Ansichten zu haben, die auf Tabellen verweisen, die die search_path ? Danke!

3voto

Erwin Brandstetter Punkte 530399

Ansichten sind an die zugrunde liegende Objekte . Die Umbenennung des Objekts hat keinen Einfluss auf diese Verknüpfung.
Ich sehe grundsätzlich 3 verschiedene Wege um Ihr Problem zu lösen:

  1. DELETE Ihre Ansichten und re- CREATE nachdem Sie Ihren neuen Tisch bzw. Ihre neuen Tische aufgestellt haben. Einfach und schnell, sobald Sie Ihr komplettes Erstellungsskript zusammen haben. Vergessen Sie nicht, auch die Berechtigungen zurückzusetzen. Das Skript für die Neuerstellung kann allerdings mühsam zu kompilieren sein.

  2. Utilice Tabellen-Funktionen (Funktionen RETURNING SETOF rows o RETURNING TABLE ) statt einer Ansicht. Dadurch erhalten Sie eine "späte Bindung": die Objektnamen werden zur Ausführungszeit in den Systemkatalogen nachgeschlagen, nicht zur Erstellungszeit. Es liegt in Ihrer Verantwortung, dass diese Objekte tatsächlich gefunden werden können.

    En search_path kann sein voreingestellt pro Funktion oder die search_path der ausführenden Rolle wird für Objekte wirksam, die nicht explizit schema-qualifiziert sind. Detaillierte Anweisungen und Links in diese verwandte Antwort auf SO .

    Funktionen sind im Grunde wie vorbereitete Anweisungen und verhalten sich etwas anders als Ansichten. Einzelheiten in diese verwandte Antwort auf dba.SE .

  3. Nehmen Sie die TRUNCATE y INSERT Route für die neuen Daten anstelle von DELETE y CREATE . Dann bleiben alle Verweise erhalten. Eine ausführlichere Antwort dazu finden Sie aquí .

    Wenn Fremdschlüssel auf Ihre Tabelle verweisen, müssen Sie DELETE FROM TABLE Es liegt in Ihrer Verantwortung, dass die referentielle Integrität wiederhergestellt werden kann, oder die Wiederherstellung des Fremdschlüssels wird fehlschlagen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X