ÉèΪÊ×Ò³ ¼ÓÈëÊÕ²Ø

TOP

oracle trigger (´¥·¢Æ÷)(Ò»)
2014-11-24 02:47:23 À´Ô´: ×÷Õß: ¡¾´ó ÖРС¡¿ ä¯ÀÀ:1´Î
Tags£ºoracle trigger ´¥·¢Æ÷

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 Óï¾ä´¥·¢Æ÷

*/

--´¥·¢Æ÷

Ê×Ò³ ÉÏÒ»Ò³ 1 2 3 ÏÂÒ»Ò³ βҳ 1/3/3
¡¾´ó ÖРС¡¿¡¾´òÓ¡¡¿ ¡¾·±Ìå¡¿¡¾Í¶¸å¡¿¡¾Êղء¿ ¡¾ÍƼö¡¿¡¾¾Ù±¨¡¿¡¾ÆÀÂÛ¡¿ ¡¾¹Ø±Õ¡¿ ¡¾·µ»Ø¶¥²¿¡¿
·ÖÏíµ½: 
ÉÏһƪ£ºSQLµãµÎ18¨DSqlServerÖеÄmerge².. ÏÂһƪ£ºsql2005 Êý¾Ý¿âתΪsql 2000Êý¾Ý..

ÆÀÂÛ

ÕÊ¡¡¡¡ºÅ: ÃÜÂë: (ÐÂÓû§×¢²á)
Ñé Ö¤ Âë:
±í¡¡¡¡Çé:
ÄÚ¡¡¡¡ÈÝ: