Как изменить схему таблицы после создания в Redshift?

Postgre поддерживает эту операцию, как показано ниже:

ALTER TABLE name
    SET SCHEMA new_schema

В Redshift операция не будет работать. Есть ли способ сделать это?

Я попытался обновить pg_class, чтобы установить relnamespace (идентификатор схемы) для таблицы, для которой нужна учетная запись суперпользователя, а usecatupd - в таблице pg_shadow. Но я получил разрешение отклонить ошибку. Единственной учетной записью, которая может изменить системную таблицу 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         | ******** |          | 

Итак, действительно ли красное смещение не дает на это разрешения?

Ответ 1

Лучший способ сделать это - создать новую таблицу с желаемой схемой, а после этого сделать INSERT.... SELECT с данными из старой таблицы.

Затем отмените текущую таблицу и переименуйте новую с помощью ALTER TABLE.

Ответ 2

Самый быстрый способ сделать это сейчас заключается в следующем:

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.

Обратите внимание, что вам, возможно, придется удалить и воссоздать любые представления, которые зависят от my_old_schema.my_table. ОБНОВЛЕНИЕ: Если вы делаете это регулярно, вы должны создавать свои представления, используя WITH NO SCHEMA BINDING и они будут продолжать указывать на правильную таблицу без необходимости WITH NO SCHEMA BINDING создания.

Ответ 3

Вы можете создать новую таблицу с помощью

CREATE TABLE schema1.tableName(LIKE schema2.tableName ВКЛЮЧАЯ ПО ​​УМОЛЧАНИЮ);

а затем скопируйте содержимое таблицы из одной схемы в другую с помощью инструкции INSERT INTO

а затем DROP TABLE, чтобы удалить таблицу.

Ответ 4

Вот как я это делаю.

- Удалить, если у вас уже есть одна резервная копия

DROP TABLE IF EXISTS TABLE_NAME_BKP CASCADE;

- Создайте две резервные копии, одну для работы и в конце удалите, а еще одну - настоящая резервная копия

SELECT * INTO TABLE_NAME_BKP FROM TABLE_NAME;
SELECT * INTO TABLE_NAME_4_WORK FROM TABLE_NAME;

--We может также выполнить приведенный ниже ALTER, но он содержит имя ограничения первичного ключа, следовательно, вы не можете создать новую таблицу с такими же именами ограничений

ALTER TABLE TABLE_NAME RENAME TO TABLE_NAME_4_WORK;

- Убедитесь, что вы скопировали

SELECT COUNT(*) FROM TABLE_NAME;
SELECT COUNT(*) FROM TABLE_NAME_4_WORK; 

- создать новую схему таблицы

    DROP TABLE IF EXISTS TABLE_NAME CASCADE;

    CREATE TABLE TABLE_NAME     (
       ID           varchar(36)     NOT NULL,
       OLD_COLUMN   varchar(36),
       NEW COLUMN_1 varchar(36)
    )
    compound sortkey (ID, OLD_COLUMN, NEW COLUMN_1);

    ALTER TABLE TABLE_NAME
    ADD CONSTRAINT PK__TAB_NAME__ID
    PRIMARY KEY (id);

- копировать данные из старого в новое

INSERT INTO TABLE_NAME (
     id,    
     OLD_COLUMN)
 (SELECT     
     id,        
     OLD_COLUMN FROM TABLE_NAME_4_WORK) 

- Удалите рабочий стол TABLE_NAME_4_WORK.

 DROP TABLE TABLE_NAME_4_WORK;

- СРАВНИТЕ BKP И НОВЫЕ ТАБЛИЦЫ, И СОХРАНИТЕ BKP ТАБЛИЦА ДЛЯ ИНОГДА.

 SELECT COUNT(*) FROM TABLE_NAME_BKP;

 SELECT COUNT(*) FROM TABLE_NAME;