脚本用于删除某个模式中的所有观点:
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
请注意,你不能COMMIT
或ROLLBACK
内的PLPGSQL块。只在外面。
如何逃离系统视图从这个pg_class。我只想要属于特定模式的视图 –
@SatishSharma'pg_class c JOIN pg_namespace ns ON c.relnamespace = ns.oid WHERE ns.nspname ='my_messed_up_schema''与您的示例相同。 –