这似乎是一个非常简单的问题,但我无法找到它的答案! 如何从postgreSQL控制台批量删除视图?我有10,000次观看,我只是为了测试一些东西,现在我无法摆脱它们!
答案 0 :(得分:9)
您可以从元表中选择视图,如下所示(如果使用旧版本,实际选择可能会有所不同,请参见此处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文件。
答案 1 :(得分:6)
我添加了这个引用@greg评论的答案,而@greg又引用了一个名为justbob的用户的答案,这个答案似乎已经消失了。这个评论给了我很多帮助,但很容易被其他人忽视。
虽然它没有回答samachs的问题,因为他的观点已经完成,它可能会帮助像我这样的人在google搜索后找到一个方法来删除批量操作中的所有视图。
我有一些视图依赖于另一个视图,并且是由不断发展的脚本生成的。因此,将在脚本中添加或删除一些视图。要在添加或删除视图时限制我必须进行更改的位置,我想在脚本开头再将它们全部删除,然后再重新创建它们。
我现在使用的解决方案是在一个单独的模式中创建所有视图,只包含视图。
在我的脚本开头,我在创建视图之前有以下语句:
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;
答案 2 :(得分:3)
测试一下,看看它是否有效。我把它从内存中拉出来,因此可能存在一些语法问题。
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;
答案 3 :(得分:0)
当我首先删除特定视图时,我使用以下脚本进行备份;
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