【问题标题】:PostgreSQL command for dropping all views and functions owned by role?用于删除角色拥有的所有视图和函数的 PostgreSQL 命令?
【发布时间】:2017-05-30 14:50:32
【问题描述】:

PostgreSQL 中是否有删除特定角色拥有的所有视图和函数的命令?我不明白所有内部表是如何连接在一起的,以便我可以创建这样的命令。

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    删除视图:

    create function drop_views_by_owner(owner regrole, do_drop boolean default true)
    returns setof text language plpgsql as $$
    declare r text;
    begin
        for r in 
            select format('%s.%s', nspname, relname)
            from pg_class c
            join pg_namespace n on n.oid = relnamespace
            where c.relowner = $1
            and relkind = 'v'
        loop
            if do_drop then
                execute format('drop view %s', r);
            end if;
            return next r;
        end loop;
    end $$;
    

    删除函数:

    create function drop_functions_by_owner(owner regrole, do_drop boolean default true)
    returns setof text language plpgsql as $$
    declare r text;
    begin
        for r in 
            select format('%s.%s(%s)', 
                nspname, proname, pg_get_function_identity_arguments(p.oid))
            from pg_proc p
            join pg_namespace n on n.oid = pronamespace
            where p.proowner = $1
        loop
            if do_drop then
                execute format('drop function %s', r);
            end if;
            return next r;
        end loop;
    end $$;
    

    如果第二个参数是false,则函数不会删除对象:

    select drop_views_by_owner('newuser');            -- list views and drop them
    select drop_views_by_owner('newuser', false);     -- only list views    
    
    select drop_functions_by_owner('newuser');        -- list functions and drop them
    select drop_functions_by_owner('newuser', false); -- only list functions        
    

    【讨论】:

    • 感谢您的努力,但我真的在寻找/希望使用 PostgreSQL 命令。
    【解决方案2】:

    如果您的用户只拥有视图和功能,您可以简单地:

    DROP OWNED BY your_role;
    

    您必须为您的用户拥有对象的集群中的每个数据库执行此操作。

    您可能会发现此文档很有用:https://www.postgresql.org/docs/current/static/role-removal.html

    【讨论】:

    • 看起来很危险。它可能会产生无法预料的后果。
    • 确实很危险,但是如果你需要drop掉一个用户拥有的所有对象才能drop你的用户,它会变得非常方便。
    猜你喜欢
    • 2021-06-28
    • 1970-01-01
    • 2022-06-10
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2021-04-01
    • 1970-01-01
    相关资源
    最近更新 更多