Как вызвать триггер при нарушении ограничения? - PullRequest
0 голосов
/ 18 ноября 2018

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

create or replace trigger tr_add_on_audit_table
before insert on lds_consultant
for each row
declare
uname varchar2(30);
begin
 select username into uname from lds_consultant where username = :NEW.USERNAME;

 if uname <> '' or uname <> null then
  insert into audit_table values(null, null, 'nishan', 'insert', null, null, 'cmd', null, 'LDS_CONSULTANT', 'CONSULTANT_ID',null, null, null);
 end if;
end;

но этот код не вставляет данные в таблицу аудита.

Как мне этого добиться?

1 Ответ

0 голосов
/ 18 ноября 2018

NULL не равно и не отличается ни от чего. Вы должны использовать IS NULL или IS NOT NULL, а не <> или =.

Примерно так:

create or replace trigger tr_add_on_audit_table
  before insert on lds_consultant
  for each row
declare
  uname varchar2(30);
begin
 select username 
   into uname 
  from lds_consultant 
  where username = :NEW.USERNAME;

  if uname is not null then          --> this!
    insert into audit_table 
      values(null, null, 'nishan', 'insert', null, null, 'cmd', null, 'LDS_CONSULTANT', 'CONSULTANT_ID',null, null, null);
  end if;
exception
  when no_data_found then
    null;
end;

Я включил раздел обработчика исключений на случай, если SELECT ничего не возвращает; если это маловероятно, удалите его (или обработайте правильно; я ничего не делаю (NULL;). Кроме того, при необходимости обработайте другие исключения.

Также я бы предложил вам назвать все столбцы, в которые вы вставляете. Сегодня вы знаете, какое значение куда идет, но через месяц или два вы забудете, что должно означать третье значение NULL.

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

Самый простой вариант - создать ограничение уникального ключа для столбца USERNAME и позволить Oracle обрабатывать дубликаты.

Если вы хотите сделать это самостоятельно, вы должны, например,

raise_application_error(-20000, 'Duplicate username is not allowed);

Однако это не сохранит ваш INSERT в таблицу, так как все будет откатано. Чтобы это исправить, создайте процедуру, которая использует pragma autpendent_transaction и фиксирует вставку в таблицу аудита.

Все будет выглядеть так:

create or replace procedure p_audit as
  pragma autonomous_transaction;
begin
  insert into audit_table 
    values(null, null, 'nishan', 'insert', null, null, 'cmd', null, 'LDS_CONSULTANT', 'CONSULTANT_ID',null, null, null);
  commit;
end;
/
create or replace trigger tr_add_on_audit_table
  before insert on lds_consultant
  for each row
declare
  uname varchar2(30);
begin
 select username 
   into uname 
  from lds_consultant 
  where username = :NEW.USERNAME;

  if uname is not null then
    p_audit;
    raise_application_error(-20000, 'Duplicates are not allowed')
  end if;
exception
  when no_data_found then
    null;
end;
/

Но, опять же, зачем? Уникальность - вот ключевое слово.

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