这似乎是一个非常简单的问题,但我找不到答案!如何在postgreSQL控制台中批量删除视图?我创建了10,000个视图来测试,现在我无法摆脱它们!
这似乎是一个非常简单的问题,但我找不到答案!如何在postgreSQL控制台中批量删除视图?我创建了10,000个视图来测试,现在我无法摆脱它们!
你可以从元数据表中选择视图,如下所示(如果使用旧版本,则实际选择可能会有所不同,例如请参见此处 http://www.alberton.info/postgresql_meta_info.html)
SELECT 'DROP VIEW ' || table_name || ';'
FROM information_schema.views
WHERE table_schema NOT IN ('pg_catalog', 'information_schema')
AND table_name !~ '^pg_';
所以您需要根据实际版本修复此select语句,运行它,将结果保存到.sql文件中,然后运行该.sql文件。
我添加这个答案是参考了@greg的评论,他又引用了一个名为justbob的用户的回答,但该回答似乎已经不存在了。这个评论对我很有帮助,但其他人可能会轻易忽略它。
虽然它没有回答samachs的问题,因为他的观点已经得出,但它可能会帮助像我这样在谷歌搜索批量删除所有视图方法时发现这个问题的人。
我有几个依赖于另一个并由不断发展的脚本生成的视图。因此,当添加或删除视图时,必须进行一些更改。为了限制我添加或删除视图时需要进行更改的地方,我想在创建它们之前先将它们全部删除。
我现在使用的解决方案是在一个单独的模式中创建所有视图,该模式除了视图外什么也没有。
在我的脚本开始之前,我有以下语句来创建我的视图:
DROP SCHEMA IF EXISTS dbview_schema CASCADE;
CREATE SCHEMA dbview_schema;
之后,我将所有的视图都重新创建在它们自己的模式中:
CREATE VIEW dbview_schema.my_view AS
SELECT * FROM my_table
ORDER BY my_table.my_column;
测试一下,看看是否有效。我是凭记忆写的,所以可能会有一些语法问题。
BEGIN TRANSACTION;
DO $$DECLARE r record;
DECLARE s TEXT;
BEGIN
FOR r IN select table_schema,table_name
from information_schema.views
where table_schema = 'public'
LOOP
s := 'DROP VIEW ' || quote_ident(r.table_schema) || '.' || quote_ident(r.table_name) || ';';
EXECUTE s;
RAISE NOTICE 's = % ',s;
END LOOP;
END$$;
ROLLBACK TRANSACTION;
简短命令版本:
SELECT 'DROP VIEW ' || string_agg (table_name, ', ') || ' cascade;'
FROM information_schema.views
WHERE table_schema NOT IN ('pg_catalog', 'information_schema')
AND table_name !~ '^pg_';
输出
DROP VIEW v_mytable, v_my_view cascade;
SELECT 'DROP MATERIALIZED VIEW ' || string_agg(oid::regclass::text, ', ') || ' cascade;'
FROM pg_class
WHERE relkind = 'm';
WITH dump_options AS (
-- feel free to add any dump options
SELECT '--file=/tmp/create_views.sql --host=... my_db_name' AS dump_options
)
SELECT
format(e'pg_dump --schema-only --format=plain \\\n%s \\\n%s',
string_agg(
format('--table="%s.%s"', v.schemaname, v.viewname),
e' \\\n'
),
d.dump_options
) create_views
FROM pg_views v, dump_options d
WHERE
v.schemaname NOT IN (
'pg_catalog',
'information_schema',
'any_other_schema'
) AND
v.viewname NOT IN (
'pg_stat_statements'
) AND
(v.schemaname, v.viewname) NOT IN (
('a_particular_schema', 'a_particular_view')
)
-- AND ...
GROUP BY d.dump_options
该脚本创建了一个转储命令,当我们运行它时,将备份所有视图及其所有者和权限。
pg_dump --schema-only --format=plain \
--table="a_schema.a_view" \
--table="another_schema.another_view" \
... \
--file=/tmp/create_views.sql --host=... my_db_name
SELECT
format('DROP VIEW IF EXISTS %I.%I;', v.schemaname, v.viewname) drop_views
FROM pg_views v
WHERE -- the very same where clause used above
v.schemaname NOT IN (
'pg_catalog',
'information_schema',
'any_other_schema'
) AND
v.viewname NOT IN (
'pg_stat_statements'
) AND
(v.schemaname, v.viewname) NOT IN (
('a_particular_schema', 'a_particular_view')
)
-- AND ...
; -- \gexec
'DROP VIEW ' || table_name || ' CASCADE;'
。 - 200_success