特定のスキーマ内のすべてのビューを削除するスクリプト:
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 内部ではできないことに注意してください。外だけ。