我注意到如果你在Redshift中重命名一个表,新名称会自动转到基于该表的所有视图。
有没有办法防止此行为,以便视图定义包含旧表名?
答案 0 :(得分:3)
看起来此功能已引入Redshift。请参阅Redshift docs中的WITH NO SCHEMA BINDING
。
CREATE VIEW i_am_view_are_you AS
SELECT good_column
FROM public.i_am_table
WITH NO SCHEMA BINDING
答案 1 :(得分:1)
米哈伊,
这是一个很好的问题。
当您手动执行表维护并且想要移动/创建/重命名表而不影响现有的依赖对象时,您正在搜索的功能非常有用。
您问题的简短回答是"否"。在Redshift中无法阻止此行为。
在你的" ALTER TABLE"上你无能为力。声明或"创建视图"在基础表发生更改时阻止依赖视图更改的语句。
BUT
您可以在更改名称之前轻松获取视图的DDL,并且可以在准备好后重新运行DDL,这样您的视图就会指向正确的位置。
以下SQL将显示特定表的所有相关视图,并生成以重新创建每个相应的视图。
SELECT DISTINCT
srcobj.oid AS src_oid
,srcnsp.nspname AS src_schemaname
,srcobj.relname AS src_objectname
,tgtobj.oid AS dependent_viewoid
,tgtnsp.nspname AS dependent_schemaname
,tgtobj.relname AS dependent_objectname
,'--DROP VIEW ' + tgtnsp.nspname + '.' + tgtobj.relname + ';\nCREATE OR REPLACE VIEW ' + tgtnsp.nspname+ '.' + tgtobj.relname + ' AS\n' + COALESCE(pg_get_viewdef(tgtobj.oid, TRUE), '') AS ddl
FROM
pg_catalog.pg_class AS srcobj
INNER JOIN
pg_catalog.pg_depend AS srcdep
ON srcobj.oid = srcdep.refobjid
INNER JOIN
pg_catalog.pg_depend AS tgtdep
ON srcdep.objid = tgtdep.objid
JOIN
pg_catalog.pg_class AS tgtobj
ON tgtdep.refobjid = tgtobj.oid
AND srcobj.oid <> tgtobj.oid
LEFT OUTER JOIN
pg_catalog.pg_namespace AS srcnsp
ON srcobj.relnamespace = srcnsp.oid
LEFT OUTER JOIN
pg_catalog.pg_namespace tgtnsp
ON tgtobj.relnamespace = tgtnsp.oid
WHERE tgtdep.deptype = 'i' --dependency_internal
AND tgtobj.relkind = 'v'
AND srcobj.relname = '<your-table-name>'
AND srcnsp.nspname = ' <your-schema-name>' ;
替换并使用相应的值。