2012-11-30 42 views
2

如何从PostgreSQL中使用查询删除所有用户定义的视图? 喜欢,我们可以使用查询删除所有功能:DROP所有视图PostgreSQL

SELECT 'DROP FUNCTION ' || ns.nspname || '.' || proname 
     || '(' || oidvectortypes(proargtypes) || ');' 
FROM pg_proc INNER JOIN pg_namespace ns ON (pg_proc.pronamespace = ns.oid) 
WHERE ns.nspname = 'my_messed_up_schema' order by proname; 

回答

0

使用表pg_class

你需要relkind = 'v'

+0

如何逃离系统视图从这个pg_class。我只想要属于特定模式的视图 –

+0

@SatishSharma'pg_class c JOIN pg_namespace ns ON c.relnamespace = ns.oid WHERE ns.nspname ='my_messed_up_schema''与您的示例相同。 –

5

脚本用于删除某个模式中的所有观点:

SELECT 'DROP VIEW ' || t.oid::regclass || ';' -- CASCADE? 
FROM pg_class t 
JOIN pg_namespace n ON n.oid = t.relnamespace 
WHERE t.relkind = 'v' 
AND n.nspname = 'my_messed_up_schema -- select by schema(s) 
ORDER BY 1; 

演员到regclasst.oid::regclass)防止SQLi,否则非法名称会自动报价。你也可以使用quote_ident()

你的例子本质上是不安全的。

Do它的时候了:

DO 
$$ 
DECLARE 
    sql text; 
BEGIN 
    SELECT INTO sql 
      string_agg('DROP VIEW ' || t.oid::regclass || ';', ' ') -- CASCADE? 
    FROM pg_class t 
    JOIN pg_namespace n ON n.oid = t.relnamespace 
    WHERE t.relkind = 'v' 
    AND n.nspname = 'my_messed_up_schema'; 

    IF sql IS NOT NULL THEN 
     -- RAISE NOTICE '%', sql; -- to debug 
     EXECUTE sql; 
    ELSE 
     RAISE NOTICE 'No views found. Nothing dropped.'; 
    END IF; 
END 
$$ 

DO需要的PostgreSQL 9.0或更高版本。

如果未找到任何视图,IF构造可以避免发生异常。

如果您拥有引用其他视图的视图,那么您必须添加关键字CASCADE或从上到下按层级顺序放置视图。

总是在你做这件事之前检查一下你要放弃的是什么,否则你可能会自己加入。如果您不确定,请开始交易,放下炸弹,检查是否一切正常,然后提交或回滚。

BEGIN; 
DO$$ 
    ... 
$$; 

-- check .. 

ROLLBACK; -- if something wrong 
COMMIT; -- else 

请注意,你不能COMMITROLLBACK的PLPGSQL块。只在外面。

+0

工程,只要有意见删除,但如果没有意见导致错误。我该如何解决这个问题?你使用的是什么形式的“执行”?在手册中,我只是发现这与'prepare'一起使用...... – yankee

+0

@yankee:这是'DO'块中的plpgsql代码,所以*** not ***执行预处理语句的SQL命令。我添加了一个捕获异常的版本。 [在这里查找相关问题。](https://stackoverflow.com/search?q=user%3A939860+%5Bplpgsql%5D+%5Bdynamic-sql%5D+execute) –