Oracle SQL Trigger - PullRequest
       5

Oracle SQL Trigger

1 голос
/ 23 июля 2011

Я хочу, чтобы база данных не хранила в таблице значения, превышающие 20.

CREATE OR REPLACE TRIGGER Dont_Allow
AFTER INSERT ON Cities
FOR EACH ROW

WHEN (new.IDCity > 20)

BEGIN
   dbms_output.put_line('  Failed to insert ' || :new.IDCity);
   delete from orase where IDCity=:new.IDCity;
END;

Хотя это работает с точки зрения того, что на самом деле ничего не добавляется с ID > 20, каждый раз, когда триггер пытается творить свою магию, это показывает:

ORA-04091: таблица SYSTEM.ORASE мутирует, триггер / функция может ее не видеть
ORA-06512: в "SYSTEM.DONT_ALLOW", строка 6
ORA-04088: ошибка во время выполнения триггера 'SYSTEM.DONT_ALLOW'

Как правильно делать то, что я хочу?


EDIT:

Я решил использовать для этого триггер:

После того, как новая строка вставлена ​​в Employees, триггер проверяет зарплату нового парня и, если она превышает 21 ед. / Час, он получает 5% от бонуса руководства. Хромой, но эй - я использую триггер, чтобы решить проблему, которой у меня нет: результат не будет красивым.

CREATE OR REPLACE TRIGGER Bite_Bonus
AFTER INSERT ON Employees
FOR EACH ROW

WHEN (new.HourSalary > 20)

BEGIN
   update Management set Bonus = Bonus - 5/100 * Bonus;
END;

Ответы [ 3 ]

9 голосов
/ 23 июля 2011

Вы не должны использовать TRIGGER для этого, вы должны использовать CHECK, например CONSTRAINT city_id_below_20 CHECK (IDCity < 20).Вы можете использовать ALTER TABLE ADD CONSTRAINT, чтобы поместить его на существующий стол.

5 голосов
/ 23 июля 2011

Как указывалось в TC1, надлежащим способом обеспечения соблюдения такого рода требований является использование ограничения.

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

CREATE OR REPLACE TRIGGER Dont_Allow
  BEFORE INSERT OR UPDATE ON Cities
  FOR EACH ROW
  WHEN (new.IDCity > 20)
BEGIN
  RAISE_APPLICATION_ERROR( -20001, 'IDCity cannot exceed 20 so rejecting invalid value: ' || :new.IDCity );
END;
4 голосов
/ 23 июля 2011

Если вам нужно использовать триггер для этого, сделайте его триггером BEFORE INSERT, а не AFTER INSERT - вы вообще не хотите, чтобы эта вставка происходила. Попытка «отменить» его после свершившегося факта - не очень хороший подход.

Чтобы прервать вставку, все, что вам нужно сделать, это вызвать исключение в этом триггере. Вероятно, лучшая вещь для этого - вызвать ошибку приложения .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...