mysql Æ®¸®°Å »ç¿ëÇϱâ
18.3. Æ®¸®°Å »ç¿ëÇϱâ
Æ®¸®°Å¿¡ ´ëÇÑ Áö¿øÀº MySQL 5.0.2¿¡¼ºÎÅÍ Æ÷ÇԵȴÙ. ÀÌ ¼½¼Ç¿¡¼´Â Æ®¸®°Å¸¦ ¾î¶»°Ô »ç¿ëÇÏ´ÂÁö ±×¸®°í Æ®¸®°Å¸¦ »ç¿ëÇϴµ¥ ÀÖ¾î¼ ¾î¶² Á¦¾à »çÇ×ÀÌ ÀÖ´ÂÁö¿¡ ´ëÇØ ¼³¸íÇϱâ·Î ÇÑ´Ù. Æ®¸®°ÅÀÇ Á¦¾à »çÇ׿¡ ´ëÇÑ Ãß°¡ÀûÀÌ ³»¿ëÀº Section I.1, "½ºÅä¾îµå ·çƾ°ú Æ®¸®°Å»óÀÇ Á¦¾à »çÇ×"¿¡¼ Á¦°øÇϱâ·Î ÇÑ´Ù.
Æ®¸®°Å´Â Å×À̺í°ú ¿¬°üµÈ À̸§ÀÌ ÀÖ´Â µ¥ÀÌÅÍ º£À̽º ¿ÀºêÁ§Æ®À̸ç, Å×ÀÌºí¿¡ ´ëÇØ Æ¯Á¤ À̺¥Æ®°¡ ¹ß»ýÇϸé È°¼ºÈµÈ´Ù. ¾î¶² Æ®¸®°Å´Â Å×ÀÌºí ¾ÈÀ¸·Î »ðÀÔÇÏ°íÀÚ ÇÏ´Â °ªÀ» °Ë»çÇÏ´Â ±â´ÉÀ» ¼öÇàÇϰųª ¶Ç´Â ¾÷µ¥ÀÌÆ®¿¡¼ È£ÃâÇÑ °ªÀ» °è»êÇÏ´Â ±â´ÉÀ» ¼öÇàÇÑ´Ù.
Æ®¸®°Å´Â Å×À̺í°ú °ü·ÃÀÌ ÀÖ°í, Å×ÀÌºí¿¡ ´ëÇÑ INSERT, DELETE ¶Ç´Â UPDATE¸í·É¹®ÀÌ ½ÇÇàµÉ ¶§¿¡ È°¼ºÈ°¡ Á¤ÀǵȴÙ. Æ®¸®°Å´Â À̸¦ ½ÇÇàÇÏ´Â ¸í·É¹®ÀÇ ¾Õ¿¡¼ ¶Ç´Â µÚ¿¡¼ È°¼ºÈ µÇµµ·Ï ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¸é, Æ®¸®°Å°¡ Å×ÀÌºí¿¡¼ »èÁ¦µÇ´Â °¢ ÁÙ(row)Àü¿¡ È°¼ºÈ µÇµµ·Ï ÇÒ ¼ö Àְųª ¶Ç´Â °¢ ÁÙÀÌ ¾÷µ¥ÀÌÆ®µÈ ÈÄ¿¡ È°¼ºÈ µÇµµ·Ï ÇÒ ¼öµµ ÀÖ´Ù.
Æ®¸®°Å¸¦ »ý¼º ¶Ç´Â µå·Ó ½ÃÅ°±â À§Çؼ´Â, CREATE TRIGGER ¶Ç´Â DROP TRIGGER ¸í·É¹®À» »ç¿ëÇÑ´Ù. ÀÌ·¯ÇÑ ¸í·É¹®¿¡ ´ëÇÑ ½ÅÅؽº´Â Section 18.1, "CREATE TRIGGER ½ÅÅؽº", ¹×Section 18.2, "DROP TRIGGER ½ÅÅؽº"¿¡¼ ¼³¸íÇÏ¿´´Ù.
INSERT¸í·É¹®¿¡ ´ëÇÑ Å×À̺íÀ» °®´Â Æ®¸®°Å¿Í °ü·ÃµÈ °£´ÜÇÑ ¿¹¹®À» º¸¿©ÁÖ±â·Î ÇÑ´Ù. ÀÌ°ÍÀº Å×À̺íÀÇ Ä÷³ Áß¿¡ Çϳª¿¡ »ðÀÔµÈ °ªÀ» ´õÇÏ´Â ¿¬»êÀÚÀÇ ¿ªÇÒÀ» ÇÑ´Ù.
¾Æ·¡ÀÇ ¸í·É¹®Àº Å×À̺íÀ» »ý¼ºÇÏ°í ÀÌ¿¡ ÇØ´çÇÏ´Â Æ®¸®°Å¸¦ ¸¸µé°Ô µÈ´Ù:
mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
-> FOR EACH ROW SET @sum = @sum + NEW.amount;
CREATE TRIGGER ¸í·É¹®Àº ins_sumÀ̶ó´Â À̸§ÀÇ Æ®¸®°Å¸¦ »ý¼ºÇϸç ÀÌ°ÍÀº account¶ó´Â Å×À̺í°ú ¿¬°üµÈ´Ù. ÀÌ°ÍÀº ¶ÇÇÑ Æ®¸®°ÅÀÇ µ¿ÀÛ ½Ã°£, Æ®¸®°ÅÇÏ´Â À̺¥Æ®, ±×¸®°í Æ®¸®°Å¸¦ È°¼ºÈ ÇÏ¸é¼ ÇØ¾ß ÇÒ ÀϵéÀ» ÁöÁ¤ÇÑ´Ù:
- Å°¿öµå BEFORE´Â Æ®¸®°Å ½ÇÇà ½Ã°£À» °¡¸®Å²´Ù. ÀÌ¿Í °°Àº °æ¿ì, Æ®¸®°Å´Â °¢ ÁÙÀÌ Å×ÀÌºí¿¡ »ðÀԵDZâ Àü¿¡ ½ÇÇàµÇ¾î¾ß ÇÑ´Ù. ´Ù¸¥ »ç¿ë °¡´ÉÇÑ Å°¿öµå´Â AFTERÀÌ´Ù.
- Å°¿öµå INSERT´Â Æ®¸®°Å¸¦ ½ÇÇà½ÃÅ°´Â À̺¥Æ®¸¦ °¡¸®Å²´Ù. ¿¹¸¦ µé¸é, INSERT ¸í·É¹®Àº Æ®¸®°Å ½ÇÇàÀ» ÀÏÀ¸Å²´Ù. ¿©·¯ºÐÀº ¶ÇÇÑ DELETE ¿Í UPDATE ¸í·É¹®À» À§ÇÑ Æ®¸®°Åµµ »ý¼ºÇÒ ¼ö°¡ ÀÖ´Ù.
- FOR EACH ROW¿¡ µû¶ó¿À´Â ¸í·É¹®Àº Æ®¸®°Å ½ÇÇàÀ» ÀÏÀ¸Å°´Â ¸í·É¹®À» Á¤ÀÇÇϴµ¥,Æ®¸®°Å¸¦ ÇÏ´Â ¸í·É¹®¿¡ ÀÇÇØ ¿µÇâÀ» ¹Þ´Â °¢ ÁÙ¿¡ Çѹø¾¿ ¹ß»ýÇÏ°Ô µÈ´Ù. ¿¹¹®¿¡¼ º¸¸é, Æ®¸®°Å°¡ µÈ ¸í·É¹®Àº amount Ä÷³ ¾ÈÀ¸·Î »ðÀԵǴ °ªÀ» ÇÕÇÏ´Â ´Ü¼øÇÑ SETÀÌ µÈ´Ù. ±× ¸í·É¹®Àº "»õ·Î¿î ÁÙ ¼ÓÀ¸·Î »ðÀԵǾîÁö´Â amount Ä÷³ÀÇ °ª"À» ÀǹÌÇÏ´ÂNEW.amount ÀÇ ÇüÅ·ΠÄ÷³À» ÂüÁ¶ÇÏ°í ÀÖ´Ù.
Æ®¸®°Å¸¦ »ç¿ëÇϱâ À§Çؼ´Â, ´©»ê±â º¯¼ö¸¦ 0À¸·Î ¼³Á¤ÇÏ°í, INSERT ¸í·É¹®À» ½ÇÇàÇÏ°í, ±× ´ÙÀ½¿¡´Â º¯¼öÀÇ °ªÀÌ ¾î¶»°Ô ³ª¿À´ÂÁö º¸ÀÚ:
mysql> SET @sum = 0;
mysql> INSERT INTO account VALUES(137,14.98),(141,1937.50),(97,-100.00);
mysql> SELECT @sum AS 'Total amount inserted';
+-----------------------+
| Total amount inserted |
+-----------------------+
| 1852.48 |
+-----------------------+
ÀÌ¿Í °°Àº °æ¿ì, INSERT¸í·É¹®ÀÌ ½ÇÇàµÈ ´ÙÀ½¿¡ ³ª¿À´Â @sum ÀÇ °ªÀº 14.98 + 1937.50 - 100, or 1852.48ÀÌ µÈ´Ù.
Æ®¸®°Å¸¦ ¾ø¾Ö±â À§Çؼ´Â, DROP TRIGGER ¸í·É¹®À» »ç¿ëÇÑ´Ù. ¸¸ÀÏ Æ®¸®°Å°¡ µðÆúÆ® ½ºÅ°¸¶¿¡ ÀÖÁö ¾ÊÀ¸¸é, ½ºÅ°¸¶ÀÇ À̸§À» Á¤È®È÷ ÁöÁ¤ÇØ¾ß ÇÑ´Ù.:
mysql> DROP TRIGGER test.ins_sum;
Æ®¸®°ÅÀÇ À̸§Àº ½ºÅ°¸¶ À̸§¶õ¿¡ Á¸ÀçÇØ¾ß ÇÏ°í, ÀÌ°ÍÀº ÇϳªÀÇ ½ºÅ°¸¶¿¡ ÀÖ´Â Æ®¸®°ÅµéÀº ¼·Î ´Ù¸¥ À̸§À» °¡Á®¾ß ÇÔÀ» ÀǹÌÇÑ´Ù. ¼·Î ´Ù¸¥ ½ºÅ°¸¶¿¡ ÀÖ´Â Æ®¸®°ÅµéÀº °°Àº À̸§À» °¡Á®µµ µÈ´Ù..
Æ®¸®°Å°¡ ÇϳªÀÇ ½ºÅ°¸¶¿¡ ´ëÇØ Áߺ¹µÇÁö ¾Ê´Â À̸§À» °¡Á®¾ß ÇÑ´Ù´Â Á¶°Ç¿¡ ÀÌ¿Ü¿¡µµ, Æ®¸®°Å¸¦ »ý¼ºÇϴµ¥ ÀÖ¾î¼ ¸î °¡Áö ´Ù¸¥ Á¦¾à »çÇ×µµ ÀÖ´Ù. ƯÈ÷, ÇϳªÀÇ Å×ÀÌºí¿¡´Â µ¿ÀÏÇÑ È°¼ºÈ ½Ã°£ ¹× À̺¥Æ®¸¦ °®´Â µÎ °³ÀÇ Æ®¸®°Å¸¦ °¡Áú ¼ö ¾ø´Ù. ¿¹¸¦ µé¸é, ÇϳªÀÇ Å×ÀÌºí¿¡ ´ëÇØ µÎ °³ÀÇ BEFORE INSERT Æ®¸®°Å ¶Ç´Â µÎ °³ÀÇ AFTER UPDATE Æ®¸®°Å¸¦ °¡Áú ¼ö ¾ø´Ù. ÀÌ°ÍÀº ±×´ÙÁö Áß¿äÇÏÁö ¾ÊÀº Á¦¾à »çÇ×Àε¥, ±× ÀÌÀ¯´Â FOR EACH ROW ´ÙÀ½¿¡BEGIN ... END º¹ÇÕ ¸í·É¹® ±¸¼ºÀ» »ç¿ëÇؼ ´ÙÁß ¸í·É¹®À» ½ÇÇàÇÏ´Â Æ®¸®°Å¸¦ Á¤ÀÇÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù. (ÇϳªÀÇ ¿¹¹®ÀÌ ÀÌ ¼½¼Ç ÈĹݺο¡ ÀÖ´Ù.)
OLD ¿Í NEW Å°¿öµå¸¦ »ç¿ëÇؼ Æ®¸®°Å¿¡ ÀÇÇØ ¿µÇâÀ» ¹Þ´Â ÁÙ¿¡ ÀÖ´Â Ä÷³À» È°¼ºÈ ½Ãų ¼ö ÀÖ´Ù. (OLD ¿Í NEW ´Â ´ë¼Ò¹®ÀÚ ±¸ºÐÀ» ÇÏÁö ¾ÊÀ½.) INSERT Æ®¸®°Å¿¡´Â, NEW.col_name ¸¸À» »ç¿ëÇÒ ¼ö ÀÖ´Ù; ¿©±â¿¡´Â ÀÌÀü ÁÙ(old row)ÀÌ ¾ø´Ù. DELETE Æ®¸®°Å¿¡´Â, OLD.col_name¸¸À» »ç¿ëÇÒ ¼ö ÀÖ´Ù; ¿©±â¿¡´Â »õ·Î¿î ÁÙ(new row)ÀÌ ¾ø´Ù. UPDATE Æ®¸®°Å¿¡´Â, ÁÙ(row)ÀÌ ¾÷µ¥ÀÌÆ®µÇ±â Àü¿¡ ±× ÁÙ¿¡ ÀÖ´Â Ä÷³À» ÂüÁ¶Çϵµ·Ï OLD.col_name À» »ç¿ëÇÒ ¼ö ÀÖÀ¸¸ç, ÁÙÀÌ ¾÷µ¥ÀÌÆ®µÈ ÈÄ¿¡ ±× ÁÙ¿¡ ÀÖ´Â Ä÷³À» ÂüÁ¶Çϵµ·Ï NEW.col_name À» »ç¿ëÇÒ ¼ö ÀÖ´Ù.
OLD ·Î Ç¥½ÃµÈ Ä÷³Àº Àбâ Àü¿ë(read-only)ÀÌ´Ù. ¸¸ÀÏ SELECT±ÇÇÑÀÌ ÀÖ´Ù¸é ÀÌ°ÍÀ» ÂüÁ¶ÇÒ ¼ö´Â ÀÖÀ¸³ª, ¼öÁ¤ÇÒ ¼ö´Â ¾ø´Ù. NEW·Î Ç¥½ÃµÈ Ä÷³Àº, SELECT±ÇÇÑÀÌ ÀÖ´Ù¸é, ÂüÁ¶µÉ ¼ö ÀÖ´Ù. BEFORE Æ®¸®°Å¿¡ À־Â, ÀÌ°Í¿¡ ´ëÇÑ UPDATE±ÇÇÑÀÌ ÀÖ´Â °æ¿ì¿¡´Â SET NEW.col_name = value À» °¡Áö°í ±× °ªÀ» º¯°æÇÒ ¼ö ÀÖ´Ù. ÀÌ°ÍÀº Æ®¸®°Å¸¦ »ç¿ëÇؼ »õ·Î¿î ÁÙ¿¡ »ðÀ﵃ °ªÀ» ¼öÁ¤ÇÒ ¼ö Àְųª ¶Ç´Â ÁÙÀ» ¾÷µ¥ÀÌÆ®ÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù.
BEFORE Æ®¸®°Å¿¡ À־Â, AUTO_INCREMENT Ä÷³¿¡ ´ëÇÑ NEWÀÇ °ªÀº 0ÀÌ µÇ¸ç, ÀÌ °ªÀº ½ÇÁ¦·Î »õ·Î¿î ±â·ÏÀÌ »ðÀ﵃ ¶§ ³ª¿À°Ô µÇ´Â ÀÚµ¿ »ý¼º ½ÃÄö½º ¼ýÀÚ´Â ¾Æ´Ï´Ù.
OLD ¿Í NEW ´Â Æ®¸®°Å¿¡ ´ëÇÑ MySQLÀÇ È®Àå ±â´ÉÀÌ´Ù.
BEGIN ... END ¸í·É¹® ±¸¼ºÀ» »ç¿ëÇؼ, ´ÙÁß ¸í·É¹®À» ½ÇÇàÇÏ´Â Æ®¸®°Å¸¦ Á¤ÀÇÇÒ ¼ö ÀÖ´Ù.BEGIN ºí·Ï ¾È¿¡¼´Â, Á¶°Ç¹®°ú ·çÇÁ °°Àº ½ºÅä¾îµå ·çƾ ¾È¿¡¼ »ç¿ë °¡´ÉÇÑ ´Ù¸¥ ½ÅÅؽº¸¦ »ç¿ëÇÒ ¼öµµ ÀÖ´Ù. ÇÏÁö¸¸, ½ºÅä¾îµå ·çƾ¿¡ ´ëÇÑ °Í°ú ¸¶Âù°¡Áö·Î, mysql ÇÁ·Î±×·¥À» »ç¿ëÇؼ ´ÙÁß ¸í·É¹®À» ½ÇÇàÇÏ´Â Æ®¸®°Å¸¦ Á¤ÀÇÇÏ°íÀÚ ÇÑ´Ù¸é, Æ®¸®°Å Á¤ÀÇ¿¡¼ ; ¸í·É¹® ±¸È¹ ¹®ÀÚ¸¦ »ç¿ëÇϱâ À§Çؼ´ÂMYSQL¸í·É¹® ±¸È¹ ¹®ÀÚ(delimiter)¸¦ Àç Á¤ÀÇÇÏ´Â °ÍÀÌ ÇÊ¿äÇÏ´Ù. ´ÙÀ½ÀÇ ¿¹¹®Àº ÀÌ·± Á¡À» Ç¥ÇöÇÏ´Â °ÍÀÌ´Ù. ¿©±â¿¡¼ UPDATE Æ®¸®°Å´Â °¢ ÁÙÀÇ ¾÷µ¥ÀÌÆ®¿¡ »ç¿ëµÇ´Â »õ·Î¿î °ªÀ» °Ë»çÇϵµ·Ï Á¤ÀǵǸç, ±×¸®°í ±× °ªÀÌ 0¿¡¼ºÎÅÍ 100ÀÇ ¹üÀ§ ³»¿¡ ÀÖµµ·Ï ¼öÁ¤ÇÑ´Ù. ÀÌ°ÍÀº °ªÀÌ ÁÙÀ» ¾÷µ¥ÀÌÆ® Çϱâ Àü¿¡ °Ë»çµÇ¾î¾ß Çϱ⠶§¹®¿¡ BEFORE Æ®¸®°Å°¡ µÇ¾î¾ß ÇÑ´Ù:
mysql> delimiter //
mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account
-> FOR EACH ROW
-> BEGIN
-> IF NEW.amount < 0 THEN
-> SET NEW.amount = 0;
-> ELSEIF NEW.amount > 100 THEN
-> SET NEW.amount = 100;
-> END IF;
-> END;//
mysql> delimiter ;
ÀÌ·¸°Ô ÇÏ¸é ½ºÅä¾îµå ÇÁ·Î½ÃÀú¸¦ °³º°ÀûÀ¸·Î Á¤ÀÇÇÏ°í ±× ´ÙÀ½¿¡ °£´ÜÇÑ CALL¸í·É¹®À» »ç¿ëÇÏ´Â Æ®¸®°Å·ÎºÎÅÍ È£ÃâÇÏ´Â °ÍÀ» ´õ ½±°Ô ÇÒ ¼ö ÀÖ´Ù. ÀÌ°ÍÀº ¶ÇÇÑ ¸î¸î Æ®¸®°Å ³»¿¡¼ºÎÅÍ µ¿ÀÏÇÑ ·çƾÀ» È£ÃâÇÏ°íÀÚ ÇÒ °æ¿ì¿¡ ÀåÁ¡À» °¡Áö°Ô µÈ´Ù.
Æ®¸®°Å°¡ È°¼ºÈ µÉ ¶§ ½ÇÇàÇÏ´Â ¸í·É¹®¿¡´Â ¸î °¡Áö Á¦¾à »çÇ×ÀÌ Á¸ÀçÇÑ´Ù:
- Æ®¸®°Å´Â µ¥ÀÌÅ͸¦ Ŭ¶óÀ̾ðÆ®¿¡ µ¹·Á ÁÖ´Â ½ºÅä¾îµå ÇÁ·Î½ÃÀú ¶Ç´Â µ¿Àû(dynamic)SQLÀ» »ç¿ëÇÏ´Â ½ºÅä¾îµå ÇÁ·Î½ÃÀú¸¦ È£ÃâÇÏ´Â CALL¸í·É¹®Àº »ç¿ëÇÒ ¼ö ¾ø´Ù. (½ºÅä¾îµå ÇÁ·Î½ÃÀú°¡ OUT ¶Ç´Â INOUTÆĶó¹ÌÅ͸¦ ÅëÇؼ µ¥ÀÌÅ͸¦ Æ®¸®°Å¿¡ µ¹·Á ÁÖ´Â °ÍÀº Çã¿ëµÈ´Ù.)
- Æ®¸®°Å´Â START TRANSACTION, COMMIT, ¶Ç´ÂROLLBACK°ú °°Àº È®Á¤Àû(explicitly)À¸·Î ¶Ç´Â ¾Ï½ÃÀû(implicitly)À¸·Î Æ®·£Àè¼ÇÀ» ½ÃÀÛ ¶Ç´Â Á¾·áÇÏ´Â ¸í·É¹®Àº »ç¿ëÇÒ ¼ö ¾ø´Ù.
- MySQL 5.0.10 ÀÌÀü ¹öÀü¿¡¼´Â, Æ®¸®°Å´Â À̸§À» °¡Áö°í Å×À̺í Á÷Á¢ ÂüÁ¶¸¦ ÇÒ ¼ö ¾ø´Ù.
MySQLÀº Æ®¸®°Å ½ÇÇà µ¿¾È¿¡ ¹ß»ýÇÏ´Â ¿¡·¯¸¦ ¾Æ·¡¿Í °°ÀÌ Ã³¸®ÇÑ´Ù:
- BEFORE Æ®¸®°Å°¡ ½ÇÆÐ(fails)ÇÒ °æ¿ì, ÀÌ¿¡ ´ëÀÀÇÏ´Â ÁÙ¿¡ ´ëÇÑ µ¿ÀÛÀº ¼öÇàµÇÁö ¾Ê´Â´Ù.
- AFTER Æ®¸®°Å´Â BEFOREÆ®¸®°Å(Á¸Àç ÇÑ´Ù¸é)¿Í ÁÙ¿¡ ´ëÇÑ µ¿ÀÛ ¸ðµÎ ¼º°øÀûÀ¸·Î ½ÇÇàµÉ °æ¿ì¿¡¸¸ ½ÇÇàµÈ´Ù.
- BEFORE ¶Ç´Â AFTERÆ®¸®°ÅÀÇ ½ÇÇà µ¿¾È ¹ß»ýµÇ´Â ¿¡·¯´Â Æ®¸®°Å È£ÃâÀ» ÀÏÀ¸Å°´Â Àüü ¸í·É¹®ÀÇ ½ÇÆи¦ ÀÏÀ¸Å²´Ù.
- Æ®·£Àè¼Ç Å×ÀÌºí¿¡ ´ëÇؼ´Â, Æ®¸®°ÅÀÇ ½ÇÆÐ(ÀÌ¿¡ µû¸¥ Àüü ¸í·É¹® ½ÇÆÐ)´Â ¸í·É¹®¿¡ ÀÇÇØ ÁøÇàµÈ ¸ðµç µ¥ÀÌÅÍ º¯°æÀÇ ·Ñ¹éÀ» ÀÏÀ¸Å°°Ô µÈ´Ù. ºñ Æ®·£Àè¼Ç Å×À̺í(non-transactional tables)¿¡ ´ëÇؼ´Â, ÀÌ·¯ÇÑ ·Ñ¹éÀº ÀϾ ¼ö ¾øÀ¸¸ç, µû¶ó¼ ºñ·Ï ¸í·É¹®ÀÌ ½ÇÆÐÇÑ´Ù ÇÏ´õ¶óµµ, ¿¡·¯°¡ ¹ß»ýÇÑ ½ÃÁ¡ ÀÌÀü¿¡ ÁøÇàµÈ ¾î¶°ÇÑ µ¥ÀÌÅÍ º¯°æµµ ±×´ë·Î À¯ÁöµÈ´Ù.
Ãâó - http://www.mysqlkorea.co.kr/sub.html?mcode=manual&scode=01&m_no=20363&cat1=18&cat2=569&cat3=0&lang=k
===================================================================================
ÀúÀÚ: Peter Gulutzan / Çѵ¿ÈÆ ¿ª
¿ø¹®: http://www.onlamp.com/pub/a/onlamp/2005/02/03/triggers.html
½ÃÇèÁßÀÎ »õ·Î¿î ±â´ÉÀ» ÀÌ¿ëÇÒ ¼ö ÀÖ´Â MySQLÀÇ ¾ËÆĹöÀü, MySQL 5.0Àº Æ®¸®°Å(Trigger)¸¦ Áö¿øÇÑ´Ù. MySQL °³¹ß ·Îµå¸Ê¿¡ ¾à¼ÓµÈ ±â´ÉÀ̹ǷΠ³î¶ó¿î °ÍÀº ¾Æ´ÏÁö¸¸, "MySQLÀº ÇÒ ¼ö ¾ø´Â °ÍµéÀÇ ¸ñ·Ï" Áß¿¡¼ ÀÚÁÖ ¾ð±ÞµÇ´ø °ÍÀ» »ç¿ëÇÏ°í, µ¿ÀÛÇÏ´Â °ÍÀ» ÁöÄѺ¸´Â °ÍÀº ³î¶ó¿î °æÇèÀÌ´Ù.
À̹ø Å×½ºÆ®¸¦ À§ÇØ MySQL ·¹ÆÛ·±½º ¸Å´º¾ó¿¡¼ °³¹ß ¼Ò½º Æ®¸®¿¡¼ ¼³Ä¡Çϱâ ÀýÀÇ ¼³¸í´ë·Î °¡Àå ÃÖ½ÅÀÇ MySQL 5.0 ¼Ò½º¸¦ ´Ù¿î·ÎµåÇÏ¿´´Ù. ¼Ò½º Æ®¸®¿¡¼ ´Ù¿î ¹Þ´Â °ÍÀº MySQL 5.0 ´Ù¿î·Îµå ÆäÀÌÁö¿¡¼ ¹ÞÀ» ¼ö ÀÖ´Â °Íº¸´Ù ÃÖ½ÅÆÇÀ̸ç, ´ç¿¬È÷ ´ú Å×½ºÆ®µÈ ¹öÀüÀ» ÀǹÌÇÑ´Ù.
Æ®¸®°Å ½ÃÇèÇغ¸±â
¸®´ª½º ½©¿¡¼ mysql Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥À» ½ÇÇàÇßÀ¸¸ç, ¹öÀü 5¸¦ ¼³Ä¡ÇÑ °ÍÀÌ ¸Â´ÂÁö È®ÀÎÇϱâ À§ÇØ ´ÙÀ½°ú °°Àº Äڵ带 ÀÛ¼ºÇÏ¿´´Ù.
mysql> SELECT version();
+-------------------+
| version() |
+-------------------+
| 5.0.2-alpha-debug |
+-------------------+
1 row in set (0.00 sec)
¹öÀüÀ» È®ÀÎÇÑ ÈÄ¿¡ Å×½ºÆ® µ¥ÀÌÅͺ£À̽º¿¡ Å×À̺í°ú Æ®¸®°Å¸¦ Â÷·Ê´ë·Î »ý¼ºÇÏ°í, Æ®¸®°Å¸¦ Å×½ºÆ®Çϱâ À§ÇØ INSERT ¹®À» ½ÇÇàÇغ¸¾Ò´Ù.
mysql> CREATE DATABASE test_db;
Query OK, 1 row affected (0.27 sec)
mysql> USE test_db;
Database changed
mysql> CREATE TABLE t (column1 TINYINT);
Query OK, 0 rows affected (0.28 sec)
mysql> CREATE TRIGGER t_bi /* line 1 */
-> BEFORE INSERT ON t /* line 2 */
-> FOR EACH ROW /* line 3 */
-> SET @x = @x + 1; /* line 4 */
Query OK, 0 rows affected (0.00 sec)
mysql> SET @x = 0; /* line 5 */
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO t VALUES (1),(NULL); /* line 6 */
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> SELECT @x; /* line 7 */
+------+
| @x |
+------+
| 2 |
+------+
1 row in set (0.01 sec)
À§ ¿¹Á¦¿¡¼ ¾Ë ¼ö ÀÖ´Â °Íó·³ MySQL¿¡¼ Æ®¸®°Å´Â Á¦´ë·Î µ¿ÀÛÇÑ´Ù. µ¿ÀÛÀ» ¼³¸íÇϱâ À§ÇØ CREATE TRIGGER ¹®À» Çѹø¿¡ ÇÑÁÙ¾¿ »ìÆ캸ÀÚ.
Æ®¸®°Å ÀÌÇØÇϱâ
CREATE TRIGGER trigger_name /* line 1 */
´ç¿¬È÷ ù¹ø°´Â CREATE TRIGGER ¹®°ú Æ®¸®°ÅÀÇ À̸§ÀÌ´Ù. ³ª´Â Å×À̺í À̸§ ´ÙÀ½¿¡ ¾ð´õ½ºÄÚ¾î(_), ±× ´ÙÀ½¿¡ bi, ai, bu, au, bd, ad¿Í °°Àº Äڵ带 »ç¿ëÇÏ´Â ¹æ½ÄÀ¸·Î Æ®¸®°Å À̸§À» ÁöÁ¤ÇÑ´Ù. 6°³ÀÇ ÄÚµå´Â ´ÙÀ½°ú °°Àº Àǹ̸¦ Áö´Ñ´Ù.
BEFORE INSERT ON table_name /* line 2 */
or AFTER INSERT ON table_name
or BEFORE UPDATE ON table_name
or AFTER UPDATE ON table_name
or BEFORE DELETE ON table_name
or AFTER DELETE ON table_name
Æ®¸®°Å°¡ µ¿ÀÛÇÒ ¼ö ÀÖ´Â ºÎºÐÀº 6°÷ÀÌ ÀÖ´Ù. Æ®¸®°Å´Â Ç×»ó Å×À̺í Çϳª¿¡¼ µ¥ÀÌÅÍ º¯°æ¹®ÀÌ ¹ß»ýÇÒ ¶§ µ¿ÀÛÇÏ°Ô µÈ´Ù. ³»°¡ ÀÛ¼ºÇÑ BEFORE INSERT ON t Æ®¸®°Å´Â Å×À̺í t¿¡ INSERT°¡ ½ÇÇàµÇ±â Àü¿¡ ¼öÇàµÈ´Ù.
FOR EACH ROW /* line 3 */
À§ ¹®ÀåÀº ³»°¡ INSERT ¹®À» »ç¿ëÇÏ´Â °¢ ¿¿¡ ´ëÇØ µ¿ÀÛÇÏ´Â °ÍÀ» ÁöÁ¤ÇÑ´Ù. INSERT ¡¦ SELECT ¹®À» »ç¿ëÇÏ´Â °æ¿ì¿¡ 0°³ÀÇ ÇàÀÌ »ðÀԵǴ °æ¿ì°¡ ¹ß»ýÇÑ´Ù¸é Æ®¸®°Å´Â 0¹ø µ¿ÀÛÇÏ°Ô µÈ´Ù. ¸¶Âù°¡Áö·Î, 1,000°³ÀÇ ¿À» »ðÀÔ(INSERT)ÇÏ°Ô µÇ¸é Æ®¸®°Åµµ 1,000¹ø ¹ß»ýÇÏ°Ô µÈ´Ù. Ç¥ÁØ SQL ¿¡¼´Â »ðÀԵǴ ¿ÀÇ ¼ö¿¡ »ó°ü¾øÀÌ Æ®¸®°Å¸¦ Çѹø¸¸ µ¿ÀÛÇÏ°Ô ÇÏ´Â FOR EACH STATEMENT ¹®À» Á¤ÀÇÇÑ´Ù.
SET @x = @x + 1; /* line 4 */
¸¶Áö¸·À¸·Î »ìÆ캼 °ÍÀº Æ®¸®°ÅÀÇ "¸öü"ºÎºÐÀÌ´Ù. Æ®¸®°Å°¡ µ¿ÀÛÇÏ°Ô µÉ ¶§ Æ®¸®°Å ¸öü ºÎºÐ¿¡ ÀÖ´Â ¹®ÀåÀÌ ½ÇÇàµÈ´Ù. ¿¹Á¦ÀÇ Æ®¸®°Å¿¡¼´Â SET @x = @x + 1 ¹®ÀåÀÌ ½ÇÇàµÈ´Ù. ÀÌ ÄÚµå´Â Æ®¸®°Å°¡ ½ÇÇàµÉ ¶§¸¶´Ù @x º¯¼ö¸¦ Áõ°¡½ÃŲ´Ù.
´Ù½Ã ¸»Çؼ, @x´Â Ä«¿îÅÍ´Ù. °¢ ¿¿¡ INSERT°¡ ¹ß»ýÇÒ ¶§ ¸¶´Ù @x´Â Áõ°¡ÇÑ´Ù. ¹°·Ð, @xÀÇ ±âº»°ªÀº NULLÀ̱⠶§¹®¿¡ Äڵ尡 µ¿ÀÛÇϱ⠾ʱ⠶§¹®¿¡ Ä«¿îÅ͸¦ ÃʱâÈÇß´Ù.
SET @x = 0; /* line 5 */
INSERT¸¦ ½ÇÇàÇؼ Æ®¸®°Å¸¦ Å×½ºÆ®ÇÒ Â÷·Ê´Ù.
INSERT INTO t VALUES (1),(NULL); /* line 6 */
Å×À̺í t¿¡ ROW EACH ROW Æ®¸®°Å¸¦ µÎ¾ú±â ¶§¹®¿¡ ¿À» »ðÀÔÇÒ ¶§¸¶´Ù @xÀÇ °ªÀÌ Áõ°¡ÇؾßÇÑ´Ù. µû¶ó¼ ´ÙÀ½°ú °°Àº SELECT ¹®À» ½ÇÇàÇÏ¿´À» ¶§,
SELECT @x; /* line 7 */
¿À» µÎ °³ Ãß°¡ÇßÀ¸¹Ç·Î °á°úµµ 2°¡ µÇ¾î¾ß ÇÑ´Ù.
Æ®¸®°Å ±æµéÀ̱â
¾ÕÀ¸·Î ÀÛ¼ºÇÒ UPDATE Æ®¸®°Å´Â ;¸¦ Æ÷ÇÔÇÑ ¿©·¯ °³ÀÇ ¹®ÀåÀ¸·Î µÇ¾î Àֱ⠶§¹®¿¡ UPDATE Æ®¸®°Å¸¦ ÀÛ¼ºÇϱâ Àü¿¡ mysql Ŭ¶óÀ̾ðÆ®¿¡¼ ¹®ÀåÀÇ ³¡À» ³ªÅ¸³»´Â ±¸ºÐÀÚ¸¦ //·Î º¯°æÇÒ °ÍÀÌ´Ù.
mysql> DELIMITER //
ÀÌÁ¦ UPDATE Æ®¸®°Å¸¦ ÀÛ¼ºÇÒ Â÷·Ê´Ù.
mysql> CREATE TRIGGER t_bu
-> BEFORE UPDATE ON t
-> FOR EACH ROW
-> BEGIN
-> DECLARE CONTINUE HANDLER FOR 1264 SET new.column1 = -1;
-> SET new.column1 = new.column1 * 2;
-> END;//
Query OK, 0 rows affected (0.00 sec)
Æ®¸®°Å t_bu´Â ¿©·¯ °³ÀÇ SQL ¹®Àå(compound statement)À¸·Î µÇ¾î ÀÖÀ¸¸ç, °¢ ¿À» ¾÷µ¥ÀÌÆ®ÇÒ ¶§¸¶´Ù ¼öÇàµÈ´Ù. ÀúÀå ÇÁ·Î½ÃÀú¿¡¼ »ç¿ëÇÏ´Â º¹ÇÕ¹®(compound statement)¿¡ ´ëÇÑ ±¸¹®Àº MySQL ·¹ÆÛ·±½º ¸Å´º¾óÀ» Âü°íÇϱ⠹ٶõ´Ù. À§ Æ®¸®°ÅÀÇ Àǹ̸¦ ¹®ÀåÀ¸·Î ¿Å±â¸é ´ÙÀ½°ú °°´Ù:
column1ÀÇ °ª¿¡ 2¸¦ °öÇÏ°í, ¹üÀ§¸¦ ¹þ¾î³²(out-of-range) ¿À·ù°¡ ¹ß»ýÇϸé column1ÀÇ °ªÀ» -1·Î ¼³Á¤Ç϶ó.
Æ®¸®°ÅÀÇ ¸öü¿¡´Â MySQL ¹®Àå ¹× ÇÔ¼öµé±îÁö ¸ðµÎ »ç¿ëÇÒ ¼ö ÀÖÀ¸¸ç, »Ó¸¸ ¾Æ´Ï¶ó, ÇØ´ç ¿ÀÇ ÀÌÀü °ªÀ» "old"·Î, »õ·Î¿î °ªÀº "new"·Î ÂüÁ¶ÇÒ ¼ö ÀÖ´Ù.
¿¡·¯°¡ ¹ß»ýÇÒ ¶§´Â ¹«¾ùÀ» ÇÒ ¼ö Àִ°¡?
¾î¶² °æ¿ì ¿¡·¯°¡ ¹ß»ýÇÒ ¼ö Àִ°¡? ¿¹¸¦ µé¾î, column1ÀÇ µ¥ÀÌÅÍ Å¸ÀÔÀº TINYINTÀ̸ç, ÀÌ°ÍÀÇ ÃÖ´ë°ªÀº 127ÀÌ´Ù. MySQL 5.0¿¡¼´Â Á¤»óÀûÀÎ µ¿ÀÛȯ°æ¿¡¼´Â ŸÀÔ¿¡ ´ëÇØ ÀûÀýÇÑ °ªÀÌ µé¾î°¡´ÂÁö¸¦ °Ë»çÇÑ´Ù. ´ÙÀ½Àº UPDATE ¹®Àº "°ªÀÇ ¹üÀ§¸¦ ¹þ¾î³²(out of range value)" ¿À·ù¸¦ °íÀÇ·Î ¸¸µç´Ù.
mysql> UPDATE t SET column1 = column1 + 100;//
Query OK, 1 row affected (0.00 sec)
Rows matched: 2 Changed: 1 Warnings: 1
Å×À̺í tÀÇ Ã¹¹ø° ¿¿¡ ´ëÇؼ column1ÀÇ °ªÀÌ 1ÀÌ°í, ¿©±â¿¡ 100À» ´õÇؼ 101·Î ¸¸µé¸é Æ®¸®°Å°¡ ÀÌ °ªÀ» 2¹è, Áï 202·Î ¸¸µç´Ù. TINYINT ŸÀÔÀÇ ÃÖ´ë°ªÀº 127 À̹ǷΠ¿¹¿Ü 󸮱Ⱑ µ¿ÀÛÇÏ°Ô µÇ¸ç, column1ÀÇ °ªÀ» -1·Î ¼³Á¤ÇÑ´Ù. µÎ¹ø° ¿¿¡ ÀÖ´Â column1ÀÇ °ªÀº NULLÀ̹ǷΠ¾Æ¹«Àϵµ ¹ß»ýÇÏÁö ¾Ê´Â´Ù. ÀÌ¿Í °°Àº µ¿ÀÛÀÌ Å×À̺í t¿¡ ÀÏ¾î³ °ÍÀ» Áõ¸íÇϱâ À§ÇØ Å×À̺í t¸¦ »ìÆ캸ÀÚ.
mysql> SELECT * FROM t//
+---------+
| column1 |
+---------+
| -1 |
| NULL |
+---------+
2 rows in set (0.00 sec)
°á·Ð ¹× ÁÖÀÇÇÒ Á¡
INSERT¿Í UPDATE ¹® ¾çÂÊ¿¡ ´ëÇØ Æ®¸®°Å°¡ µ¿ÀÛÇϸç, Æ®¸®°Å ¸öü¿¡´Â º¹ÀâÇÑ SQL ¹®ÀåÀ» ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. BEFORE Æ®¸®°Å´Â °ªÀ» »ðÀÔÇϰųª ¾÷µ¥ÀÌÆ®ÇÒ ¶§ °ªÀ» ÀÐ°í º¯°æÇÒ ¼ö ÀÖ´Ù. ÀÌ·± Áö¿øÀº ¸ÚÁø ¼Ò½ÄÀÌ´Ù. µû¶ó¼, ¿©±â¼´Â MySQLÀÇ »õ·Î¿î ±â´É¿¡ ´ëÇØ ÁÖÀÇÇÒ Á¡À¸·Î ³¡À» ¸Î°Ú´Ù.
ÁÖÀÇ: MySQL ¾ËÆÄ ¹öÀüÀº ºÒ¾ÈÁ¤ÇÏ´Ù. MySQL ¹ö±× µ¥ÀÌÅͺ£À̽º(http://bugs.mysql.com/)¿¡¼ trigger* Å°¿öµå·Î °Ë»öÇÏ°í, ¾Ë·ÁÁø ¹ö±×¿¡ ´ëÇØ ÁÖÀÇÇØ¾ß ÇÑ´Ù.
ÁÖÀÇ: MySQL ÇÔ¼ö´Â ¸Å¿ì ¾ö°ÝÇÑ Á¦¾àÀ» °®°í ÀÖ´Ù. ¿¹¸¦ µé¾î, MySQL ÇÔ¼ö´Â Å×ÀÌºí¿¡¼ SELECT¸¦ ¼öÇàÇÒ ¼ö ¾ø´Ù. Æ®¸®°Å µ¿ÀÛÀº ÇÔ¼ö È£Ãâ°ú °°ÀÌ µ¿ÀÛÇϱ⠶§¹®¿¡ MySQL ÇÔ¼ö¿Í °°Àº Á¦¾àÀ» °®´Â´Ù.
Peter GulutzanÀº ¼ö¼® ¼ÒÇÁÆ®¿þ¾î ¾ÆÅ°ÅØÆ®·Î MySQL AB¸¦ À§ÇØ ÀÏÇÏ°í ÀÖÀ¸¸ç, ¾Ë¹öŸ(Alberta)ÁÖ ¿¡µå¸óÆ°(Edmonton)¿¡ »ì°í ÀÖ´Ù.
Ãâó - http://www.hanb.co.kr/network/view.html?bi_id=1047
================================================================
À̹ø ½Ã°£¿¡´Â MySQLÆ®¸®°Å »ç¿ë¹ý¿¡ ´ëÇؼ ¾Ë¾Æº¸µµ·Ï ÇÏ°Ú½À´Ï´Ù.
- CREATE TRIGGER¹®¹ý
CREATE
[DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_body
- ¼³¸í
- DEFINER
- DEFINER Á¶Ç×Àº Æ®¸®°Å È°¼ºÈ ½Ã°£¿¡ ¾×¼¼½º ±ÇÇÑÀ» È®ÀÎÇÒ ¶§ »ç¿ëµÇ´Â º¸¾È ÄÁÅؽºÆ®¸¦ °áÁ¤ÇÕ´Ï´Ù.
- trigger_time
- trigger_time´Â Æ®¸®°Å µ¿ÀÛ ½Ã°£ÀÔ´Ï´Ù.Æ®¸®°Å°¡ ¼öÁ¤µÇ´Â °¢ ÇàÀÇ ¾Õ ¶Ç´Â µÚ¿¡ È°¼ºÈÇÑ´Ù´Â °ÍÀ» °¡¸®Å²´Ù ¾Õ ¶Ç´Â µÚ¿¡ÀÌ µÉ ¼ö ÀÖ½À´Ï´Ù.
- trigger_event
- INSERT
- »õ ÇàÀÌ Å×ÀÌºí¿¡ »ðÀ﵃ ¶§¸¶´Ù Æ®¸®°Å°¡ È°¼ºÈµË´Ï´Ù.
- UPDATE
- ÇàÀ» ¼öÁ¤ÇÒ ¶§¸¶´Ù Æ®¸®°Å°¡ È°¼ºÈµË´Ï´Ù.
- DELETE
- ÇàÀÌ Å×ÀÌºí¿¡¼ »èÁ¦µË´Ï´Ù ¶§¸¶´Ù Æ®¸®°Å°¡ È°¼ºÈµË´Ï´Ù.
- trigger_body
- Æ®¸®°Å°¡ È°¼ºÈ µÉ¶§ ½ÇÇàÇÒ ¼ö ÀÖ´Â ±¸¹®À» ±â¼ú.
- DB ¸¸µé±â
- mysql¿¡ root±ÇÇÑÀ¸·Î Á¢¼ÓÈÄ, Å×½ºÆ® µ¥ÀÌÅͺ£À̽º¸¦ ¸¸µé°í, User¸¦ ¸¸µì´Ï´Ù.
- mysql -u¾ÆÀ̵ð -p
create database test;
use test;
grant all privileges on test.* to test@localhost identified by 'test' with grant option;
[½ÇÇàȸé]
- ¿¹Á¦ Å×ÀÌºí ¸¸µé±â
- mysql -utest -ptest·Î Á¢¼ÓÇÑ´Ù. ±×´ÙÀ½ ¾Æ·¡ÀÇ ¸í·É¹®À» ½ÇÇàÇÑ´Ù.
use test;
CREATE TABLE test1(a1 INT);
CREATE TABLE test2(a2 INT);
CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
CREATE TABLE test4(
a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
b4 INT DEFAULT 0
);
[½ÇÇàȸé]
- Æ®¸®°Å ¸¸µé±â
- Æ®¸®°Å À̸§ "testref"ÀÌ°í, test1Å×À̺íÀÇ InsertÈÄ Æ®¸®°Å¸¦ µ¿ÀÛ
- test2Å×À̺í a2¿¡ test1¿¡ Ãß°¡ÇÑa1À» ³Ö¾î Insert¸¦ ÇÔ.
- test3Å×À̺í test1¿¡ Ãß°¡ÇÑa1°ª°ú °°Àº µ¥ÀÌÅ͸¦ Áö¿ò.
- test4Å×À̺í a4¿Í test1¿¡ Ãß°¡ÇÑa1ÀÌ °°À¸¸é b4¿¡ 1À» ´õÇÑ´Ù.
delimiter |
CREATE TRIGGER testref BEFORE INSERT ON test1
FOR EACH ROW BEGIN
INSERT INTO test2 SET a2 = NEW.a1;
DELETE FROM test3 WHERE a3 = NEW.a1;
UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
END;
|
delimiter ;
[½ÇÇàȸé]
- test3Å×ÀÌºí¿¡ Ãʱ⠵¥ÀÌÅÍ Insert
INSERT INTO test3 (a3) VALUES
(NULL), (NULL), (NULL), (NULL), (NULL),
(NULL), (NULL), (NULL), (NULL), (NULL);
- test4Å×ÀÌºí¿¡ Ãʱ⠵¥ÀÌÅÍ Insert
INSERT INTO test4 (a4) VALUES
(0), (0), (0), (0), (0), (0), (0), (0), (0), (0);
- test1Å×ÀÌºí¿¡ µ¥ÀÌÅÍ Insert
INSERT INTO test1 VALUES
(1), (3), (1), (7), (1), (8), (4), (4);
[½ÇÇàȸé]
- °á°ú È®ÀÎ
select * from test1;
[½ÇÇàȸé]
select * from test2;
[½ÇÇàȸé]
select * from test3;
[½ÇÇàȸé]
select * from test4;
[½ÇÇàȸé]
¾î¶²°¡¿ä? Æ®¸®°Å¿¡ Á¤ÀÇÇß´øµ¥·Î °ªµéÀÌ ¹Ù²î¾î ÀÖÁÒ!
Æ®¸®°ÅÀÇ »ç¿ë ¹æ¹ý¿¡ ´ëÇؼ Á¶±ÝÀº ¾Ë°Í °°ÁÒ!
¿À´ÃÀº ¿©±â ±îÁö ÀÔ´Ï´Ù.
°¨»çÇÕ´Ï´Ù.
[Âü°í »çÀÌÆ®]:http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html
Ãâó - http://forum.falinux.com/zbxe/?mid=lecture_tip&page=1&document_srl=566230
Ãâó: http://linuxism.tistory.com/511 [linuxism]