ORA-01779 cannot modify a column which maps to a non key-preserved table

Komunikat błędu ORA-01779

ORA-01779 cannot modify a column which maps to a non key-preserved table ORA-01779 nie można modyfikować kolumny, która odwzorowuje się do tabeli nie zachowującej kluczy

Przyczyna błędu ORA-01779

Prawdopodobnie doszło do próby zmodyfikowania wiersza w widoku. W definicji widoku była użyta tabela której klucz nie został zachowany (non key-preserved table). Kolumny jakie można modyfikować przez widok wyszczególnione są w tabelach:

DBA_UPDATABLE_COLUMNS Wszystkie kolumny we wszystkich tabelach w bazie ALL_UPDATABLE_COLUMNS Wszystkie kolumny we wszystkich tabelach w bazie dostępnych dla użytkownika. USER_UPDATABLE_COLUMNS Wszystkie kolumny we wszystkich tabelach w bazie w schemacie użytkownika

Przykład

Mamy do dyspozycji dwie tabelki ze schematu HR- departments i employees:

SQL> desc employees; Nazwa Null? Typ ------------------------------- -------- ---- EMPLOYEE_ID NOT NULL NUMBER(6) FIRST_NAME VARCHAR2(20) LAST_NAME NOT NULL VARCHAR2(25) EMAIL NOT NULL VARCHAR2(25) PHONE_NUMBER VARCHAR2(20) HIRE_DATE NOT NULL DATE JOB_ID NOT NULL VARCHAR2(10) SALARY NUMBER(8,2) COMMISSION_PCT NUMBER(2,2) MANAGER_ID NUMBER(6) DEPARTMENT_ID NUMBER(4) DN VARCHAR2(300) SQL> desc departments Nazwa Null? Typ ------------------------------- -------- ---- DEPARTMENT_ID NOT NULL NUMBER(4) DEPARTMENT_NAME NOT NULL VARCHAR2(30) MANAGER_ID NUMBER(6) LOCATION_ID NUMBER(4) DN VARCHAR2(300)

Załóżmy że korzystając z tabelek ze schematu HR stworzyliśmy widok:

CREATE VIEW emp_dept AS SELECT emp.empno, emp.ename, emp.deptno, emp.sal, dept.dname, dept.loc FROM emp, dept WHERE emp.deptno = dept.deptno AND dept.department_name IN ('Administration', 'Marketing', 'Purchasing');

Chcielibyśmy zobaczyć jakie kolumny będą modyfikowalne:

SQL> select * FROM USER_UPDATABLE_COLUMNS where table_name like 'EMP_DEPT'; OWNER TABLE_NAME COLUMN_NAME UPDATABLE INSERTABLE DELETABLE ------- --------------- --------------- ---------- HR EMP_DEPT EMPLOYEE_ID YES YES YES HR EMP_DEPT FIRST_NAME YES YES YES HR EMP_DEPT DEPARTMENT_ID YES YES YES HR EMP_DEPT SALARY YES YES YES HR EMP_DEPT DEPARTMENT_NAME NO NO NO

Tabela departments nie zachowała kluczy. Przykładowo kolumna DEPARTMENT_ID która była kluczem głównym w tabelce DEPARTMENTS nie może być kluczem głównym w widoku EMP_VIEW. Zauważmy że jej wartości nie są w tym widoku unikatowe! Natomiast klucze zachowały się dla tabeli employees.

W związku z tym spójrzmy na poniższe polecenie update:

UPDATE emp_dept SET d_id = 10 WHERE first_name like 'D%';

To oczywiście nie pójdzie bo kolumna D_ID nie ma statusu updatable.

UPDATE emp_dept SET first_name = 'Luke' WHERE first_name like 'D%';

A to jest poprawne, bo kolumna first_name należy do tabeli zachowującej klucze. Mam nadzieję, że wyjaśniłem kwestię błedu ORA 01779 wyczerpująco.