2013-01-25 126 views
3

我只是想知道是否有人知道如何在运行DROP ... CASCADE后自动创建视图? 现在我试图首先用经典的DROP VIEW myview语句删除视图,如果我不能删除视图,因为其他对象仍然依赖它,然后检出所有对象名称postgres列表并保存它们创建,然后我运行拖放级联。有时候就像十几个物体一样。但也许你有一些想法以更自动的方式处理这个问题?依赖关系跟踪功能

也许任何人有一些功能?

回答

0

pg_depend包含所有必要的信息,但它不是很容易解释它们。在这里您可以使用草图递归函数来检索文本格式的pg_class对象的依赖关系。您可以根据需要调整功能(并向我们展示结果:)。

create or replace function dependency 
    (class_id regclass, obj_id regclass, obj_subid integer, dep_type "char") 
returns setof text language plpgsql as $$ 
declare 
    r record; 
begin 
    return query 
     select pg_describe_object(class_id, obj_id, obj_subid) 
      || ' ('|| dep_type|| ')'; 
    for r in 
     select classid, objid, objsubid, deptype 
     from pg_depend 
     where class_id = refclassid 
     and obj_id = refobjid 
     and (obj_subid = refobjsubid or obj_subid = 0) 
    loop 
     return query select dependency(r.classid, r.objid, r.objsubid, r.deptype); 
    end loop; 
end; $$; 

use: 

select dependency('pg_class'::regclass, 'my_view'::regclass, 0, ' '); 
select dependency('pg_class'::regclass, 'my_table'::regclass, 0, ' '); 
+0

谢谢,但它基本上是相同的通知,采用水滴的观点与意见的依赖issue.Besides名后,我得到重复... – Borys

+0

这只是第一步。我希望你能做下一个;) – klin

2

下一步...(继续我的上一个答案)。

功能save_views(对象名文本)存储视图根据在表saved_views对象名(视图或表)。

功能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();