如何使用查询从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;
答案 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;
转换为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
。只在外面。
答案 1 :(得分:0)
使用表格pg_class
。
您需要relkind = 'v'