Æ®¸®°Å Ȱ¼ºÈ´Â °ü·Ã Æ®¸®°Å Á¶Ä¡ ¼öÇàÀ» ¹ß»ý½Ãŵ´Ï´Ù. ¸ðµç Æ®¸®°Å´Â µÎ °¡Áö ±¸¼º¿ä¼Ò¸¦ °®´Â Á¤È®È÷ ÇϳªÀÇ Æ®¸®°Å Á¶Ä¡·Î ±¸¼ºµË´Ï´Ù.
Æ®¸®°Å Á¶Ä¡ Á¶°ÇÀº Æ®¸®°Å Á¶Ä¡°¡ ½ÇÇàÇϰí ÀÖ´Â ¸í·É¹®À̳ª Çà¿¡ ´ëÇÏ¿© Æ®¸®°Å ¸í·É¹® ÁýÇÕÀÌ ¼öÇàµÇ´ÂÁö ¿©ºÎ¸¦ Á¤ÀÇÇÕ´Ï´Ù. Æ®¸®°Å ¸í·É¹® ÁýÇÕÀº ¹ß»ýÇÑ À̺¥Æ®ÀÇ °á°ú µ¥ÀÌÅͺ£À̽º¿¡¼ Æ®¸®°Å¿¡ ÀÇÇØ ¼öÇàµÇ´Â Á¶Ä¡ ÁýÇÕÀ» Á¤ÀÇÇÕ´Ï´Ù.
¿¹¸¦ µé¾î, ´ÙÀ½ÀÇ Æ®¸®°Å Á¶Ä¡´Â Æ®¸®°Å 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 Á¶ÀÛÀÌ ¸ðµç Æ®¸®°Å¿¡¼ Àǹ̰¡ ÀÖ´Â °ÍÀº ¾Æ´Õ´Ï´Ù. Æ®¸®°Å Ȱ¼ºÈ ½Ã°£ÀÌ BEFOREÀÎÁö ¶Ç´Â AFTERÀÎÁö¿¡ µû¶ó, ¼·Î ´Ù¸¥ Á¾·ùÀÇ Á¶ÀÛÀÌ Æ®¸®°Å SQL¹®À¸·Î ÀûÀýÇÒ ¼ö ÀÖ½À´Ï´Ù.
Æ®¸®°Å SQL¹® ¸ñ·Ï ¹× BEFORE ¹× AFTER Æ®¸®°Å¿¡ ´ëÇÑ Ãß°¡ Á¤º¸´Â SQL ÂüÁ¶¼ Ã¥À» ÂüÁ¶ÇϽʽÿÀ.
´ëºÎºÐÀÇ °æ¿ì, Æ®¸®°Å SQL¹®ÀÌ À½¼öÀÇ ¸®ÅÏ Äڵ带 ¸®ÅÏÇÑ °æ¿ì, ¸ðµç Æ®¸®°Å¿Í ÂüÁ¶ Á¦ÇÑÁ¶°Ç°ú ÇÔ²² Æ®¸®°ÅÇÑ SQL¹®ÀÌ ±¸°£ º¹¿øµÇ°í, ¿À·ù(SQLCODE -723(SQLSTATE 09000))°¡ ¸®Åϵ˴ϴÙ. Àå¾Ö°¡ ¹ß»ýÇÑ Æ®¸®°Å SQL¹®À¸·ÎºÎÅÍ Æ®¸®°Å À̸§, SQLCODE, SQLSTATE ¹× ¸¹Àº ÅäÅ«µéÀÌ ¸®Åϵ˴ϴÙ. Æ®¸®°Å°¡ ¼öÇàµÇ°í ÀÖÀ» ¶§ ¹ß»ýÇÏ´Â, Áß¿äÇϰųª Àü ÀÛ¾÷ ´ÜÀ§¸¦ ±¸°£ º¹¿øÇÏ´Â ¿À·ù Á¶°ÇÀº SQLCODE -723(SQLSTATE 09000)À» »ç¿ëÇÏ¿© ¸®ÅϵÇÁö ¾Ê½À´Ï´Ù.
»ç¿ëÀÚ Á¤ÀÇ ÇÔ¼ö(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