【问题标题】:How to migrate dependent views when deep copying the table深拷贝表时如何迁移依赖视图
【发布时间】:2016-09-15 16:54:49
【问题描述】:

我正在将 distkey/sortkey 添加到我在 redshift 中的所有表中,并希望自动执行此操作。我正在执行以下操作:

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

这很好用,只是视图不会被迁移。当您 ALTER TABLE 时,现有视图将指向 tmp_table。理想情况下,我想将视图恢复到以前的方式,可能在同一个查询事务中或作为脚本的一部分。

【问题讨论】:

  • 请注意 CREATE TABLE .. AS 不保留 NOT NULL 设置。新表中的所有列都将创建为 NULL。另外我的猜测是不会保留列编码/压缩设置。

标签: amazon-redshift


【解决方案1】:

在您的迁移过程中:

  1. 对每个视图执行:

    select definition from pg_views where viewname = 'my_view';
    
  2. 并存储所有结果。

  3. 对所有视图执行:

    drop view 'my_view'; // or rename only to have a rollback option
    
  4. 改变你的表格

  5. 执行第2步得到的create view命令

【讨论】:

  • 我最终使用 CREATE OR REPLACE VIEW 而不是删除视图并重新创建它。有没有办法从 pg_views where viewname = 'my_view'; 中替换选择定义?可以找到依赖于表的所有视图的名称?现在我正在从 pg_views 中进行选择定义,其中定义类似于“%table%”。我在看一些涉及 pg_depend 类但没有弄清楚的东西。
  • 您将如何处理权限和 cmets? pgAdmin III 在这方面做得很好。
【解决方案2】:

只需删除并重新创建视图。这可能是脚本的一部分。

视图可能不构成事务的一部分,因此可能需要进行一些测试。

【讨论】:

  • 感谢您的回复。如果我只知道视图名称,您能否详细说明如何重新创建另一个视图?例如上面的 CREATE TABLE AS 示例,您不需要指定所有列,有没有办法重新创建视图而不会弄乱和挖掘实际查询是什么?
  • 您可以尝试与psql 连接,然后查看:How to see the CREATE VIEW code for a view in PostgreSQL?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 2011-08-18
  • 2015-01-13
  • 2011-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多