create table base (name character varying(255));
create view v1 as select *, now() from base;
create view v2 as select * from v1 where name = 'joe';
alter table base alter column name type text;
给出这个错误:
cannot alter type of a column used by a view or rule
DETAIL: rule _RETURN on view v1 depends on column "name"
这有点烦人,因为现在我必须重新创建引用该视图的所有视图base.name
柱子。当我的视图引用其他视图时,这尤其令人烦恼。
我希望能够做的是这样的:
select recreate_views('v1', 'v2', 'alter table base alter column name type text');
让函数获取 v1 和 v2 的视图定义,删除它们,运行指定的代码,然后重新创建 v1 和 v2。如果我可以使用 Ruby,我可能会让该函数采用函数/块/lambda,例如
recreate_views 'v1', 'v2' do
alter table base alter column name type text
end
这样的事情可能吗?是否有实用程序可以做类似的事情?
我认为这符合您的要求,尽管我将视图列表移至 args 末尾以与 VARIADIC 语义兼容。
CREATE OR REPLACE FUNCTION recreate_views(run_me text, VARIADIC views text[])
RETURNS void
AS $$
DECLARE
view_defs text[];
i integer;
def text;
BEGIN
for i in array_lower(views,1) .. array_upper(views,1) loop
select definition into def from pg_views where viewname = views[i];
view_defs[i] := def;
EXECUTE 'DROP VIEW ' || views[i];
end loop;
EXECUTE run_me;
for i in reverse array_upper(views,1) .. array_lower(views,1) loop
def = 'CREATE OR REPLACE VIEW ' || quote_ident( views[i] ) || ' AS ' || view_defs[i];
EXECUTE def;
end loop;
END
$$
LANGUAGE plpgsql;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)