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 | ******** | |
それで、本当に赤方偏移はそれに対する許可を与えませんか?
これを行う最良の方法は、目的のスキーマを使用して新しいテーブルを作成し、その後、古いテーブルのデータを使用してINSERT .... SELECTを実行することです。
次に、現在のテーブルを削除し、新しいテーブルの名前をALTERTABLEに変更します。
これを行う最も簡単な方法今は次のとおりです。
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
を使用してビューを作成する必要があります。そうすれば、ビューは再作成せずに正しいテーブルをポイントし続けます。
次のコマンドで新しいテーブルを作成できます
CREATE TABLE schema1.tableName(LIKE schema2.tableName INCLUDING DEFAULTS);
次に、INSERT INTOステートメントを使用して、テーブルの内容を1つのスキーマから別のスキーマにコピーします。
続いてDROPTABLEを実行して、テーブルを削除します。