Oracle 21c부터 Updatable Join View에 대한 ORA-01779 에러가 사라진 것으로 보입니다. 참고로 이 에러와 관련된 BYPASS_UJVC 힌트는 11.1 버전에서 deprecate되었습니다.
Starting with Oracle Database Release 21c, it is not mandatory for all updatable columns in a join view to map to columns of a key-preserved table. When updating a join view, ensure that the UPDATE operation is deterministic. Note that this does not cause any impact on update performance.
테스트를 위해 아래와 같이 테이블을 생성하겠습니다.
-- 1
DROP TABLE t1 PURGE;
DROP TABLE t2 PURGE;
CREATE TABLE t1 (c1 NUMBER, c2 NUMBER);
CREATE TABLE t2 (c1 NUMBER, c2 NUMBER);
INSERT INTO t1 VALUES (1, 1);
INSERT INTO t2 VALUES (1, 2);
COMMIT;
아래 UPDATE 문은 19.3 버전에서 ORA-01779 에러가 발생합니다.
-- 2: 19.3
UPDATE (SELECT a.c2 AS ac2, b.c2 AS bc2 FROM t1 a, t2 b WHERE b.c1 = a.c1)
SET ac2 = bc2;
ORA-01779: 키-보존된것이 아닌 테이블로 대응한 열을 수정할 수 없습니다
21.3 버전에서 UPDATE 문을 수행하면 구문이 정상적으로 수행됩니다.
-- 3: 21.3
UPDATE (SELECT a.c2 AS ac2, b.c2 AS bc2 FROM t1 a, t2 b WHERE b.c1 = a.c1)
SET ac2 = bc2;
1 행이 업데이트되었습니다.
ROLLBACK;
하지만 동일 행이 2번 갱신되면 ORA-30926 에러가 발생합니다.
-- 4-1
INSERT INTO t2 VALUES (1, 2);
-- 4-2
UPDATE (SELECT a.c2 AS ac2, b.c2 AS bc2 FROM t1 a, t2 b WHERE b.c1 = a.c1)
SET ac2 = bc2;
ORA-30926: 원본 테이블의 고정 행 집합을 가져올 수 없습니다
V$SYSTEM_FIX_CONTROL 뷰에서 관련 개선을 조회할 수 있습니다.
-- 5
SELECT sql_feature, description, optimizer_feature_enable
FROM v$system_fix_control
WHERE bugno = 19138896;
SQL_FEATURE DESCRIPTION OPTIMIZER_FEATURE_ENABLE
------------------ -------------------------------------------------------- ------------------------
QKSFM_DML_19138896 allow update of join view without key preserved property 21.1.0
1개의 행이 선택되었습니다.
[2023-04-04]
23c부터 UPDATE 문과 DELETE 문에 대한 직접 조인이 가능해졌습니다.
관련 링크