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 kluczyPrzyczyna 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żytkownikaPrzykł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 NOTabela 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.
::MENU:: ::oracle, linux, bash:: ::KOMUNIKATY BŁĘDÓW::
- ORA-01779 cannot modify a column ...
- ORA-01555 snapshot too old
- ORA-01034 ORACLE not available
- ORA-07446: sdnfy: bad value '' for parameter
- ORA-12705 Cannot access NLS data files or invalid environment specified
- ORA-04062 signature of package has been changed
::HELP - wyszukiwarka::
Łukasz Goszczyński goszczu.pl