【问题标题】:How can I edit the columns in an existing view如何编辑现有视图中的列
【发布时间】:2017-08-13 23:06:49
【问题描述】:

我有一个错字的视图:

CREATE OR REPLACE VIEW "USER"."VW_X" AS (
SELECT id, 
       name, 
       decode(WRONG_COLUMN, 1, 'T', 0, 'F') AS problem
FROM "USER"."TEST");

出于某种原因使用

CREATE OR REPLACE VIEW "USER"."VW_X" AS (
SELECT id, 
       name, 
       decode(RIGHT_COLUMN, 1, 'T', 0, 'F') AS problem
FROM "USER"."TEST");

导致以下消息:

从行开始的错误:命令中的 5 - 创建或替换视图 "USER"."VW_X" AS ( 选择身份证, 姓名, decode(RIGHT_COLUMN, 1, 'T', 0, 'F') AS问题 来自“用户”。“测试”) 错误报告 - SQL 错误:ORA-02449:外键引用的表中的唯一键/主键 02449. 00000 - “外键引用的表中的唯一/主键” *原因:试图删除具有唯一或 另一个表中的外键引用的主键。 *行动:在执行上述操作表之前,删除 其他表中的外键约束。你可以看到什么 约束通过发出以下命令来引用表 命令: SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME = "tabnam";

我什至不知道视图是引用的有效目标。那么问题来了:

SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME = "USER"."VW_X";

什么都不返回,这个:

SELECT a.table_name, 
     a.column_name, 
     a.constraint_name, 
     c.owner, 
     c.r_owner, 
     c_pk.table_name r_table_name, 
     c_pk.constraint_name r_pk, 
     c.status
FROM all_cons_columns a
JOIN all_constraints c 
ON a.owner = c.owner AND a.constraint_name = c.constraint_name
JOIN all_constraints c_pk 
ON c.r_owner = c_pk.owner AND c.r_constraint_name = c_pk.constraint_name
WHERE c_pk.table_name = 'VW_X' or c.table_name = 'VW_X';

this 帖子顶部答案的变体) 返回四个约束,它们的状态都是'DISABLED'

我已经查看了ALTER VIEW(这个名字听起来很有希望),但它似乎不是我想要的。

有什么建议吗?

注意:可能 可能在提供的示例代码中存在一些语法错误。这些是模型,为了简单起见,出于专业的偏执,大约十几个不相关的列已被删除,名称已被更改。

编辑: 这是Oracle11g

编辑: 我找到的解决方案是

-- drop view.
DROP VIEW "USER"."VW_X" CASCADE CONSTRAINTS;
commit;

-- create view.
CREATE OR REPLACE VIEW "USER"."VW_X" AS (
SELECT id, 
       name, 
       decode(RIGHT_COLUMN, 1, 'T', 0, 'F') AS problem
FROM "USER"."TEST");
commit;

CASCADE CONSTRAINTS 似乎是缺少的链接。我很确定约束已经丢失,但我并不特别在意。

【问题讨论】:

  • 我没有在视图上使用 FK。但是,看起来行为类似于表格。您需要识别视图上的 FK 约束,删除它们,更改视图,然后重新创建约束。您将无法在单个 alter view 语句中执行此操作。

标签: sql oracle11g sql-view


【解决方案1】:
ALTER VIEW
AS
SELECT
[new column name] = wrongcolumn

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
  • 如果我没看错,看起来你可能有这个倒退,ALTER VIEW AS SELECT 问题 = rightcolumn 这行得通吗?
  • 你的意思是ALTER VIEW VW_X AS 吗?
  • 另外,我使用的是 Oracle11g,我 90% 确定不支持此功能
  • 好的,这是 MS SQL
【解决方案2】:

这是一个解决方案,它会删除 FK,创建视图,然后重新创建 FK

  -- create view with unique constraint
  create or replace view v_foo 
  (id unique disable novalidate, val)
  as 
  select id, val from foo;

  -- create second view
  create or replace view v_bar
  (id, val)
  as
  (select id, val from bar);

  -- add FK to second view
  alter view v_bar
  add constraint v_bar_ref
  foreign key (id) references v_foo(id)
   disable novalidate;


  -- add a column, this fails b/c of FK constraint 
  create or replace view v_foo 
  (id unique disable novalidate, val, dummy)
  as 
  select id, val, 1 from foo;

  -- remove constraint
  alter view v_bar
  drop constraint v_bar_ref;

  -- make changes to view
  create or replace view v_foo 
  (id unique disable novalidate, val, dummy)
  as 
  select id, val, 1 from foo;

  -- recreate FK constraint
  alter view v_bar
  add constraint v_bar_ref
  foreign key (id) references v_foo(id)
   disable novalidate; 

【讨论】:

  • 这似乎是一个很好的解决方案,但其中一个问题是我无法弄清楚它甚至在谈论哪个 fk。也就是说,我最终找到了一个更容易接受的解决方案。
  • @chrisgotter 你最后做了什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多