【发布时间】: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 语句中执行此操作。