语句级触发器,每执行一次触发语句,该触发器就会被执行一次,也就是说,不管触发语句影响多少行,该触发器只会执行一次。不用for each row 。不管你的操作是涉及到一行或者多行,都会执行一次触发器。 例如只希望能在上班时间访问某个表,就应该使用语句级触发器。 例如,只希望在工作日访问a表 create or replace trigger a_biud before insert or update or delete on a declare v_day varchar2(10); begin v_day := rtrim(to_char(sysdate, 'day')); if v_day like ('S%') then raise_application_error(-20000, 'a table cannot e modified during off hours'); end if; end;
总之,一句话就是:语句就是表,表级触发器不管是否有无行受到影响都要触发有且仅一次!
例如只希望能在上班时间访问某个表,就应该使用语句级触发器。
例如,只希望在工作日访问a表
create or replace trigger a_biud
before insert or update or delete on a
declare
v_day varchar2(10);
begin
v_day := rtrim(to_char(sysdate, 'day'));
if v_day like ('S%') then
raise_application_error(-20000,
'a table cannot e modified during off hours');
end if;
end;
假设我要在update时触发,对于行级触发器,如果我用update语句一下update掉5行,就会触发5此;
对于语句级触发器,如果我用update语句一下update掉5行,只会针对这个update触发一次。如果再用update语句update一下,就会再触发一次。不知道我上面理解的对不对
对的,就算你update 0行,语句级触发器也要执行一次