| PostgreSQL 8.3.3¹®¼ | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 34. Æ®¸®°Å | Fast Forward | Next |
º»Àý¿¡¼´Â Æ®¸®°Å ÇÔ¼ö¿ÍÀÇ ÀÎÅÍÆäÀ̽º¿¡ ´ëÇØ Àú·¹º§ÀÇ »ó¼¼Á¤º¸¸¦ ¼³¸íÇÕ´Ï´Ù. ÀÌ Á¤º¸´Â 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;
¸â¹ö´Â ¾Æ·¡¿Í °°ÀÌ Á¤Àǵǰí ÀÖ½À´Ï´Ù.
Ç×»óT_TriggerDataÀÔ´Ï´Ù.
±× ÇÔ¼ö°¡ ºÒ·Á °£ À̺¥Æ®¸¦ ¼³¸íÇÕ´Ï´Ù. tg_event¸¦ Á¶»çÇϱâ À§Çؼ ¾Æ·¡¿Í °°Àº ¸ÅÅ©·Î¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.
Æ®¸®°Å°¡ BEFORE·Î ¹ßÇàµÇ¾úÀ» °æ¿ì true°ªÀ» µ¹·ÁÁÝ´Ï´Ù.
Æ®¸®°Å°¡ AFTER·Î ¹ßÇàµÇ¾úÀ» °æ¿ì true°ªÀ» µ¹·ÁÁÝ´Ï´Ù.
Æ®¸®°Å°¡ Çà ¼öÁØÀÇ À̺¥Æ®·Î ¹ßÇàµÇ¾úÀ» °æ¿ì true°ªÀ» µ¹·ÁÁÝ´Ï´Ù.
Æ®¸®°Å°¡ ¹®Àå ¼öÁØÀÇ À̺¥Æ®·Î ¹ßÇàµÇ¾úÀ» °æ¿ì true°ªÀ» µ¹·ÁÁÝ´Ï´Ù.
Æ®¸®°Å°¡INSERT¸í·ÉÀ¸·Î ¹ßÇàµÇ¾úÀ» °æ¿ì true°ªÀ» µ¹·ÁÁÝ´Ï´Ù.
Æ®¸®°Å°¡UPDATE¸í·ÉÀ¸·Î ¹ßÇàµÇ¾úÀ» °æ¿ì true°ªÀ» µ¹·ÁÁÝ´Ï´Ù.
Æ®¸®°Å°¡DELETE¸í·ÉÀ¸·Î ¹ßÇàµÇ¾úÀ» °æ¿ì true °ªÀ» µ¹·ÁÁÝ´Ï´Ù.
Æ®¸®°Å°¡ »ý¼ºµÈ °ü°è¸¦ ±â¼úÇÏ´Â ±¸Á¶ÀÇ Æ÷ÀÎÅÍÀÔ´Ï´Ù. ÀÌ ±¸Á¶¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ °ÍÀº,utils/rel.h¸¦ ÂüÁ¶ÇØ ÁÖ¼¼¿ä. °¡Àå Èï¹Ì·Î¿î °ÍÀº,tg_relation->rd_att(°ü°è Æ©Çÿ¡ ´ëÇÑ ±â¼úÀÚ)°útg_relation->rd_rel->relnameÀÔ´Ï´Ù(°ü°è¸í, ÀÌ Å¸ÀÔÀº char*ÀÌ ¾Æ´Ï°íNameDataÀÔ´Ï´Ù. À̸§À» º¹»çÇÒ °æ¿ì´Â,char*¸¦ ¾ò±â À§ÇؼSPI_getrelname(tg_relation)¸¦ »ç¿ëÇØ ÁÖ¼¼¿ä).
Æ®¸®°Å°¡ »ý¼ºµÈ ÇàÀÇ Æ÷ÀÎÅÍÀÔ´Ï´Ù. À̰ÍÀº »ðÀÔ, »èÁ¦, ȤÀº °»½ÅµÇ´Â ÇàÀÔ´Ï´Ù. ¸¸¾àINSERT/DELETE·Î ÀÌ Æ®¸®°Å°¡ »ý¼ºµÇ¾úÀ» ¶§, ÀÌ ÇàÀ» ´Ù¸¥ °ÍÀ¸·Î ´ëüÇÏ°í ½ÍÁö ¾ÊÀº(INSERTÀÇ °æ¿ì) °æ¿ì³ª, ±× ÇàÀ» »ý·«ÇÏ°í ½ÍÁö ¾ÊÀº °æ¿ì´Â, À̰ÍÀ» ÀÌ ÇÔ¼ö·ÎºÎÅÍ ¹ÝÈ¯ÇØÁÖ¼¼¿ä.
Æ®¸®°Å°¡UPDATE·Î »ý¼ºµÇ¾úÀ» °æ¿ì´Â, ±× ÇàÀÇ »õ·Î¿î ¹öÀüÀÇ Æ÷ÀÎÅÍÀÔ´Ï´Ù. INSERTȤÀºDELETEÀÇ °æ¿ì´Â,NULLÀÔ´Ï´Ù. UPDATEÀ̺¥Æ® ¶§, ÀÌ ÇàÀ» ´Ù¸¥ °ÍÀ¸·Î ´ëüÇÏ°í ½ÍÁö ¾ÊÀº °æ¿ì³ª »ý·«ÇÏ°í ½ÍÁö ¾ÊÀº°æ¿ì´Â, À̰ÍÀ» ÀÌ ÇÔ¼ö·ÎºÎÅÍ ¹ÝÈ¯ÇØÁÖ¼¼¿ä.
ÀÌÇÏ¿Í °°ÀÌ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_trigtuple¸¦ Æ÷ÇÔÇÑ ¹öÆÛÀÔ´Ï´Ù. ±×·¯ÇÑ Æ©ÇÃÀÌ Á¸ÀçÇÏÁö ¾Ê´Â °æ¿ì³ª µð½ºÅ© ¹öÆÛ³»¿¡ ÀúÀåµÇ¾î ÀÖÁö ¾ÊÀº °æ¿ì´ÂInvalidBufferÀÔ´Ï´Ù.
tg_newtuple¸¦ Æ÷ÇÔÇÑ ¹öÆÛÀÔ´Ï´Ù. ±×·¯ÇÑ Æ©ÇÃÀÌ Á¸ÀçÇÏÁö ¾Ê´Â °æ¿ì³ª µð½ºÅ© ¹öÆÛ³»¿¡ ÀúÀåµÇ¾î ÀÖÁö ¾ÊÀº °æ¿ì´ÂInvalidBufferÀÔ´Ï´Ù.
Æ®¸®°Å ÇÔ¼ö´Â ¹Ýµå½Ã HeapTuple Æ÷ÀÎÅͳª NULL Æ÷ÀÎÅÍ( SQL Null °ªÀÌ ¾Æ´Õ´Ï´Ù . Áï, isNullÀ» true°ªÀ¸·Î Á¤ÇÏÁö ¸¶¼¼¿ä.)¸¦ ¹ÝÈ¯ÇØ¾ß ÇÕ´Ï´Ù. Á¶ÀÛ ´ë»óÀÇ ÇàÀ» º¯°æÇÏ°í ½ÍÁö ¾ÊÀº °æ¿ì´Â, tg_trigtuple³ªtg_newtupleÀ» ÀûÀýÇÏ°Ô µ¹·ÁÁÖ¼¼¿ä.