DROP所有视图PostgreSQL

时间:2012-11-30 10:57:27

标签: postgresql view dynamic-sql sql-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;

2 个答案:

答案 0 :(得分:6)

删除特定架构中所有视图的脚本:

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

请注意,plpgsql块中无法COMMITROLLBACK 。只在外面。

答案 1 :(得分:0)

使用表格pg_class

您需要relkind = 'v'