在创建视图之前检查是否存在视图

时间:2014-03-26 05:27:41

标签: oracle postgresql firebird

我有一张桌子' X'我想放下桌子并创建一个视图' X'只有视图' X'不存在。 请告诉我如何在firebird,oracle,postgres中查看此内容

3 个答案:

答案 0 :(得分:1)

在Firebird中你可以:

CREATE OR ALTER VIEW ...

或检查是否存在:

SELECT * FROM rdb$relations
WHERE rdb$relation_type = 1
  AND rdb$relation_name = <view_name>

答案 1 :(得分:0)

视图只是一个SQL,您不能删除表并在其上创建视图。但是,在Oracle中,如果要查找视图X是否存在于数据库中,只需查询视图user_objects:

select count(*) from user_objects where object_name='X' and object_type='VIEW'

如果结果&gt; = 0,则存在名为X的视图。类似的查询可用于查询表是否存在。

Oracle中最简单的方法就是使用create or replace view X as ....,您无需关心名为X的视图是否存在。

答案 2 :(得分:0)

PostgreSQL特定的答案:您可以使用anonymous code block

首先,很显然,如果您的新视图应该提供表X中的数据,则不能删除该表。但是,假设新视图X将从其他地方获取数据,则:

DO LANGUAGE plpgsql $BODY$
BEGIN
    PERFORM FROM information_schema.views WHERE table_name = 'x';
    IF NOT FOUND THEN
        DROP TABLE X CASCADE;
        CREATE OR REPLACE VIEW X AS SELECT * FROM Y;
    END IF;
END $BODY$;

请注意,尽管表名称在PostgreSQL中不区分大小写,但是信息模式table_name是区分大小写的,并且值存储在LOWERCASE中(不确定这是标准的还是什么)。

尽管在这种情况下不相关,但是请注意,视图同时显示在信息模式的tablesviews表中(同样,不确定这是否是PostgreSQL的特性。)< / p>

如果新视图应该具有表X中的数据,那么您仍然可以通过重命名表来做到这一点(即使表X在外键的其他位置被引用,至少在平凡的情况下也是如此)我有-显然,该视图已接管了所有基础对象ID,它们都是自动神奇地处理的):

DO LANGUAGE plpgsql $BODY$
BEGIN
    PERFORM FROM information_schema.views WHERE table_name = 'x';
    IF NOT FOUND THEN
        ALTER TABLE X RENAME TO _X_table;
        CREATE OR REPLACE VIEW X AS SELECT * FROM _X_table;
    END IF;
END $BODY$;