Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Widok Oracle nie podlega aktualizacji, porady dotyczące zamiast wyzwalaczy

Wyzwalacz INSTEAD OF wyglądałby tak (założyłem, że masz kolumnę klucza podstawowego id ):

SQL> CREATE OR REPLACE TRIGGER trg_staff_data_cpt_instead_upd
  2     INSTEAD OF UPDATE ON staff_data_compat
  3     FOR EACH ROW
  4  BEGIN
  5     UPDATE staff_data_compat_t
  6        SET knownas_surname = :new.surname,
  7            first_name = :new.first_name,
  8            middle_name = :new.mid_name
  9      WHERE id = :new.id
 10  END;
 11  /

Trigger created

Zauważ, że niektóre kolumny mogą w rzeczywistości być aktualizowane w oryginalnym widoku. Zapytaj all_updatable_columns zobacz (przed utworzeniem wyzwalacza), aby dowiedzieć się:

SQL> CREATE TABLE staff_data_compat_t AS
  2  SELECT object_name knownas_surname,
  3         owner surname,
  4         object_type first_name,
  5         subobject_name middle_name
  6    FROM all_objects;

Table created

SQL> CREATE OR REPLACE VIEW staff_data_compat AS
  2  SELECT
  3    NVL(knownas_surname,surname) as surname,
  4    first_name,
  5    middle_name mid_name,
  6    NULL as ni,
  7    NULL as home_tel_no
  8  FROM staff_data_compat_t;

Widok utworzony

SQL> SELECT * FROM all_updatable_columns WHERE table_name = 'STAFF_DATA_COMPAT';

OWNER  TABLE_NAME         COLUMN_NAME  UPDATABLE INSERTABLE DELETABLE
------ ------------------ ------------ --------- ---------- ---------
VNZ    STAFF_DATA_COMPAT  SURNAME      NO        NO         NO
VNZ    STAFF_DATA_COMPAT  FIRST_NAME   YES       YES        YES
VNZ    STAFF_DATA_COMPAT  MID_NAME     YES       YES        YES
VNZ    STAFF_DATA_COMPAT  NI           NO        NO         NO
VNZ    STAFF_DATA_COMPAT  HOME_TEL_NO  NO        NO         NO

Jeśli potrzebujesz tylko wstawić/zaktualizować te kolumny, nie potrzebujesz wyzwalacza INSTEAD OF.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. jak wydrukować całą tabelę za pomocą anonimowego bloku w pl sql?

  2. Jak korzystać z wyliczeń w Oracle?

  3. SQL zwraca liczbę dni roboczych między 2 przekazanymi datami

  4. INSTR() Funkcja w Oracle

  5. Nie działa ustawienie PrepareStatement NULL dla tablicy NUMBER_ARRAY