ÀÀ¿ëÇÁ·Î±×·¥ °³¹ß ¾È³»¼­

Æ®¸®°Å Á¶Ä¡

Æ®¸®°Å Ȱ¼ºÈ­´Â °ü·Ã Æ®¸®°Å Á¶Ä¡ ¼öÇàÀ» ¹ß»ý½Ãŵ´Ï´Ù. ¸ðµç Æ®¸®°Å´Â µÎ °¡Áö ±¸¼º¿ä¼Ò¸¦ °®´Â Á¤È®È÷ ÇϳªÀÇ Æ®¸®°Å Á¶Ä¡·Î ±¸¼ºµË´Ï´Ù.

Æ®¸®°Å Á¶Ä¡ Á¶°ÇÀº Æ®¸®°Å Á¶Ä¡°¡ ½ÇÇàÇϰí ÀÖ´Â ¸í·É¹®À̳ª Çà¿¡ ´ëÇÏ¿© Æ®¸®°Å ¸í·É¹® ÁýÇÕÀÌ ¼öÇàµÇ´ÂÁö ¿©ºÎ¸¦ Á¤ÀÇÇÕ´Ï´Ù. Æ®¸®°Å ¸í·É¹® ÁýÇÕÀº ¹ß»ýÇÑ À̺¥Æ®ÀÇ °á°ú µ¥ÀÌÅͺ£À̽º¿¡¼­ Æ®¸®°Å¿¡ ÀÇÇØ ¼öÇàµÇ´Â Á¶Ä¡ ÁýÇÕÀ» Á¤ÀÇÇÕ´Ï´Ù.

¿¹¸¦ µé¾î, ´ÙÀ½ÀÇ Æ®¸®°Å Á¶Ä¡´Â Æ®¸®°Å SQL¹® ÁýÇÕÀÌ on_hand Ä÷³ÀÌ max_stocked Ä÷³ °ªÀÇ 10 ÆÛ¼¾Æ®º¸´Ù ÀÛÀº Çà¿¡ ´ëÇØ¼­¸¸ Ȱ¼ºÈ­µÇµµ·Ï ÁöÁ¤ÇÕ´Ï´Ù. ÀÌ °æ¿ì, Æ®¸®°Å SQL¹® ÁýÇÕÀº issue_ship_request ÇÔ¼ö È£ÃâÀÔ´Ï´Ù.

    CREATE TRIGGER REORDER
      AFTER UPDATE OF ON_HAND, MAX_STOCKED ON PARTS
      REFERENCING NEW AS N_ROW
      FOR EACH ROW MODE DB2SQL
            WHEN (N_ROW.ON_HAND < 0.10 * N_ROW.MAX_STOCKED)
      BEGIN ATOMIC
        VALUES(ISSUE_SHIP_REQUEST(N_ROW.MAX_STOCKED -
                                  N_ROW.ON_HAND,
                                  N_ROW.PARTNO));
      END

Æ®¸®°Å Á¶Ä¡ Á¶°Ç

Æ®¸®°Å Á¶Ä¡¿¡¼­ ¼³¸íµÈ´ë·Î, Æ®¸®°Å Á¶Ä¡ Á¶°ÇÀº Æ®¸®°Å Á¶Ä¡ ³»¿¡¼­ SQL¹®À» ¼öÇàÇϱâ À§ÇØ Âü(true)À¸·Î Æò°¡µÇ¾î¾ß ÇÏ´Â °Ë»ö Á¶°ÇÀ» ÁöÁ¤ÇÏ´Â Æ®¸®°Å Á¶Ä¡ÀÇ ¿É¼Ç ÀýÀÔ´Ï´Ù. WHENÀýÀÌ »ý·«µÇ¸é, Æ®¸®°Å Á¶Ä¡ ³» SQL¹®Àº Ç×»ó ½ÇÇàµË´Ï´Ù.

Æ®¸®°Å°¡ FOR EACH ROW Æ®¸®°ÅÀÎ °æ¿ì, Æ®¸®°Å Á¶Ä¡ Á¶°ÇÀº °¢ Çà¿¡ ´ëÇÏ¿© ÇÑ ¹ø Æò°¡µÇ°í, Æ®¸®°Å°¡ FOR EACH STATEMENT Æ®¸®°ÅÀÎ °æ¿ì, ¸í·É¹®¿¡ ´ëÇÏ¿© ÇÑ ¹ø Æò°¡µË´Ï´Ù.

ÀÌ Àý¿¡¼­´Â Æ®¸®°Å ´ë½Å Ȱ¼ºÈ­ µÇ´Â Á¶Ä¡¸¦ Á¶Á¤Çϱâ À§ÇØ »ç¿ëÇÒ ¼ö ÀÖ´Â Á¦¾î¸¦ Á¦°øÇÕ´Ï´Ù. WHENÀýÀÇ À¯¿ëÇÔÀ» º¸¿©ÁÖ´Â ÇÑ ¿¹´Â ¼öÀÔ °ªÀÌ Æ¯Á¤ ¹üÀ§ ¾È¿¡ ¶Ç´Â ¹Ù±ù¿¡ ÀÖ´Â °æ¿ì¿¡¸¸ Æ®¸®°Å Á¶Ä¡°¡ Ȱ¼ºÈ­µÇ´Â µ¥ÀÌÅÍ Á¾¼Ó ±ÔÄ¢À» °­Á¦ÇÏ´Â °ÍÀÔ´Ï´Ù.

Æ®¸®°Å SQL¹®

Æ®¸®°Å SQL¹® ¼¼Æ®´Â Æ®¸®°Å¸¦ Ȱ¼ºÈ­½ÃÅ´À¸·Î½á À¯¹ßµÇ´Â ½ÇÁ¦ Á¶Ä¡¸¦ ¼öÇàÇÕ´Ï´Ù. ¾Õ¿¡¼­ ¼³¸íµÇ¾úµíÀÌ, ¸ðµç SQL Á¶ÀÛÀÌ ¸ðµç Æ®¸®°Å¿¡¼­ Àǹ̰¡ ÀÖ´Â °ÍÀº ¾Æ´Õ´Ï´Ù. Æ®¸®°Å Ȱ¼ºÈ­ ½Ã°£ÀÌ BEFOREÀÎÁö ¶Ç´Â AFTERÀÎÁö¿¡ µû¶ó, ¼­·Î ´Ù¸¥ Á¾·ùÀÇ Á¶ÀÛÀÌ Æ®¸®°Å SQL¹®À¸·Î ÀûÀýÇÒ ¼ö ÀÖ½À´Ï´Ù.

Æ®¸®°Å SQL¹® ¸ñ·Ï ¹× BEFORE ¹× AFTER Æ®¸®°Å¿¡ ´ëÇÑ Ãß°¡ Á¤º¸´Â SQL ÂüÁ¶¼­ Ã¥À» ÂüÁ¶ÇϽʽÿÀ.

´ëºÎºÐÀÇ °æ¿ì, Æ®¸®°Å SQL¹®ÀÌ À½¼öÀÇ ¸®ÅÏ Äڵ带 ¸®ÅÏÇÑ °æ¿ì, ¸ðµç Æ®¸®°Å¿Í ÂüÁ¶ Á¦ÇÑÁ¶°Ç°ú ÇÔ²² Æ®¸®°ÅÇÑ SQL¹®ÀÌ ±¸°£ º¹¿øµÇ°í, ¿À·ù(SQLCODE -723(SQLSTATE 09000))°¡ ¸®Åϵ˴ϴÙ. Àå¾Ö°¡ ¹ß»ýÇÑ Æ®¸®°Å SQL¹®À¸·ÎºÎÅÍ Æ®¸®°Å À̸§, SQLCODE, SQLSTATE ¹× ¸¹Àº ÅäÅ«µéÀÌ ¸®Åϵ˴ϴÙ. Æ®¸®°Å°¡ ¼öÇàµÇ°í ÀÖÀ» ¶§ ¹ß»ýÇÏ´Â, Áß¿äÇϰųª Àü ÀÛ¾÷ ´ÜÀ§¸¦ ±¸°£ º¹¿øÇÏ´Â ¿À·ù Á¶°ÇÀº SQLCODE -723(SQLSTATE 09000)À» »ç¿ëÇÏ¿© ¸®ÅϵÇÁö ¾Ê½À´Ï´Ù.

SQL Æ®¸®°Å ¸í·É¹® ³»ÀÇ ÇÔ¼ö

»ç¿ëÀÚ Á¤ÀÇ ÇÔ¼ö(UDF)¸¦ Æ÷ÇÔÇÑ ÇÔ¼öµéÀº Æ®¸®°Å SQL¹®¿¡¼­ È£ÃâµÉ ¼ö ÀÖ½À´Ï´Ù. ´ÙÀ½ ¿¹¸¦ »ìÆì º¸½Ê½Ã¿À.

    CREATE TRIGGER REORDER
      AFTER UPDATE OF ON_HAND, MAX_STOCKED ON PARTS
      REFERENCING NEW AS N_ROW
      FOR EACH ROW MODE DB2SQL
      WHEN (N_ROW.ON_HAND < 0.10 * N_ROW.MAX_STOCKED)
      BEGIN ATOMIC
        VALUES (ISSUE_SHIP_REQUEST (N_ROW.MAX_STOCKED - N_ROW.ON_HAND,
                                         N_ROW.PARTNO));
      END

Æ®¸®°Å SQL¹®¿¡ ¿ÏÀüÇÏÁö ¾ÊÀº ÇÔ¼ö À̸§À» »ç¿ëÇÑ ÇÔ¼ö È£ÃâÀÌ µé¾î ÀÖÀ» ¶§, ÀÌ ÇÔ¼ö È£ÃâÀº Æ®¸®°Å ÀÛ¼º½Ã ÇÔ¼ö °æ·Î¿¡ ±âÃÊÇÏ¿© ÇØ¼®µË´Ï´Ù. ÇÔ¼ö ÇØ¼®¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº SQL ÂüÁ¶¼­ Ã¥À» ÂüÁ¶ÇϽʽÿÀ.

UDF´Â C³ª C++ ÇÁ·Î±×·¡¹Ö ¾ð¾î·Î ÀÛ¼ºµË´Ï´Ù. ÀÌµé ¾ð¾î·Î ÀÛ¼ºÇÏ´Â °æ¿ì ³í¸® È帧ÀÇ Á¦¾î, ¿À·ù ó¸® ¹× º¹±¸, ½Ã½ºÅÛ°ú ¶óÀ̺귯¸® ÇÔ¼ö·ÎÀÇ ¾×¼¼½º°¡ °¡´ÉÇÕ´Ï´Ù. UDF¿¡ ´ëÇÑ ¼³¸íÀº »ç¿ëÀÚ Á¤ÀÇ ÇÔ¼ö(UDF)ÀÇ ³»¿ëÀ» ÂüÁ¶ÇϽʽÿÀ. ÀÌ ±â´ÉÀ» ÅëÇØ Æ®¸®°Å Á¶Ä¡´Â Æ®¸®°Å°¡ Ȱ¼ºÈ­µÉ ¶§ ºñ SQL À¯ÇüÀÇ Á¶ÀÛÀ» ¼öÇàÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î, ±×·¯ÇÑ UDF´Â ÀüÀÚ ¿ìÆí ¸Þ½ÃÁö¸¦ ¼Û½ÅÇϰí, À̰ÍÀ¸·Î °æº¸ ¸ÞÄ«´ÏÁòÀ¸·Î ÀÛ¿ëÇÕ´Ï´Ù. ¸Þ½ÃÁö¿Í °°Àº ¿ÜºÎ Á¶Ä¡´Â È®¾à Á¦¾î ÇÏ¿¡ ÀÖÁö ¾ÊÀ¸¸ç, ³ª¸ÓÁö Æ®¸®°Å Á¶Ä¡ÀÇ ¼ºÆÐ¿¡ °ü°è¾øÀÌ ¼öÇàµË´Ï´Ù.

¶ÇÇÑ ÇÔ¼ö°¡ ¿À·ù ¹ß»ýÀ» ³ªÅ¸³»´Â SQLSTATE¸¦ ¸®ÅÏÇÒ ¼öµµ ÀÖÀ¸¸ç, À̰ÍÀ¸·Î Æ®¸®°Å¸µ SQL¹®ÀÌ ½ÇÆÐÇÒ ¼öµµ ÀÖ½À´Ï´Ù. À̰ÍÀº »ç¿ëÀÚ Á¤ÀÇ Á¦ÇÑÁ¶°ÇÀ» ±¸ÇöÇÏ´Â ÇÑ °¡Áö ¹æ¹ýÀÔ´Ï´Ù. SIGNAL SQLSTATE¹®À» »ç¿ëÇÏ´Â °ÍÀÌ ¶Ç ´Ù¸¥ ¹æ¹ýÀÔ´Ï´Ù. º¹ÀâÇÑ »ç¿ëÀÚ Á¤ÀÇ Á¦ÇÑÁ¶°ÇÀ» Á¡°ËÇÏ´Â ¼ö´ÜÀ¸·Î Æ®¸®°Å¸¦ »ç¿ëÇÏ·Á¸é, Æ®¸®°Å SQL¹®¿¡¼­ RAISE_ERROR ³»Àå ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ ÇÔ¼ö´Â ÀÀ¿ëÇÁ·Î±×·¥À¸·Î »ç¿ëÀÚ Á¤ÀÇ SQLSTATE(SQLCODE -438)¸¦ ¸®ÅÏÇÏ´Â µ¥ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ ÇÔ¼öÀÇ È£Ãâ°ú »ç¿ë¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº SQL ÂüÁ¶¼­ Ã¥À» ÂüÁ¶ÇϽʽÿÀ.

¿¹¸¦ µé¾î, HIREDATE°¡ Á÷¿øÀÌ ±Ù¹«¸¦ ½ÃÀÛÇÑ ³¯Â¥ÀÎ, EMPLOYEE Å×À̺íÀÇ HIREDATE Ä÷³¿¡ °ü·ÃµÈ ¾î¶² ±ÔÄ¢¿¡ ´ëÇÏ¿© °í·ÁÇսôÙ.

´ÙÀ½ÀÇ Æ®¸®°Å´Â INSERT¿¡¼­ ÀÌ·¯ÇÑ ±ÔÄ¢µéÀ» ¸ðµÎ ó¸®ÇÕ´Ï´Ù.

    CREATE TRIGGER CHECK_HIREDATE
      NO CASCADE BEFORE INSERT ON EMPLOYEE
      REFERENCING NEW AS NEW_EMP
      FOR EACH ROW MODE DB2SQL
      BEGIN ATOMIC
      VALUES CASE
        WHEN NEW_EMP.HIREDATE < CURRENT DATE
          THEN RAISE_ERROR('85001', 'HIREDATE has passed')
        WHEN NEW_EMP.HIREDATE - CURRENT DATE > 10000.
          THEN RAISE_ERROR('85002', 'HIREDATE too far out')
        WHEN NEW_EMP.HIREDATE - CURRENT DATE > 600.
          THEN SEND_MOTE('persmgr',NEW_EMP.EMPNO,'late.txt')
        END;
      END


[ ÆäÀÌÁöÀÇ ¸Ç À§ | ÀÌÀü ÆäÀÌÁö | ´ÙÀ½ ÆäÀÌÁö | ¸ñÂ÷ | »öÀÎ ]