Каков самый простой способ сделать столбец в Oracle ТОЛЬКО ДЛЯ ЧТЕНИЯ?

У нас есть одна из тех странных ошибок, связанных с повреждением зашифрованных данных, которые появляются каждые несколько недель, и никто не знает почему. Пока что кажется, что первичный ключ в таблице изменяется самопроизвольно, поэтому другие строки, которые на него указывают, теперь перепутаны.

Хотя я все еще ищу первопричину этого (воспроизвести невозможно), мне бы хотелось временного взлома, чтобы предотвратить изменение значения столбца. Вот схема таблицы:

CREATE TABLE TPM_INITIATIVES  ( 
    INITIATIVEID    NUMBER NOT NULL,
    NAME            VARCHAR2(100) NOT NULL,
    ACTIVE          CHAR(1) NULL,
    SORTORDER       NUMBER NULL,
    SHORTNAME       VARCHAR2(100) NULL,
    PROJECTTYPEID   NUMBER NOT NULL,
    CONSTRAINT TPM_INITIATIVES_PK PRIMARY KEY(INITIATIVEID)
    NOT DEFERRABLE
     VALIDATE
)

Нам, конечно, нужно иметь возможность создавать новые строки, но я хочу, чтобы НИЧЕГО не изменяло INITIATIVEID , независимо от того, какие странные запросы выполняются.

Некоторые идеи, о которых я могу подумать:

  • Я не очень хорошо знаком с разрешениями таблиц в Oracle (я больше парень Postgres), но не могу ли вы ПРЕДОСТАВИТЬ или ОТКАЗАТЬ права на обновление в определенном столбце для всех пользователей? Повлияет ли это только на обновления или на ВСТАВКИ? Какой командой будет ОТКАЗАТЬ обновлять этот столбец?
  • Создать своего рода триггер, который запускается при ОБНОВЛЕНИИ СТРОКИ.Можем ли мы определить, изменяется ли INITIATIVEID , и если да, выбросить исключение или каким-то образом взорваться?

По крайней мере, можем ли мы перехватить и / или записать это событие, чтобы узнать, когда оно произойдет и какой запрос вызывает изменение INITIATIVEID ?

Спасибо!

8
задан Sathyajith Bhat 1 December 2011 в 04:51
поделиться