web-dev-qa-db-ja.com

Redshiftで作成した後にテーブルスキーマを変更するにはどうすればよいですか?

Postgreはこの操作を以下のようにサポートしています。

ALTER TABLE name
    SET SCHEMA new_schema

この操作はRedshiftでは機能しません。それを行う方法はありますか?

Pg_classを更新して、テーブルのrelnamespace(schema id)を設定しようとしました。これには、スーパーユーザーアカウントが必要であり、pg_shadowテーブルではusecatupdがtrueです。しかし、許可拒否エラーが発生しました。 pgシステムテーブルを変更できる唯一のアカウントはrdsdbです。

server=# select * from pg_user;
 usename   | usesysid | usecreatedb | usesuper | usecatupd |  passwd  | valuntil |            useconfig             
------------+----------+-------------+----------+-----------+----------+----------+----------------------------------
 rdsdb      |        1 | t           | t        | t         | ******** |          | 
 myuser     |      100 | t           | t        | f         | ******** |          | 

それで、本当に赤方偏移はそれに対する許可を与えませんか?

14
elprup

これを行う最良の方法は、目的のスキーマを使用して新しいテーブルを作成し、その後、古いテーブルのデータを使用してINSERT .... SELECTを実行することです。

次に、現在のテーブルを削除し、新しいテーブルの名前をALTERTABLEに変更します。

6
Iñaki Soria

これを行う最も簡単な方法は次のとおりです。

CREATE TABLE my_new_schema.my_table (LIKE my_old_schema.my_table);
ALTER TABLE my_new_schema.my_table APPEND FROM my_old_schema.my_table;
DROP TABLE my_old_schema.my_table;

この場合、my_old_schema.my_tableのデータは、単にmy_new_schema.my_tableに属するように再マップされます。 INSERT INTOを実行するよりもはるかに高速です。

mayは、my_old_schema.my_tableに依存するビューを削除して再作成する必要があることに注意してください。 更新:これを定期的に行う場合は、WITH NO SCHEMA BINDINGを使用してビューを作成する必要があります。そうすれば、ビューは再作成せずに正しいテーブルをポイントし続けます。

28
Joe Harris

次のコマンドで新しいテーブルを作成できます

CREATE TABLE schema1.tableName(LIKE schema2.tableName INCLUDING DEFAULTS);

次に、INSERT INTOステートメントを使用して、テーブルの内容を1つのスキーマから別のスキーマにコピーします。

続いてDROPTABLEを実行して、テーブルを削除します。

4
Ganesh Todkar