3

クエリを使用して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;
4

2 に答える 2

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;

regclass( t.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
$$

DOPostgreSQL 9.0 以降が必要です。

IFビューが見つからない場合、この構造は例外を回避します。

他のビューを参照するビューがある場合は、キーワードを追加するCASCADEか、ビューを上から下の階層順に削除する必要があります。

投下する前に、何を投下するかを常に確認してください。確信が持てない場合は、トランザクションを開始し、爆弾を投下し、すべてが正常かどうかを確認してから、コミットまたはロールバックします。

BEGIN;
DO$$
  ...
$$;

-- check ..

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

plpgsql ブロッ​​ク内COMMITまたは ROLLBACK 内部ではできないことに注意してください。外だけ。

于 2012-11-30T21:48:50.587 に答える
0

テーブルを使用しますpg_class

あなたが必要relkind = 'v'

于 2012-11-30T11:46:43.533 に答える