ORACLE
HOME > DB > ORACLE
2018.09.30 / 22:07

[SQLD] Á¦2Àå Æ®¸®°Å(Trigger)¶õ?

GAScripter
Ãßõ ¼ö 175

1. Æ®¸®°Å(Trigger)¶õ?






Æ®¸®°Å(Trigger)¶õ ¿µ¾î·Î ¹æ¾Æ¼è¶ó´Â ¶æÀε¥, ¹æ¾Æ¼è¸¦ ´ç±â¸é ±×·Î ÀÎÇØ Ãѱ⠳»ºÎ¿¡¼­ ¾Ë¾Æ¼­ ÀÏ·ÃÀÇ ÀÛ¾÷À» ½ÇÇàÇÏ°í ÃѾËÀÌ ³¯¾Æ°©´Ï´Ù. ÀÌó·³ µ¥ÀÌÅͺ£À̽º¿¡¼­µµ Æ®¸®°Å(Trigger)´Â Æ¯Á¤ Å×ÀÌºí¿¡ INSERT, DELETE, UPDATE °°Àº DML ¹®ÀÌ ¼öÇàµÇ¾úÀ» ¶§µ¥ÀÌÅͺ£À̽º¿¡¼­ ÀÚµ¿À¸·Î µ¿ÀÛÇϵµ·Ï ÀÛ¼ºµÈ ÇÁ·Î±×·¥ÀÔ´Ï´Ù. Áï! »ç¿ëÀÚ°¡ Á÷Á¢ È£ÃâÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó, µ¥ÀÌÅͺ£À̽º¿¡¼­ ÀÚµ¿ÀûÀ¸·Î È£ÃâÇÏ´Â °ÍÀÌ °¡Àå Å« Ư¡ÀÔ´Ï´Ù. 



Æ®¸®°Å(Trigger)´Â Å×À̺í°ú ºä µ¥ÀÌÅͺ£À̽º ÀÛ¾÷À» ´ë»óÀ¸·Î Á¤ÀÇÇÒ ¼ö ÀÖÀ¸¸ç, Àüü Æ®·£Àè¼Ç ÀÛ¾÷¿¡ ´ëÇØ ¹ß»ýµÇ´Â Æ®¸®°Å(Trigger)¿Í °¢Çà¿¡ ´ëÇØ ¹ß»ýµÇ´Â Æ®¸®°Å(Trigger)°¡ ÀÖ½À´Ï´Ù.





2. Æ®¸®°Å(Trigger)°¡ Àû¿ëµÇ´Â ¿¹


´ÙÀ½°ú °°Àº »óȲ¿¡¼­ Æ®¸®°Å(Trigger)¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ¾î¶² ¼îÇθô¿¡ ÇÏ·ç¿¡ ¼ö¸¸ °ÇÀÇ ÁÖ¹®ÀÌ µé¾î¿É´Ï´Ù. ÁÖ¹®µ¥ÀÌÅÍ´Â ÁÖ¹®ÀÏÀÚ, ÁÖ¹®»óÇ°, ¼ö·®, °¡°ÝÀÌ ÀÖÀ¸¸ç, ¼öõ¸íÀÇ ÀÓÁ÷¿øÀÌ ÀÏÀÚº°, »óÇ°º° ÃÑ ÆǸżö·®°ú ÃÑ ÆǸŰ¡°ÝÀ¸·Î ±¸¼ºµÈ ÁÖ¹® ½ÇÀûÀ» ½Ç½Ã°£À¸·Î ¿Â¶óÀÎ»ó¿¡ Á¶È¸¸¦ ÇßÀ» ¶§, ÇÑ»ç¶÷ÀÇ ÀÓÁ÷¿øÀÌ Á¶È¸ÇÒ ¶§¸¶´Ù ¼ö¸¸ °ÇÀÇ µ¥ÀÌÅ͸¦ ÀÐ°í °è»êÇؾßÇÕ´Ï´Ù. ¸¸¾à ÀÓÁ÷¿øÀÌ ¼ö¸¸¸íÀÌ°í, µ¥ÀÌÅÍ°¡ ¼ö¹é¸¸°ÇÀ̶ó¸é, ¶Ç °ÅÀÇ µ¿½Ã´Ù¹ßÀûÀ¸·Î ½Ç½Ã°£ Á¶È¸°¡ ¿äûµÈ´Ù¸é ½Ã½ºÅÛ ÆÛÆ÷¸Õ½º°¡ ¶³¾îÁú °ÍÀÔ´Ï´Ù.


µû¶ó¼­! Æ®¸®°Å(Trigger)¸¦ »ç¿ëÇÏ¿© ÁÖ¹®ÇÑ °ÇÀÌ ÀÔ·ÂµÉ ¶§¸¶´Ù, ÀÏÀÚº° »óÇ°º°·Î ÆǸżö·®°ú ÆǸűݾ×À» Áý°èÇÏ¿© Áý°èÀڷḦ º¸°üÇϵµ·Ï ¸¸µé¾îº¸°Ú½À´Ï´Ù. ¸ÕÀú °ü·ÃµÈ Å×À̺íÀ» »ý¼ºÇغ¸°Ú½À´Ï´Ù.





Å×À̺íÀº ´ÙÀ½°ú °°½À´Ï´Ù. ÁÖ¹®Á¤º¸Å×ÀÌºí¿¡ ½Ç½Ã°£À¸·Î µ¥ÀÌÅÍ°¡ ÀÔ·ÂµÉ ¶§¸¶´Ù Æ®¸®°Å°¡ ¹ßµ¿µÇ¾î ÀÚµ¿À¸·Î ÀÏÀÚº°ÆǸÅÁý°èÅ×ÀÌºí¿¡ ÀÏÀÚº°, »óÇ°º° ÆǸżö·®°ú ÆǸűݾ×À» °è»êÇØ ¾÷µ¥ÀÌÆ® ÇÏ´Â ÀÛ¾÷À» Çϵµ·Ï ÇÏ°í, »ç¿ëÀÚµéÀº ¹Ì¸® °è»êµÈ ÀÏÀÚº°ÆǸÅÁý°èÅ×À̺íÀ» Á¶È¸ÇÏ°Ô ÇÏ¿© ½Ç½Ã°£ Á¶È¸¸¦ Áö¿øÇÏ°Ô ÇÏ´Â °ÍÀÔ´Ï´Ù. 




3. Æ®¸®°Å(Trigger) ±¸Çö



ÀÚ, ÀÌÁ¦ 2°³ Å×À̺íÀ» CREATE, DDLÀ» ÅëÇØ ¸¸µé¾îº¸°Ú½À´Ï´Ù.


CREATE TABLE ORDER_LIST(

    ORDER_DATE  CHAR(8) NOT NULL,

    PRODUCT     VARCHAR2(10) NOT NULL,

    QTY         NUMBER NOT NULL,

    AMOUNT      NUMBER NOT NULL

);


CREATE TABLE SALES_PER_DATE(

    SALE_DATE   CHAR(8) NOT NULL,

    PRODUCT     VARCHAR2(10) NOT NULL,

    QTY         NUMBER NOT NULL,

    AMOUNT      NUMBER NOT NULL


);


SELECT *

FROM ORDER_LIST


SELECT *

FROM SALES_PER_DATE


Á¶È¸¸¦ Çغ¸¸é ´ÙÀ½°ú °°½À´Ï´Ù.



¾ÆÁ÷ 2°³ Å×À̺í´Ù µ¥ÀÌÅÍ°¡ ¾øÀ½À» È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù. 


ÀÌÁ¦ Æ®¸®°Å(Trigger)¸¦ ¸¸µé¾î º¸°Ú½À´Ï´Ù. Æ®¸®°Å(Trigger)¸¦ ±¸ÇöÇϱâ À§ÇØ ¿ì¼± ÀýÂ÷Çü SQL°ú PL/SQLÀ» ¾Ë¾Æ¾ßÇÕ´Ï´Ù. ÀýÂ÷Çü SQL°ú PL/SQLÀº µû·Î ±ÛÀ» ¿Ã¸®µµ·Ï ÇÏ°í, ¿À´ÃÀº ÀýÂ÷Çü SQL°ú PL/SQLÀ» ¾È´Ù´Â ÀüÁ¦ÇÏ¿¡ Æ®¸®°Å(Trigger)¸¦ ±¸ÇöÇغ¸°Ú½À´Ï´Ù.






Æ®¸®°Å(Trigger) ó¸® ÀýÂ÷¸¦ ¼³¸íÇÏ¸é ´ÙÀ½°ú °°½À´Ï´Ù.


8 ~ 14 Line 


Trigger¸¦ ¼±¾ðÇÕ´Ï´Ù. 

order_list Å×ÀÌºí¿¡ insert°¡ ¹ß»ýÇÏ¸é ±× ÀÌÈÄ each row Áï °¢ Çà¿¡ ÇØ´ç Æ®¸®°Å(Trigger)¸¦ Àû¿ëÇÑ´Ù¶ó´Â ¶æÀÔ´Ï´Ù. ¶ÇÇÑ, declare ¼±¾ð¹®¿¡´Â º¯¼ö¸¦ ¼±¾ðÇÕ´Ï´Ù. order_list Å×ÀÌºí¿¡ ÀÖ´Â order_date, product Type¿¡ ¸Â°Ô o_date, o_prod º¯¼ö¸¦ ¼±¾ðÇÕ´Ï´Ù.


15 ~17 Line


new ´Â Æ®¸®°Å(Trigger)¿¡¼­ »ç¿ëÇÏ´Â ±¸Á¶Ã¼ ÀÔ´Ï´Ù. new´Â »õ·Î ÀÔ·ÂµÈ ·¹ÄÚµå °ªÀ» ´ã°í ÀÖ½À´Ï´Ù.

o_date ¿¡ »õ·Î µé¾î¿Â order_date °ªÀ» , o_prod ¿¡ »õ·Î µé¾î¿Â product °ªÀ» ÀúÀåÇÕ´Ï´Ù.


18 ~ 26 Line


sales_per_date Å×ÀÌºí¿¡ update ±¸¹®À» ½ÇÇàÇϴµ¥, ±âÁ¸¿¡ ÀÖ´Â qty, amount ¸¦ ´©ÀûÇÕÇؼ­ ´Ù½Ã Set ÇÕ´Ï´Ù. ¿©±â¼­ where¹®À» ÅëÇØ ÇöÀç »õ·Î µé¾î¿Â ³¯Â¥°ú »óÇ°ÀÌ ÀÏÄ¡ÇÏ´Â µ¥ÀÌÅ͸¸ ÇØ´ç update¹®À» ½ÇÇàÇϵµ·Ï Á¶°ÇÀ» °É¾ú½À´Ï´Ù. 

¶ÇÇÑ ¸¸¾à ÇØ´ç Á¶°Ç¿¡ ¸ðµÎ ÇØ´çµÇÁö ¾Ê´Â´Ù¸é, if sql%notfound ±¸¹®ÀÌ ½ÇÇàµË´Ï´Ù. ±âÁ¸¿¡ ÀÖ´ø ·¹ÄÚµå °ªÀÌ ¾Æ´Ï°í ÀüÇô »õ·Î¿î ·¹ÄÚµåÀ̱⠶§¹®¿¡ insert ±¸¹®À» ÅëÇØ »õ·Î µé¾î¿Â µ¥ÀÌÅ͸¦ »õ·Î »ðÀÔÇÕ´Ï´Ù. 

³¡À¸·Î / ºÎºÐÀº Æ®¸®°Å(Trigger)¸¦ ½ÇÇàÇÏ´Â ½ÇÇà¸í·É¾îÀÔ´Ï´Ù.




À§ ±¸¹®À» ½ÇÇàÇϸé, ÀÌÁ¦ 2°³ Å×ÀÌºí¿¡ Æ®¸®°Å(Trigger)°¡ Àû¿ëµÈ °ÍÀÔ´Ï´Ù. 


ÀÌÁ¦ order_list Å×ÀÌºí¿¡ ·¹Äڵ带 insert Çؼ­ sales_per_date Å×ÀÌºí¿¡ Æ®¸®°Å(Trigger)°¡ ÀÚµ¿À¸·Î µ¿ÀÛÇÏ¿©, µ¥ÀÌÅÍ °ªÀ» ÀÚµ¿À¸·Î °è»êÇÏ°í ¹Ý¿µÇÏ´ÂÁö È®ÀÎÇغ¸°Ú½À´Ï´Ù!


ORDER_LIST Å×ÀÌºí¿¡ ¾Æ·¡¿Í °°ÀÌ µ¥ÀÌÅÍ °ªÀ» »ðÀÔÇغ¸°Ú½À´Ï´Ù.


-> INSERT INTO ORDER_LIST VALUES('20120901','MONOPACK',10,300000)


»ðÀÔÈÄ ORDER_LIST, SALES_PER_DATE Å×À̺í Á¶È¸¸¦ Çغ¸°Ú½À´Ï´Ù.


ORDER_LIST Á¤»óÀûÀ¸·Î °ªÀÌ »ðÀԵǾú½À´Ï´Ù.




Æ®¸®°Å¿¡ ÀÇÇؼ­ SALES_PER_DATE ¿¡µµ Á¤»óÀûÀ¸·Î °ªÀÌ »ðÀԵǾîÀÖ½À´Ï´Ù.





ÀÚ. ´Ù½ÃÇѹø °ªÀ» »ðÀÔÇÏ°í Å×À̺íÀ» È®ÀÎÇغ¸°Ú½À´Ï´Ù.


-> INSERT INTO ORDER_LIST VALUES('20120901','MONOPACK',20,600000);



ORDER_LIST ¸¦ Á¶È¸Çϸé Áö±Ý±îÁö »ðÀÔÇÑ °ªµéÀÌ ¸®½ºÆ®·Î ÀÖ½À´Ï´Ù.




SALES_PER_DATE Å×À̺íÀº Æ®¸®°Å¿¡ ÀÇÇؼ­ ÁÖ¹®³¯Â¥º° »óÇ°º° ¹°·®°ú °¡°ÝÀÌ ÇÕ»êµÇ¾î ¾÷µ¥ÀÌÆ® µÇ¾îÀÖÀ½À» È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù.






4. Æ®¸®°Å(Trigger)¿Í Æ®·£Àè¼Ç(Transaction)ÀÇ »ó°ü°ü°è



À̹ø¿¡´Â ´Ù¸¥ »óÇ°À¸·Î ÁÖ¹® µ¥ÀÌÅ͸¦ ÀÔ·ÂÇÑ ÈÄ µÎ Å×À̺íÀÇ °á°ú¸¦ Á¶È¸Çغ¸°í Æ®·£Àè¼ÇÀ» ROLLBACK Çغ¸°Ú½À´Ï´Ù. ÆǸŠµ¥ÀÌÅÍÀÇ ÀÔ·ÂÃë¼Ò°¡ ÀϾ¸é, ÁÖ¹® Á¤º¸ Å×À̺í(ORDER_LIST)°ú ÆǸŠÁý°èÅ×À̺í(SALES_PER_DATE )¿¡ µ¿½Ã¿¡ ÀÔ·Â(¼öÁ¤) Ãë¼Ò°¡ ÀϾ´ÂÁö È®ÀÎÇغ¸±â À§ÇÔÀÔ´Ï´Ù.



-> INSERT INTO ORDER_LIST VALUES('20120901','MULTIPACK',10,300000);


ORDER_LIST ¿¡ Á¤»óÀûÀ¸·Î ÆǸŠµ¥ÀÌÅÍ°¡ »ðÀԵǾú½À´Ï´Ù. 




SALES_PER_DATE Å×À̺íÀº Æ®¸®°Å¿¡ ÀÇÇØ ÆǸų¯Â¥º°, »óÇ°º° ´©Àû ¹°·®°ú °¡°ÝÀÌ ¾÷µ¥ÀÌÆ® µÇ¾ú½À´Ï´Ù.




ÀÌÁ¦ ROLLBACK; ¸í·É¾î¸¦ ½ÇÇàÇغ¸°Ú½À´Ï´Ù. 


ORDER_LIST Å×ÀÌºí¿¡ ¹æ±Ý »ðÀÔÇÑ ÆǸŵ¥ÀÌÅÍ°¡ Ãë¼ÒµÇ¾ú½À´Ï´Ù.



SALES_PER_DATE Å×ÀÌºí¿¡µµ ¶È°°ÀÌ Æ®¸®°Å·Î ÀÔ·ÂµÈ µ¥ÀÌÅÍ Á¤º¸±îÁö ÇϳªÀÇ Æ®·£Àè¼ÇÀ¸·Î ÀνÄÇÏ¿© ÀÔ·Â Ãë¼Ò°¡ µÇ¾ú½À´Ï´Ù. 





Áï, Æ®¸®°Å´Â µ¥ÀÌÅͺ£À̽º¿¡ ÀÇÇØ ÀÚµ¿ È£ÃâµÇÁö¸¸ °á±¹ INSERT, UPDATE, DELETE ±¸¹®°ú ÇϳªÀÇ Æ®·£Àè¼Ç ¾È¿¡¼­ ÀϾ´Â ÀÏ·ÃÀÇ ÀÛ¾÷µéÀ̶ó ÇÒ ¼ö ÀÖ½À´Ï´Ù. 


(Ãß°¡·Î Æ®¸®°Å´Â Begin ~ End Àý¿¡¼­ COMMIT , ROLLBACK À» »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù.)



À̹ø½Ã°£¿¡´Â Æ®¸®°Å¿¡ ´ëÇØ ¹è¿ü½À´Ï´Ù. Æ®¸®°Å´Â µ¥ÀÌÅͺ£À̽º º¸¾ÈÀÇ Àû¿ë, À¯È¿ÇÏÁö ¾ÊÀº Æ®·£Àè¼ÇÀÇ ¿¹¹æ, ¾÷¹« ±ÔÄ¢ ÀÚµ¿ Àû¿ë µî¿¡ »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù.