Sql´úÂë
--´¥·¢Æ÷trigger
--1.DML´¥·¢Æ÷ DML statements (DELETE, INSERT, UPDATE)
/*
¶ÔÓÚÒ»Ìõdml sql£¬¿ÉÄÜ×÷ÓÃÓë¶àÐУ¬Ò²¿ÉÄÜÖ»ÓÐÒ»ÐС£Óï¾ä´¥·¢Æ÷¶ÔÿÌõ´¥·¢sql£¬´¥·¢Æ÷Ö»Ö´ÐÐÒ»´Î£»Ðм¶´¥·¢Æ÷ÊÇÿ×÷ÓÃÒ»Ðоʹ¥·¢Ò»´Î
´¥·¢Æ÷¡£
DML´¥·¢Æ÷¶¨Ò壺
CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE |AFTER} --´¥·¢Ê±»ú £¬dml sqlÓï¾äǰ»òºó
{INSERT | UPDATE | DELETE]--´¥·¢Ê¼þ£¬Ôö£¬É¾£¬¸Ä»ò3ÕßµÄÈÎÒâ×éºÏ
ON table_name --˵×÷ÓÃµÄ±í£¬Ò»¸ö´¥·¢Æ÷Ö»ÄÜ×÷ÓÃÓëÒ»¸ö±í£¬Ò»¸ö±í¿ÉÒÔÓжà¸ö´¥·¢Æ÷£¬µ«ÊÇ´¥·¢Æ÷Ô½¶à£¬¶ÔdmlЧÂÊÓÐÓ°Ïì
[REFERENCIING OLD AS old NEW AS new] --¸üÐÂÊý¾Ý£¬¶ÔоÉÊý¾ÝÒýÓñäÁ¿µÄÉèÖã¬Ê¹ÓýÏÉÙ
[FOR EACH ROW] --ÊÇ·ñÖ¸¶¨ÎªÐм¶´¥·¢Æ÷
[WHEN ...]--Ö¸¶¨Âú×ãÌØ¶¨Ìõ¼þʱ£¬´¥·¢Æ÷body²Å»áÖ´ÐÐ
[DECLARE...]--ÉùÃ÷¿é
BEGIN
--¿ÉÖ´Ðпé
--ÕâÀï²»ÒªÓÐÕë¶ÔÉÏÃæonµÄ±íµÄDML SQL£¬ÕâÑù»áÔì³ÉµÝ¹é´¥·¢£¬ÎÞÏÞÑ»·ÏÂÈ¥
...executable statements...
END [trigger_name];
*/
--Óï¾ä´¥·¢Æ÷statement-level trigger ÔÚ±íÉÏÕë¶ÔijÖÖDML²Ù×÷½¨Á¢ÁËÓï¾ä´¥·¢Æ÷ Ä¿±êÊÇÕû¸ö±í
CREATE OR REPLACE TRIGGER emp_t_1
BEFORE INSERT OR UPDATE OR DELETE ON EMP
BEGIN
CASE--ÅжÏʲôÀàÐ͵Ĵ¥·¢Æ÷
WHEN INSERTING THEN
dbms_output.put_line('emp_t_1 insert triggerd');
WHEN UPDATING THEN
dbms_output.put_line('emp_t_1 update triggerd');
WHEN DELETING THEN
dbms_output.put_line('emp_t_1 delete triggerd');
END CASE;
END;
--Ö´ÐÐÏÂÃæµÄupdateÓï¾ä£¬ÉÏÃæµÄ´¥·¢Æ÷»á±»´¦·£
update emp set sal = sal*1 where empno=7788;
--after Óï¾ä´¥·¢Æ÷
/*
exp£ºÍ³¼ÆÒ»¸ö±íµÄDML²Ù×÷´ÎÊý£¬DML²Ù×÷·¢Éúºó£¬after´¥·¢Æ÷½«´ÎÊý+1
*/
--´´½¨Í³¼Æ±í
CREATE TABLE count_dml(
id int,table_name varchar2(30),nums int,dt date
);
CREATE OR REPLACE TRIGGER emp_t_2
AFTER INSERT OR UPDATE OR DELETE ON EMP
DECLARE
v_count int;--ÉùÃ÷Ò»¸ö¼Ç¼ÉϴεıäÁ¿
BEGIN
select nums into v_count from count_dml where lower(table_name)='emp';--»áÓÐNO_DATA_FOUNDÒì³£
IF v_count = 0 THEN--Èç¹ûÕâ¸ö±íÖл¹Ã»ÓÐÕâ¸ö±íËù¶ÔÓ¦µÄ¼Ç¼£¬¾ÍÐÂÌí¼ÓÒ»¸ö
insert into count_dml values(1,'emp',0,sysdate);
END IF;
update count_dml set nums=(v_count+1) where lower(table_name)='emp';
dbms_output.put_line(v_count+1);
END;
update emp set sal = sal*1 where empno=7788;
commit;
--Ðм¶´¥·¢Æ÷,´´½¨Óï¾äÖмÓÈëFOR EACH ROW
CREATE OR REPLACE TRIGGER emp_t_3
BEFORE UPDATE ON emp FOR EACH ROW --for each row ¶¨ÒåΪÐм¶´¥·¢Æ÷£¬dml sqlÓï¾äÓжàÉÙÐÐÊÜÓ°Ïì¸Ã´¥·¢Æ÷¾ÍÖ´ÐжàÉÙ´Î
BEGIN
/*
ÔÚÐм¶´¥·¢Æ÷¿éÖÐ ¿ÉÒÔÓÃ:new.columName ÒýÓÃÐÂÊý¾ÝµÄÁÐÖµ
:old.columName ÒýÓþÉÊý¾ÝµÄÁÐÖµ
¶ÔÓÚ²»Í¬ÀàÐ͵Ĵ¥·¢Æ÷newºÍold¿ÉÄÜ´úÌæ²»Í¬µÄÄÚÈÝ
insert£ºÖ»ÓÐnew£¬Ã»ÓÐold .old is null
update£ºoldºÍnew¾Í¶¼ÓÐÁË
delete£ºÖ»ÓÐold ûÓÐnew
*/
dbms_output.put_line(:new.sal||'--'||:old.sal);
END;
--Ö´ÐÐÏÂÃæµÄsql£¬ÉÏÃæ¶¨ÒåµÄ´¥·¢Æ÷»á´¥·¢3´Î
update emp set sal = sal*1.1 where emp.deptno=10; --3 rows affects
--·ûºÏÒ»¶¨Ìõ¼þ²ÅÖ´Ðд¥·¢Æ÷Óï¾ä £¬Ê¹ÓÃWHEN Óï¾äÏÞ¶¨
CREATE OR REPLACE TRIGGER emp_t_4
BEFORE UPDATE ON emp
-- oldºÍnewÊÇÒýÓÃоÉÊý¾ÝµÄĬÈÏÖµ£¬ÕâÀï¿ÉÒÔÃ÷È·Ö¸¶¨
REFERENCING OLD AS emp_old NEW AS emp_new
FOR EACH ROW
--WHEN Óï¾äÏÞÖÆÖ»ÓÐempno=7788£¬µÄ²ÅÖ´Ðиô¥·¢Æ÷£¬ÔÚwhenÓï¾äÖÐÒýÓÃÁÐֵʱ Ç°Ãæ²»ÓüÓ':';
WHEN (emp_new.empno=7788)
BEGIN
dbms_output.put_line(:emp_new.ename||'--'||:emp_old.empno);
END;
--´¥·¢´¥·¢Æ÷£¬Ö»ÓÐ7788µÄÖ´ÐÐÉÏÃæµÄÓï¾ä
update emp set sal = sal*1.1 where emp.deptno=20;
/**newºÍold¿ÉÒÔʹÓÃÓÚbeforeºÍafter´¥·¢Æ÷¡£before´¥·¢Æ÷¿ÉÒÔÐÞ¸ÄnewÖеÄÁÐÖµ£¬µ«ÊÇÔÚafterÖв»ÐУ¬
ÒòΪtriggerÔÚÖеÄsqlÒѾִÐÐÍê±Ï£¬ÉúЧÁË¡£Èç¹ûbeforeÖÐÐÞ¸ÄÁËnewÖеÄÁÐÖµ£¬ÔÚafterÖÐÊÇ¿ÉÒÔ¿´µ½µÄ¡£
Óï¾ä´¥·¢Æ÷ £¨statement-level trigger£©ºÍ Ðм¶´¥·¢Æ÷£¨row-level trigger£©µÄÖ´ÐÐ˳Ðò£º
µ±È»Ë³ÐòÕûÌåÉÏÊÇÏÈBEFOREÀàÐ͵Ĵ¥·¢Æ÷Ö´ÐУ¬ºóAFTERÀàÐ͵ÄÖ´ÐС£
Èç¹ûÒ»¸ö±íÖÐÿÖÖ´¥·¢Æ÷¶¼³öÏÖ Ö´ÐÐ˳Ðò
BEFORE Óï¾ä´¥·¢Æ÷
BEFORE Ðм¶´¥·¢Æ÷
AFTER Ðм¶´¥·¢Æ÷
...¶à¸öÐÐÊÜÓ°Ï죬Ðм¶´¥·¢Æ÷Ö´Ðжà´Î
AFTER Óï¾ä´¥·¢Æ÷
*/
--´¥·¢Æ÷