2016-05-19 8 views
0

Ich füge distkey/sortkey zu allen meinen Tabellen in redshift hinzu und möchte dies automatisieren. Ich mache folgendes:Wie abhängige Ansichten migriert werden, wenn die Tabelle tief kopiert wird

ALTER TABLE table RENAME TO tmp_table; 
CREATE TABLE table 
distkey(id) 
sortkey(id) 
AS 
select * from tmp_table; 
DROP TABLE tmp_table; 

Das funktioniert gut, außer die Ansichten werden nicht migriert. Wenn Sie ALTER TABLE verwenden, zeigen die vorhandenen Ansichten auf tmp_table. Im Idealfall möchte ich die Sichten auf den vorherigen Weg wiederherstellen, möglicherweise in derselben Abfragetransaktion oder als Teil eines Skripts.

+0

Beachten Sie, erhalten Ansicht Befehle erstellen, die CREATE TABLE .. AS tut behalte die NOT NULL-Einstellungen nicht bei. Alle Spalten in der neuen Tabelle werden als NULL erstellt. Auch meine Vermutung ist, dass Spaltencodierung/Kompressionseinstellung nicht beibehalten wird. – jhncz

Antwort

0

In Ihrem Migrationsverfahren:

  1. Für jede Ansicht ausführen:

    select definition from pg_views where viewname = 'my_view'; 
    
  2. Und speichern alle Ergebnisse.

  3. Execute für alle Ansichten:

    drop view 'my_view'; // or rename only to have a rollback option 
    
  4. Passen Sie Ihre Tabellen

  5. Führen Sie die in Schritt 2

+0

Ich endete mit CREATE OR REPLACE VIEW, anstatt die Ansicht zu löschen und neu zu erstellen. Gibt es eine Möglichkeit, die select-Definition von pg_views zu ersetzen, wo viewname = 'my_view'; mit etwas, das den Namen aller Ansichten finden wird, die von einer Tabelle abhängen? gerade mache ich eine Auswahl Definition von pg_views wo Definition wie '% table%'. Ich schaute auf etwas, das pg_depend Klasse beinhaltet, aber nicht herausgefunden hat. – bugzpodder

+0

Wie würden Sie Berechtigungen und Kommentare machen? pgAdmin III macht einen tollen Job. – PhilHibbs

0

Einfach die Ansichten löschen und neu erstellen. Das könnte Teil des Skripts sein.

Ansichten sind möglicherweise nicht Teil einer Transaktion, daher sind möglicherweise einige Tests erforderlich.

+0

Vielen Dank für Ihre Antwort. Können Sie erläutern, wie ich eine andere Ansicht erstellen kann, wenn ich nur den Namen der Ansicht kenne? ZB CREATE TABLE AS Beispiel oben müssen Sie nicht alle Spalten angeben, gibt es eine Möglichkeit, die Ansicht neu zu erstellen, ohne zu verwirren und zu graben, was die eigentliche Abfrage ist? – bugzpodder

+0

Sie könnten versuchen, mit 'psql' zu verbinden und dann folgendes sehen: [Wie man den CREATE VIEW-Code für eine Ansicht in PostgreSQL sieht?] (Https://stackoverflow.com/questions/14634322/how-to-see-the- create-view-code-for-a-view-in-postgresql) –