加入收藏 | 设为首页 | 会员中心 | 我要投稿 宁德站长网 (https://www.0593zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

数据库 – 依赖性跟踪功能

发布时间:2021-03-05 17:23:05 所属栏目:MsSql教程 来源:网络整理
导读:我只是想知道在运行DROP … CASCADE后是否有人知道如何自动化视图创建? 现在我首先尝试使用经典的DROP VIEW myview语句删除视图,如果我不能删除视图,因为其他对象仍然依赖于它,然后检查postgres列出的所有对象名称并保存它们的创建然后我运行drop with级

我只是想知道在运行DROP … CASCADE后是否有人知道如何自动化视图创建?
现在我首先尝试使用经典的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();

(编辑:宁德站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读