sql >> データベース >  >> RDS >> PostgreSQL

依存関係追跡機能

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

    関数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();
    


    1. mysqli_real_escape_stringは、SQLインジェクションやその他のSQL攻撃を回避するのに十分ですか?

    2. magentoは複数のMySQLスレーブを使用できますか?

    3. #1062-キー「PRIMARY」の重複エントリ

    4. 更新せずに、ONCONFLICTを使用してINSERTから行を返します