34.3. C¿¡ ÀÇÇÑ Æ®¸®°Å ÇÔ¼öÀÇ ÀÛ¼º

º»Àý¿¡¼­´Â Æ®¸®°Å ÇÔ¼ö¿ÍÀÇ ÀÎÅÍÆäÀ̽º¿¡ ´ëÇØ Àú·¹º§ÀÇ »ó¼¼Á¤º¸¸¦ ¼³¸íÇÕ´Ï´Ù. ÀÌ Á¤º¸´Â C¾ð¾î·Î Æ®¸®°Å ÇÔ¼ö¸¦ ÀÛ¼ºÇÒ ¶§¿¡°Ô¸¸ ÇÊ¿äÇÕ´Ï´Ù. °í·¹º§ÀÎ ¾ð¾î·Î ÀÛ¼ºÇϸé, ÀÌ·¯ÇÑ ÀÚ¼¼ÇÑ »ó¼¼Á¤º¸´Â ´ç½ÅÀ» À§ÇØ Ãë±ÞµÉ °Í ÀÔ´Ï´Ù. ´ëºÎºÐÀÇ °æ¿ì, C·Î Æ®¸®°Å¸¦ ÀÛ¼ºÇϱâ Àü¿¡ ÀýÂ÷»óÀÇ ¾ð¾î¸¦ »ç¿ëÇÏ´Â °ÍÀ» °ËÅäÇØ¾ß ÇÕ´Ï´Ù. °¢ ¹®¼­È­µÈ ÀýÂ÷»ó ¾ð¾î´Â ±× ¾ð¾î¸¦ »ç¿ëÇÑ Æ®¸®°Å ¾ð¾îÀÇ ÀÛ¼º ¹æ¹ýÀ» ¼³¸íÇÕ´Ï´Ù.

Æ®¸®°Å ÇÔ¼ö´Â"version 1"ÇÔ¼ö ¸Å´ÏÀú ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇÏÁö ¾ÊÀ¸¸é ¾ÈµË´Ï´Ù.

ÇÔ¼ö°¡ Æ®¸®°Å ¸Å´ÏÀú·ÎºÎÅÍ ºÒ·Á °¥ ¶§´Â, Åë»ó Àμö°¡ °Ç³×¹Þ´Â °ÍÀÌ ¾Æ´Ï¶ó, TriggerData±¸Á¶Ã¼¸¦ °¡¸®Å°´Â"context"Æ÷ÀÎÅͰ¡ °Ç³×¹Þ½À´Ï´Ù. CÇÔ¼ö´Â, Æ®¸®°Å ¸Å´ÏÀú·ÎºÎÅÍ ºÒ·Á °¬´ÂÁö ¾î¶²Áö¸¦ ÀÌÇÏÀÇ ¸ÅÅ©·Î¸¦ ½ÇÇàÇÏ´Â °ÍÀ¸·Î °Ë»çÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.

CALLED_AS_TRIGGER(fcinfo)

À̰ÍÀº ÀÌÇÏ¿¡ Àü°³µË´Ï´Ù.

((fcinfo)->context != NULL && IsA((fcinfo)->context, TriggerData))

¸¸¾à À̰ÍÀÌ true°ªÀ» µ¹·ÁÁÖ´Â °æ¿ì,fcinfo->context¸¦TriggerData *ŸÀÔ¿¡ ij½ºÆ® ÇØ, °¡¸®ÄÑÁøTriggerData±¸Á¶¸¦ »ç¿ëÇÏ´Â °ÍÀº ¾ÈÀüÇÕ´Ï´Ù. ±× ÇÔ¼ö´Â,TriggerData±¸Á¶³ª ±×°ÍÀÌ °¡¸®Å°´Â ¾î¶°ÇÑ µ¥ÀÌÅ͵µ º¯°æÇؼ­´Â ¾ÈµË´Ï´Ù .

struct TriggerData´Âcommands/trigger.h¾È¿¡¼­ Á¤Àǵǰí ÀÖ½À´Ï´Ù.

typedef struct TriggerData
{
    NodeTag       type;
    TriggerEvent  tg_event;
    Relation      tg_relation;
    HeapTuple     tg_trigtuple;
    HeapTuple     tg_newtuple;
    Trigger      *tg_trigger;
    Buffer        tg_trigtuplebuf;
    Buffer        tg_newtuplebuf;
} TriggerData;

¸â¹ö´Â ¾Æ·¡¿Í °°ÀÌ Á¤Àǵǰí ÀÖ½À´Ï´Ù.

type

Ç×»óT_TriggerDataÀÔ´Ï´Ù.

tg_event

±× ÇÔ¼ö°¡ ºÒ·Á °£ À̺¥Æ®¸¦ ¼³¸íÇÕ´Ï´Ù. tg_event¸¦ Á¶»çÇϱâ À§Çؼ­ ¾Æ·¡¿Í °°Àº ¸ÅÅ©·Î¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.

TRIGGER_FIRED_BEFORE(tg_event)

Æ®¸®°Å°¡ BEFORE·Î ¹ßÇàµÇ¾úÀ» °æ¿ì true°ªÀ» µ¹·ÁÁÝ´Ï´Ù.

TRIGGER_FIRED_AFTER(tg_event)

Æ®¸®°Å°¡ AFTER·Î ¹ßÇàµÇ¾úÀ» °æ¿ì true°ªÀ» µ¹·ÁÁÝ´Ï´Ù.

TRIGGER_FIRED_FOR_ROW(tg_event)

Æ®¸®°Å°¡ Çà ¼öÁØÀÇ À̺¥Æ®·Î ¹ßÇàµÇ¾úÀ» °æ¿ì true°ªÀ» µ¹·ÁÁÝ´Ï´Ù.

TRIGGER_FIRED_FOR_STATEMENT(tg_event)

Æ®¸®°Å°¡ ¹®Àå ¼öÁØÀÇ À̺¥Æ®·Î ¹ßÇàµÇ¾úÀ» °æ¿ì true°ªÀ» µ¹·ÁÁÝ´Ï´Ù.

TRIGGER_FIRED_BY_INSERT(tg_event)

Æ®¸®°Å°¡INSERT¸í·ÉÀ¸·Î ¹ßÇàµÇ¾úÀ» °æ¿ì true°ªÀ» µ¹·ÁÁÝ´Ï´Ù.

TRIGGER_FIRED_BY_UPDATE(tg_event)

Æ®¸®°Å°¡UPDATE¸í·ÉÀ¸·Î ¹ßÇàµÇ¾úÀ» °æ¿ì true°ªÀ» µ¹·ÁÁÝ´Ï´Ù.

TRIGGER_FIRED_BY_DELETE(tg_event)

Æ®¸®°Å°¡DELETE¸í·ÉÀ¸·Î ¹ßÇàµÇ¾úÀ» °æ¿ì true °ªÀ» µ¹·ÁÁÝ´Ï´Ù.

tg_relation

Æ®¸®°Å°¡ »ý¼ºµÈ °ü°è¸¦ ±â¼úÇÏ´Â ±¸Á¶ÀÇ Æ÷ÀÎÅÍÀÔ´Ï´Ù. ÀÌ ±¸Á¶¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ °ÍÀº,utils/rel.h¸¦ ÂüÁ¶ÇØ ÁÖ¼¼¿ä. °¡Àå Èï¹Ì·Î¿î °ÍÀº,tg_relation->rd_att(°ü°è Æ©Çÿ¡ ´ëÇÑ ±â¼úÀÚ)°útg_relation->rd_rel->relnameÀÔ´Ï´Ù(°ü°è¸í, ÀÌ Å¸ÀÔÀº char*ÀÌ ¾Æ´Ï°íNameDataÀÔ´Ï´Ù. À̸§À» º¹»çÇÒ °æ¿ì´Â,char*¸¦ ¾ò±â À§Çؼ­SPI_getrelname(tg_relation)¸¦ »ç¿ëÇØ ÁÖ¼¼¿ä).

tg_trigtuple

Æ®¸®°Å°¡ »ý¼ºµÈ ÇàÀÇ Æ÷ÀÎÅÍÀÔ´Ï´Ù. À̰ÍÀº »ðÀÔ, »èÁ¦, ȤÀº °»½ÅµÇ´Â ÇàÀÔ´Ï´Ù. ¸¸¾àINSERT/DELETE·Î ÀÌ Æ®¸®°Å°¡ »ý¼ºµÇ¾úÀ» ¶§, ÀÌ ÇàÀ» ´Ù¸¥ °ÍÀ¸·Î ´ëüÇÏ°í ½ÍÁö ¾ÊÀº(INSERTÀÇ °æ¿ì) °æ¿ì³ª, ±× ÇàÀ» »ý·«ÇÏ°í ½ÍÁö ¾ÊÀº °æ¿ì´Â, À̰ÍÀ» ÀÌ ÇÔ¼ö·ÎºÎÅÍ ¹ÝÈ¯ÇØÁÖ¼¼¿ä.

tg_newtuple

Æ®¸®°Å°¡UPDATE·Î »ý¼ºµÇ¾úÀ» °æ¿ì´Â, ±× ÇàÀÇ »õ·Î¿î ¹öÀüÀÇ Æ÷ÀÎÅÍÀÔ´Ï´Ù. INSERTȤÀºDELETEÀÇ °æ¿ì´Â,NULLÀÔ´Ï´Ù. UPDATEÀ̺¥Æ® ¶§, ÀÌ ÇàÀ» ´Ù¸¥ °ÍÀ¸·Î ´ëüÇÏ°í ½ÍÁö ¾ÊÀº °æ¿ì³ª »ý·«ÇÏ°í ½ÍÁö ¾ÊÀº°æ¿ì´Â, À̰ÍÀ» ÀÌ ÇÔ¼ö·ÎºÎÅÍ ¹ÝÈ¯ÇØÁÖ¼¼¿ä.

tg_trigger

ÀÌÇÏ¿Í °°ÀÌutils/rel.h·Î Á¤ÀǵÈ,Trigger±¸Á¶ÀÇ Æ÷ÀÎÅÍÀÔ´Ï´Ù.

typedef struct Trigger
{
    Oid         tgoid;
    char       *tgname;
    Oid         tgfoid;
    int16       tgtype;
    bool        tgenabled;
    bool        tgisconstraint;
    Oid         tgconstrrelid;
    bool        tgdeferrable;
    bool        tginitdeferred;
    int16       tgnargs;
    int16       tgnattr;
    int16      *tgattr;
    char      **tgargs;
} Trigger;

¿©±â¼­,tgname°¡ Æ®¸®°ÅÀÇ À̸§,tgnargs°¡tgargs³»ÀÇ ÀμöÀÇ ¼ö, tgargs´ÂCREATE TRIGGER¹®À¸·Î ÁöÁ¤µÈ Àμö¿¡ ÀÖ´Â Æ÷ÀÎÅÍÀÇ ¹è¿­ÀÔ´Ï´Ù. ´Ù¸¥ ¸â¹ö´Â ³»ºÎ¿¡¼­¸¸ »ç¿ëµË´Ï´Ù.

tg_trigtuplebuf

tg_trigtuple¸¦ Æ÷ÇÔÇÑ ¹öÆÛÀÔ´Ï´Ù. ±×·¯ÇÑ Æ©ÇÃÀÌ Á¸ÀçÇÏÁö ¾Ê´Â °æ¿ì³ª µð½ºÅ© ¹öÆÛ³»¿¡ ÀúÀåµÇ¾î ÀÖÁö ¾ÊÀº °æ¿ì´ÂInvalidBufferÀÔ´Ï´Ù.

tg_newtuplebuf

tg_newtuple¸¦ Æ÷ÇÔÇÑ ¹öÆÛÀÔ´Ï´Ù. ±×·¯ÇÑ Æ©ÇÃÀÌ Á¸ÀçÇÏÁö ¾Ê´Â °æ¿ì³ª µð½ºÅ© ¹öÆÛ³»¿¡ ÀúÀåµÇ¾î ÀÖÁö ¾ÊÀº °æ¿ì´ÂInvalidBufferÀÔ´Ï´Ù.

Æ®¸®°Å ÇÔ¼ö´Â ¹Ýµå½Ã HeapTuple Æ÷ÀÎÅͳª NULL Æ÷ÀÎÅÍ( SQL Null °ªÀÌ ¾Æ´Õ´Ï´Ù . Áï, isNullÀ» true°ªÀ¸·Î Á¤ÇÏÁö ¸¶¼¼¿ä.)¸¦ ¹ÝÈ¯ÇØ¾ß ÇÕ´Ï´Ù. Á¶ÀÛ ´ë»óÀÇ ÇàÀ» º¯°æÇÏ°í ½ÍÁö ¾ÊÀº °æ¿ì´Â, tg_trigtuple³ªtg_newtupleÀ» ÀûÀýÇÏ°Ô µ¹·ÁÁÖ¼¼¿ä.