2014-01-28 1 views
1

Как я могу правильно написать триггер для выполнения этой задачи:Trigger, чтобы отключить вставку в таблицу на определенный день в оракула

create or replace trigger M_t2 
after insert on emp 

begin 

if (to_char(sysdate,'DY') = 'TUE') then 
    dbms_output.put_line('cannot insert into emp on tuesday'); 
end if; 

end; 
/

Это не работает, как я все еще в состоянии вставить так:

insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values('7935','BOLT','ANALYST',7698,sysdate,900,100,10); 
+0

Триггер с помощью этого: 'to_char (SYSDATE, 'DY') = 'TUE'' не будет иметь никакого эффекта, если вставка была инициирована с моего компьютера. –

ответ

4

dbms_output не мешает вам ничего делать, и вы даже не увидите это сообщение, если ваш клиент не настроен для отображения вывода.

Чтобы предотвратить действие, которое необходимо вызвать исключение:

if (to_char(sysdate,'DY') = 'TUE') then 
    raise_application_error(-20001, 'cannot insert into emp on tuesday'); 
end if; 

Значение DY является NLS-зависимым, так это может быть обойдено путем иметь сеанс с другим языком, поэтому вы должны принять, что с учетом optional third parameter to to_char(). Это может также быть, прежде чем вставление триггер тоже:

create or replace trigger M_t2 
before insert on emp 
begin 
    if (to_char(sysdate, 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') = 'TUE') then 
    raise_application_error(-20001, 'cannot insert into emp on tuesday'); 
    end if; 
end; 
/

insert into emp ... 

ERROR at line 1: 
ORA-20001: cannot insert into emp on tuesday 
ORA-06512: at "<schema>.N_T2", line 3 
ORA-04088: error during execution of trigger '<schema>.M_T2' 
0

Пожалуйста, посмотрите на это: http://www.techonthenet.com/oracle/triggers/after_insert.php Я думаю, вы должны использовать: новый пункт и использовать переменную

+0

Почему вы так думаете? Нет ничего плохого в тестировании 'sysdate'? –

+0

Вы правы. Я внимательно посмотрел – starko

Смежные вопросы