sql >> データベース >  >> RDS >> Oracle

Oracleビューは更新できません、トリガーの代わりにアドバイス

    INSTEAD OFトリガーは次のようになります(主キー列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
    

    一部の列は、実際には元のビューで更新可能である可能性があることに注意してください。 all_updatable_columnsをクエリします (トリガーを作成する前に)表示して確認します:

    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;
    

    作成されたビュー

    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
    

    これらの列を挿入/更新するだけでよい場合は、INSTEADOFトリガーは必要ありません。



    1. ブラウザ経由でPDOを使用してMySQLテーブルからCSVとしてデータを保存する

    2. djangoのタイムスタンプフィールド

    3. MySQL5.5.9およびTYPEでのHibernateテーブル作成エラー

    4. SQL Serverのデータベースですべてのチェックキーと外部キーの制約を有効にする方法(T-SQLの例)