这似乎是一个非常简单的问题,但我找不到答案!如何从 postgreSQL 控制台批量删除视图?我有 10,000 次查看,只是为了测试一些东西,现在我无法摆脱它们!
4 回答
您可以像这样从元表中选择视图(如果您使用旧版本,实际选择可能会有所不同,请参见此处,例如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_';
所以你根据你的实际版本修复这个选择,运行它,将结果保存到 .sql 文件中,然后运行 .sql 文件。
我添加了这个答案,它引用了@greg 的评论,而@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;
当我首先删除特定视图时,我会使用以下脚本进行备份;
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
最后,我使用以下命令删除视图(推荐使用 psql);
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