我只是想知道在运行DROP … CASCADE后是否有人知道如何自动化视图创建?
现在我首先尝试使用经典的DROP VIEW myview语句删除视图,如果我不能删除视图,因为其他对象仍然依赖于它,然后检查postgres列出的所有对象名称并保存它们的创建然后我运行drop with级联.有时它就像十几个物体.但也许您有一些想法以更自动化的方式处理这个问题?
现在我首先尝试使用经典的DROP VIEW myview语句删除视图,如果我不能删除视图,因为其他对象仍然依赖于它,然后检查postgres列出的所有对象名称并保存它们的创建然后我运行drop with级联.有时它就像十几个物体.但也许您有一些想法以更自动化的方式处理这个问题?
也许有人有一些功能?
解决方法
下一步……(继续我之前的回答).
function save_views(objectname text)根据表saved_views中的objectname(视图或表)存储视图.
function restore_views()从表saved_views恢复视图.
create or replace function save_views_oid(objectid oid) returns void language plpgsql as $$ declare r record; begin for r in select distinct c.oid,c.relname,n.nspname from pg_depend d join pg_rewrite w on w.oid = d.objid join pg_class c on c.oid = w.ev_class join pg_namespace n on n.oid = c.relnamespace where d.refclassid = 'pg_class'::regclass and d.classid = 'pg_rewrite'::regclass and d.refobjid = objectid and c.oid <> objectid loop insert into saved_views values ( 'CREATE VIEW ' || r.nspname || '.' || r.relname || ' AS ' || pg_get_viewdef(r.oid,'f')); perform save_views_oid(r.oid); end loop; end; $$; create or replace function save_views(objectname text) returns void language plpgsql as $$ begin create table if not exists saved_views(viewbody text); truncate saved_views; perform save_views_oid(objectname::regclass); end; $$; create or replace function restore_views() returns void language plpgsql as $$ declare viewtext text; begin for viewtext in select viewbody from saved_views loop execute viewtext; end loop; drop table saved_views; end; $$;
测试:
select save_views('my_view'); -- may be save_views('my_schema.my_view'); select * from saved_views;
使用:
select save_views('my_view'); drop view my_view cascade; create view my_view as ... select restore_views();