Oracle триггер, вероятно, проблема с: новый - PullRequest
0 голосов
/ 18 января 2020
create trigger Trigger_1
    Before INSERT
    on Adresse
    for each row
    declare
        pruefen int;
begin
    select COUNT(*) 
    into pruefen 
    from CITY 
    where city.NAME = :new.stadt 
    and CITY.PROVINCE = :new.provinz;
    if(pruefen = 0) then
        RAISE_APPLICATION_ERROR(-20000, 'Fehler');
    end if;
end;

Ошибка:

[2020-01-18 10:14:12] [72000] [20000] ORA-20000: Fehler
[2020-01-18 10 : 14: 12] ORA-06512: в "ZOGL1011.TRIGGER_1", строка 6
[2020-01-18 10:14:12] ORA-04088: ошибка во время выполнения триггера "ZOGL1011.TRIGGER_1"
[2020-01-18 10:14:12] Позиция: 12

Проблема не возникает .. :new.stadt и :new.provinz выделены красным, но я могу создать триггер .

Спасибо за помощь!

1 Ответ

3 голосов
/ 18 января 2020

[2020-01-18 10:14:12] [72000] [20000] ORA-20000: Fehler

Это ошибка, возникающая при срабатывании триггера при отсутствии данных в городе, который соответствует записи, которую вы пытаетесь вставить в адрес. Другими словами, это ваш триггер , работающий как задумано . Так что, если этот результат вас удивит, вам нужно проверить данные, которые вы используете как для CITY, так и для ADRESSE.

Просто чтобы доказать это, вот демонстрация на db <> fiddle .


Между прочим, это похоже на то, что правильно применяется через внешний ключ. Использование триггера для принудительной установки отношения является неправильным, потому что:

  1. Он работает хуже и не масштабируется.
  2. Может произойти сбой в многопользовательской среде.
  3. Это не будет продолжать применять отношения, когда DML выполняется в ссылочной таблице (CITY в вашем случае).
  4. В запутывает модель данных.
  5. Использование нестандартных подходов сбивает с толку других разработчиков, которым приходится работать с вашим кодом или поддерживать его.

Возможно, у вас плохая модель данных, которая не позволит вам использовать сторонний код ключ здесь? Возможно, в CITY отсутствует уникальный ключ (state, province).

Хотя, возможно, это всего лишь назначение. Это - судьба триггеров, которые будут использоваться в домашних заданиях способами, которыми они никогда не должны использоваться в реальной жизни.

...