3

実行後にビューの作成を自動化する方法を誰かが知っているのだろうかDROP ... CASCADE?今、私は最初に古典的なDROP VIEW myviewステートメントでビューを削除しようとしています.他のオブジェクトがまだビューに依存しているためにビューを削除できない場合は、postgres がリストするすべてのオブジェクト名をチェックアウトし、それらの作成を保存してから、カスケードでドロップを実行します. 場合によっては、十数個のオブジェクトのようになります。しかし、おそらく、この問題をより自動化された方法で処理するためのアイデアをお持ちですか?

多分誰かが何らかの機能を持っていますか?

4

2 に答える 2

2

次のステップ...(以前の回答の続き)。

function save_views(objectname text)、オブジェクト名(ビューまたはテーブル) に応じてビューをテーブル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();
于 2013-01-28T16:56:53.543 に答える
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, ' ');
于 2013-01-25T16:49:06.467 に答える