Posted on 2007-07-14 22:35
leekiang 閱讀(331)
評論(0) 編輯 收藏 所屬分類:
oracle
create or replace trigger auth_secure
before insert or update or delete
on auths //對整表更新前觸發
begin
if(to_char(sysdate,'DY')='SUN'
RAISE_APPLICATION_ERROR(-20600,'不能在周末修改表auths');
end if;
end
RAISE_APPLICATION_ERROR的錯誤代碼在-20000到-20999之間,這樣就不會與 ORACLE 的任何錯誤代碼發生沖突
禁止ddl操作
create or replace trigger ddl_deny
before create or alter or drop or truncate on database//系統級別的觸發器
declare
v_errmsg varchar2(100):= 'You have no permission to this operation';
begin
if ora_sysevent = 'CREATE' then
raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || v_errmsg);
elsif ora_sysevent = 'ALTER' then
raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || v_errmsg);
elsif ora_sysevent = 'DROP' then
raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || v_errmsg);
elsif ora_sysevent = 'TRUNCATE' then
raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || v_errmsg);
end if;
exception
when no_data_found then
null;
end;
又一例:
create or replace trigger his_trig_u
after update ON MYDATA
FOR EACH ROW
declare
temp_count number;
BEGIN
select count(*)
into temp_count
from DATAHIS t
where t.num = :new.num
and t.time = :new.time;
if temp_count = 0 then
insert into DATAHIS
(uid, num, value, time)
values
(data_sql.nextval,
:new.num,
:new.value,
:new.time);
end if;
END;
begin前面出現的new,old不加冒號,begin和end之間出現的new和old都要在前面加上":"
用觸發器完成動態數據的操作
在涉及如何實現動態庫存的問題時,可用觸發器解決。倉庫有驗收、出庫、調撥、報廢、退料、讓售等這些數據必須與以前的庫存相加減,才能完成動態庫存操作。本文僅以驗收單觸發器為例,其它的結構雷同。它們涉及到兩個基表:bi_ysd(驗收單),Bj_kcb(當前庫存表),前者的表結構(rq(日期),ysdh(驗收單號), bjbm(備件編碼),yssl(驗收數量),ysdj(驗收單價)),后者的表結構為(bjbm(備件編碼),dqkcl(當前庫存量),dqkcje(當前庫存金額))觸發器如下:
create or replace trigger trig_ysd
after insert or update or delete on bj_ysd
for each row
declare rq1 varchar2(8);rq2 varchar2(8);
/*限于篇幅,yssl1,yssl2,ysdj1,ysdj2,bjbm1,bjbm2,ii聲明略*/
if inserting or updating then
rq1:=:new.rq;bjbm1:=:new.bjbm;yssl1:=:new.yssl;
ysdj1:=:new.ysdj;
select count(*) into ii from bj_dqkcb
where bjbm=bjbm1;
if ii=0 then
insert into bj_dqkcb(bjbm,dqkcl,dqkcje)
value(bjbm1,yssl1,ysdj1);
else
update bj_dqkcb
set dqkcl=dqkcl+yssl1;
dqkcje=dqkcje+yssl1*ysdj1;
end if
end if
if deleting or updating then
rq2:=:old.rq;
bjbm2:=:old.bjbm;
yssl2:=:old.yssl;
ysdj2:=:old.ysdj;
update bj_dqkcb
set dqkcb=dqkcl-yssl2;
dqkcje=dqkcje-yssl2*ysdj2
end if;
end ;