特定のスキーマ内のすべてのビューを削除するスクリプト:
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
$$
DO
PostgreSQL 9.0 以降が必要です。
IF
ビューが見つからない場合、この構造は例外を回避します。
他のビューを参照するビューがある場合は、キーワードを追加するCASCADE
か、ビューを上から下の階層順に削除する必要があります。
投下する前に、何を投下するかを常に確認してください。確信が持てない場合は、トランザクションを開始し、爆弾を投下し、すべてが正常かどうかを確認してから、コミットまたはロールバックします。
BEGIN;
DO$$
...
$$;
-- check ..
ROLLBACK; -- if something wrong
COMMIT; -- else
plpgsql ブロック内COMMIT
または ROLLBACK
内部ではできないことに注意してください。外だけ。