Как исправить основной триггер, не запущенный в SQL Oracle - PullRequest
3 голосов
/ 21 апреля 2019

Я пытался заставить этот триггер работать, но по какой-то причине он даже не активируется до того, как я обновлю / вставлю что-то в таблицу.Цель этого триггера (и я должен сделать это с помощью триггеров) состоит в том, чтобы гарантировать, что все записи в таблице DISCS имеют либо «L», либо «S» в атрибуте FORMAT.Если нет, запись не должна быть вставлена ​​/ обновлена.

Я попытался добавить строку, чтобы проверить, был ли активирован триггер вообще (строка «buenos dias»), но, похоже, это не так.т по какой-то причине.Я только начинающий с триггерами, и я уверен, что ошибка действительно глупая, но я просто не могу ее найти.

Код для триггера:

CREATE OR REPLACE TRIGGER FORMAT_T
  BEFORE INSERT OR UPDATE OF FORMAT
  ON DISCS
  FOR EACH ROW
DECLARE
  bad_format EXCEPTION;
BEGIN
  DBMS_OUTPUT.PUT_LINE('Buenos dias.');
  IF :NEW.FORMAT != 'S' AND :NEW.FORMAT != 'L' THEN
    RAISE bad_format;
  END IF;
EXCEPTION
  WHEN bad_format THEN
    DBMS_OUTPUT.PUT_LINE('Bad format, could not insert/update.');
END FORMAT_T;

Один разЯ скомпилирую триггер без проблем, я пытаюсь обновить следующую строку (используя ID первой строки, чтобы иметь возможность легко ее проверить):

UPDATE DISCS
SET FORMAT = 'W'
WHERE ID = 1;

Это должно вернуть ошибку, так как формат IЯ обновляю его не до «L» и не «S», а вместо этого строка просто обновляется без проблем и без всплывающей строки «buenos dias».В таблице user_errors также нет ошибок.

Заранее благодарю за помощь.

Ответы [ 4 ]

4 голосов
/ 21 апреля 2019

Ваш триггерный код, как опубликовано, работает отлично Настоящая проблема раскрывается этим:

без строки "buenos dias", даже всплывающей

Очевидно, что вы работаете в среде, в которой DBMS_OUTPUT отключен. Таким образом, ОБНОВЛЕНИЕ не удается, как ожидалось, вы просто не видите сообщение. Мы можем легко продемонстрировать это, удалив блок EXCEPTION из кода триггера, так как SQL Fiddle демонстрирует .

Включение DBMS_OUTPUT зависит от среды выполнения. В SQL * Plus запустите set serveroutput on. В Oracle SQL Developer выберите Просмотр > Dbms_Output и установите соединение. В PL / SQL Developer включите DBMS_OUTPUT на листе SQL. И так далее.


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

alter table disks add constraint disc_format_ck 
    check (format in ('S', 'L'));
2 голосов
/ 21 апреля 2019

Ваша проблема связана с

IF :NEW.FORMAT != 'S' AND :NEW.FORMAT != 'L' THEN

Заявление

Просто замените на

IF :NEW.FORMAT not in ('S','L') THEN

но я бы предпочел использовать проверочное ограничение:

ALTER TABLE discs
ADD CONSTRAINT chk_format CHECK (format in ('S','L'))

В этом случае база данных автоматически выбрасывает «проверочное ограничение нарушено» при вводе символов, отличных от 'S' или 'L', без необходимости триггера.

0 голосов
/ 21 апреля 2019

ИСПОЛЬЗОВАНИЕ поднять_процесса_ошибки:

поднять_аппозиции_приложения (-20010, «неверный формат, невозможно вставить / обновить.»);

0 голосов
/ 21 апреля 2019
CREATE OR REPLACE TRIGGER FORMAT_T
BEFORE INSERT OR UPDATE
OF FORMAT
ON DISCS
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN 
  IF :NEW.FORMAT not in( 'S' , 'L') THEN    
    raise_application_error(-20010,'Bad format, could not insert/update.');
  END IF;   
EXCEPTION
  WHEN OTHERS THEN    
    DBMS_OUTPUT.PUT_LINE('OTHERS EXCEPTION');   
END FORMAT_T;
...