gpt4 book ai didi

postgresql - 更改其他 View 中使用的列的类型

转载 作者:行者123 更新时间:2023-11-29 11:24:03 25 4
gpt4 key购买 nike

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 列的 View 。当我有引用其他 View 的 View 时,这尤其烦人。

我希望能够做的是:

select recreate_views('v1', 'v2', 'alter table base alter column name type text');

并让函数获取 v1 和 v2 的 View 定义,删除它们,运行指定的代码,然后重新创建 v1 和 v2。如果我可以使用 Ruby,我可能会让函数采用函数/ block /lambda,例如

recreate_views 'v1', 'v2' do
alter table base alter column name type text
end

这样的事情可能吗?是否有实用程序可以做类似的事情?

最佳答案

我认为这可以满足您的要求,尽管我将 View 列表移到了 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;

关于postgresql - 更改其他 View 中使用的列的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9711405/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com