触发在oracle中禁用特定日期的表插入

时间:2014-01-28 18:03:06

标签: oracle plsql

如何为此任务正确编写触发器:

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);

2 个答案:

答案 0 :(得分: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'

答案 1 :(得分:0)

请看一下:http://www.techonthenet.com/oracle/triggers/after_insert.php 我认为你必须使用:new子句并使用变量