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;
/
Но, опять же, зачем? Уникальность - вот ключевое слово.