{"id":823,"date":"2022-03-13T05:30:12","date_gmt":"2022-03-12T20:30:12","guid":{"rendered":"http:\/\/www.onepage.co.kr\/wordpress\/?p=823"},"modified":"2022-03-13T06:48:42","modified_gmt":"2022-03-12T21:48:42","slug":"postgresql","status":"publish","type":"post","link":"https:\/\/www.onepage.co.kr\/wordpress\/index.php\/2022\/03\/13\/postgresql\/","title":{"rendered":"postgreSQL"},"content":{"rendered":"<table id=\"printPost1\" class=\"post-body\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"bcc\">\n<table class=\"post-top\">\n<tbody>\n<tr>\n<td class=\"p12\" valign=\"bottom\"><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div id=\"postViewArea\">\n<div id=\"post-view20150109357\" class=\"post-view pcol2 _param(1) _postViewArea20150109357\">\n<p>\uc774 \ubb38\uc11c\ub294 \ud3ec\uc2a4\ud2b8\uadf8\ub808\uc2a4\uc758 Index,function,trigger,grant,revoke,Large Object\ub97c \uc608\uc81c\uc640 \ud568\uaed8 \uc124\uba85\ud55c \uae00\uc774\ub2e4.<br \/>\n=====================================================================================<\/p>\n<p>=====================================================================================<br \/>\n1.INDEX, SEQUENCE, FUNCTION(1)<\/p>\n<p>1.1 CREATE INDEX<br \/>\nINDEX \ub294 \ub370\uc774\ud0c0\ubca0\uc774\uc2a4\ub0b4\uc758 relation(\ud14c\uc774\ube14)\uc5d0 \ub300\ud55c \uac80\uc0c9\uc758 \uc131\ub2a5\uc744 \ub192\uc5ec\uc900\ub2e4.<br \/>\nCREATE\u00a0 [UNIQUE]\u00a0 INDEX\u00a0 index_name<br \/>\nON\u00a0 table_name\u00a0 (name_of_attribute);<\/p>\n<p>CREATE\u00a0 [UNIQUE]\u00a0 INDEX\u00a0 index_name\u00a0 ON\u00a0 table_name<br \/>\n[USING\u00a0 acc_name] (column [ops_name] [,&#8230;]);<\/p>\n<p>CREATE\u00a0 [UNIQUE]\u00a0 INDEX\u00a0 index_name\u00a0 ON\u00a0 table_name<br \/>\n[USING\u00a0 acc_name] (func_name() ops_name );<\/p>\n<p>ACCESS METHOD . \ub514\ud3f4\ud2b8\ub294 BTREE \uc774\ub2e4.(BTREE,RTREE,HASH)<br \/>\nfunc_name\u00a0 :\u00a0 \uc0ac\uc6a9\uc790 \uc815\uc758 \ud568\uc218.<br \/>\nops_name\u00a0\u00a0 :\u00a0 operator class (int4_ops,int24_ops,int42_ops)<br \/>\nbtree(sid int4_ops) \ub294 btree \ub97c \uc774\uc6a9\ud55c INDEX \uc790\ub8cc\ud615\uc774 4-BYTE \uc815\uc218\uc784.<br \/>\n\ub514\ud3f4\ud2b8 operator class \ub294 Field Type \uc774\ub2e4.<br \/>\n\ud604\uc7ac btree \ub294 7\uac1c\uae4c\uc9c0\uc758 Multi-Column INDEX\ub97c \uc9c0\uc6d0\ud55c\ub2e4.<\/p>\n<p>INDEX \uc0dd\uc131 1<br \/>\nCREATE\u00a0 INDEX\u00a0 indx1<br \/>\nON\u00a0 supplier(sid);<br \/>\nsupplier\u00a0 relation(\ud14c\uc774\ube14) \uc758 sname attribute(column) \uc744\u00a0 INDEX \ub85c \uc9c0\uc815<\/p>\n<p>example 2) INDEX \uc0dd\uc131 2<\/p>\n<p>CREATE INDEX indx2<br \/>\nON supplier USING btree(sid int4_pos);<\/p>\n<p>example 3) INDEX \uc0dd\uc131 3<\/p>\n<p>CREATE INDEX indx3<br \/>\nON supplier USING btree(sid int8_ops);<\/p>\n<p>example 4) INDEX \uc0dd\uc131 4<\/p>\n<p>CREATE INDEX indx4<br \/>\nON supplier USING btree(sid, tid);<\/p>\n<p>example 5)\u00a0 INDEX\u00a0 \uc0ad\uc81c<\/p>\n<p>DROP INDEX indx1;<br \/>\nDROP INDEX indx2;<br \/>\nDROP INDEX indx3;<br \/>\nDROP INDEX indx4;<\/p>\n<p>=====================================================================================<br \/>\n1.2 CREATE SEQUENCE<br \/>\nSEQUENCE \ub294 \uc21c\ucc28\uc801\uc778 \uc22b\uc790 \ubc1c\uc0dd\uae30\uc774\ub2e4.<br \/>\nCREATE\u00a0 SEQUENCE\u00a0 seq_name [INCREMENT increment]<br \/>\n[MINVALUE\u00a0 minvalue]\u00a0 [MANVALUE\u00a0 maxvalue]<br \/>\n[START\u00a0 start]\u00a0 [CACHE\u00a0 cache]\u00a0 [CYCLE]<\/p>\n<p>INCREMENT : \uc774\uac12\uc774 -1 \uc774\uba74 -1 \ub9cc\ud07c \uac10\uc18c , 3 \uc774\uba74 3\uc529 \uc99d\uac00, \ub514\ud3f4\ud2b8\ub294 1 \uc774\ub2e4.<br \/>\nMAXVALUE\u00a0 : optional clause , \uc99d\uac00\ud560\uc218 \uc788\ub294 \ucd5c\uace0\uac12\uc744 \uba85\uc2dc\uc801\uc73c\ub85c \uc9c0\uc815<br \/>\nSTART\u00a0\u00a0\u00a0\u00a0 : \uc2dc\uc791\uac12<br \/>\nCACHE\u00a0\u00a0\u00a0\u00a0 : sequence \uac12\uc744 \uba3c\uc800 \uba54\ubaa8\ub9ac\uc5d0 \ud560\ub2f9\ud558\uc5ec \ube60\ub978 ACCESS \ub97c \uac00\ub2a5\ucf00 \ud55c\ub2e4.<br \/>\nCYCLE\u00a0\u00a0\u00a0\u00a0 : \ucd5c\uace0\uac12\uc73c\ub85c \uc99d\uac00\ub418\uba74 \ub2e4\uc2dc \ucd5c\uc18c\uac12\uc73c\ub85c \uc21c\ud658\ud558\uac8c \ud55c\ub2e4.<\/p>\n<p>CREATE\u00a0 SEQUENCE\u00a0 seq_name1 START 101;<br \/>\nSELECT\u00a0 NEXTVAL(&#8216;seq_name1);<\/p>\n<p>\uacb0\uacfc<\/p>\n<p>nextval<br \/>\n&#8212;&#8212;-<br \/>\n114<\/p>\n<p>=====================================================================================<br \/>\n1.3 CREATE FUNCTION<br \/>\nFUNCTION \uc740 \uc0c8\ub85c\uc6b4 \ud568\uc218\ub97c \uc815\uc758\ud55c\ub2e4.<br \/>\nCREATE\u00a0 FUNCTION\u00a0 func_name([type[,&#8230;]])<br \/>\nRETURNS\u00a0 return_type [with (attribute [,&#8230;])]<br \/>\nAS &#8216; definition &#8216;<br \/>\nLANGUAGE &#8216;language_name&#8217;;<\/p>\n<p>LANGUAGE : sql, pgsql, c \ub4f1\uc774 \uc788\ub2e4.<\/p>\n<p>CREATE\u00a0 FUNCTION\u00a0 test()\u00a0 RETURNS\u00a0 int4<br \/>\nAS &#8216; SELECT\u00a0 1 &#8216;<br \/>\nLANGUAGE &#8216;sql&#8217;;<\/p>\n<p>\uc2e4\ud589<br \/>\nSELECT\u00a0 test() AS\u00a0 answer;<\/p>\n<p>\uacb0\uacfc<br \/>\nanswer<br \/>\n&#8212;&#8212;<br \/>\n1<\/p>\n<p>AS &#8216; \uc640 &#8216; \uc0ac\uc774\uc5d0 \ud568\uc218\uc758 \ubcf8\ubb38\uc744 \uae30\uc785\ud558\uba74 \ub41c\ub2e4. \ucc38\uace0\ub85c \ubb38\uc790\uc5f4\uc77c \uacbd\uc6b0,<br \/>\n&#8216;seq_test1&#8217; \uc640 \uac19\uc740 \uacbd\uc6b0 \ub2e4\uc74c\ucc98\ub7fc \ud55c\ub2e4.<\/p>\n<p>CREATE\u00a0 FUNCTION\u00a0 test()\u00a0 RETURNS\u00a0 int4<br \/>\nAS\u00a0 &#8216; SELECT\u00a0 NEXTVAL(&#8221;seq_test1&#8221;) &#8216;<br \/>\nLANGUAGE\u00a0 &#8216;sql&#8217;;<\/p>\n<p>\uc5ec\uae30\uc11c NEXTVAL \uc740 SEQUENCE \uad00\ub828 \ub0b4\uc7a5\ud568\uc218\uc774\ub2e4.<\/p>\n<p>1.4 \uc608\uc81c<br \/>\n\ub2e4\uc74c \uc608\uc81c\uc758 \uc774\ub984\uc740 test.sql \uc785\ub2c8\ub2e4. \ub2e4\uc74c \uc608\uc81c\ub97c \ud654\uc77c\ub85c \ub9cc\ub4e4\uc5b4 \ub2e4\uc74c\ucc98\ub7fc \uc2e4\ud589\ud558\uc2dc\uba74 \ub429\ub2c8\ub2e4.<\/p>\n<p>\\i \/usr\/local\/src\/test.sql<br \/>\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-START !!<br \/>\n&#8211;drop\u00a0 all\u00a0 object\u00a0 for\u00a0 safe_test<br \/>\nDROP\u00a0 SEQUENCE\u00a0 seq_test1;<br \/>\nDROP\u00a0 SEQUENCE\u00a0 seq_test2;<br \/>\nDROP\u00a0 SEQUENCE\u00a0 seq_test3;<br \/>\nDROP\u00a0 INDEX\u00a0\u00a0\u00a0\u00a0 ind_test1;<br \/>\nDROP\u00a0 INDEX\u00a0\u00a0\u00a0\u00a0 ind_test2;<br \/>\nDROP\u00a0 INDEX\u00a0\u00a0\u00a0\u00a0 ind_test3;<br \/>\nDROP\u00a0 TABLE\u00a0\u00a0\u00a0\u00a0 tab_test1;<br \/>\nDROP\u00a0 TABLE\u00a0\u00a0\u00a0\u00a0 tab_test2;<br \/>\nDROP\u00a0 TABLE\u00a0\u00a0\u00a0\u00a0 tab_test3;<br \/>\nDROP\u00a0 FUNCTION\u00a0 func_test();<\/p>\n<p>&#8211;create\u00a0 sequence\u00a0 seq_test1,seq_test2,seq_test3<br \/>\nCREATE\u00a0 SEQUENCE\u00a0 seq_test1\u00a0 START\u00a0 101;<br \/>\nCREATE\u00a0 SEQUENCE\u00a0 seq_test2\u00a0 START\u00a0\u00a0\u00a0 1;<br \/>\nCREATE\u00a0 SEQUENCE\u00a0 seq_test3\u00a0 START\u00a0\u00a0\u00a0 1;<\/p>\n<p>&#8211;create table tab_test1,tab_test2,tab_test3<br \/>\nCREATE\u00a0 TABLE\u00a0 tab_test1(<br \/>\ntab1_id\u00a0 \u00a0 bigint\u00a0 NOT NULL,<br \/>\ntab1_name\u00a0 text,<br \/>\ntab1_tel\u00a0\u00a0 text,<br \/>\nteb1_memo\u00a0 text<br \/>\n);<\/p>\n<p>CREATE\u00a0 TABLE\u00a0 tab_test2(<br \/>\ntab2_id\u00a0 \u00a0 bigint\u00a0 NOT NULL,<br \/>\ntab2_name\u00a0 text,<br \/>\ntab2_tel\u00a0\u00a0 text,<br \/>\nteb2_memo\u00a0 text<br \/>\n);<\/p>\n<p>CREATE\u00a0 TABLE\u00a0 tab_test3(<br \/>\ntab3_id\u00a0 \u00a0 bigint DEFAULT\u00a0 nextval(&#8216;seq_test3&#8217;) NOT NULL,<br \/>\ntab3_name\u00a0 text,<br \/>\ntab3_tel\u00a0\u00a0 text,<br \/>\ntab3_memo\u00a0 text<br \/>\n);<\/p>\n<p>&#8211;craete\u00a0 index<br \/>\nCREATE\u00a0 UNIQUE\u00a0 INDEX\u00a0\u00a0 ind_test1\u00a0 ON\u00a0 tab_test1(tab1_id);<br \/>\nCREATE\u00a0 UNIQUE\u00a0 INDEX\u00a0\u00a0 ind_test2\u00a0 ON\u00a0 tab_test2(tab2_id);<br \/>\nCREATE\u00a0 UNIQUE\u00a0 INDEX\u00a0\u00a0 ind_test3\u00a0 ON\u00a0 tab_test3\u00a0 USING\u00a0 btree(tab3_id\u00a0 int4_ops);<\/p>\n<p>&#8211;FUNCTION\u00a0 func_test()<br \/>\nCREATE\u00a0 FUNCTION\u00a0 func_test()\u00a0 RETURNS\u00a0 bigint<br \/>\nAS\u00a0 &#8216; SELECT NEXTVAL(&#8221;seq_test1&#8221;) &#8216;<br \/>\nLANGUAGE &#8216;sql&#8217;;<\/p>\n<p>&#8211;transaction 1<br \/>\nBEGIN;<br \/>\nINSERT\u00a0 INTO\u00a0 tab_test1\u00a0 VALUES (func_test(),&#8217;jini1&#8242;,&#8217;000-0000&#8242;,&#8217;No_Memo1&#8242;);<br \/>\nINSERT\u00a0 INTO\u00a0 tab_test2\u00a0 VALUES (nextval(&#8216;seq_test2&#8242;),&#8217;winob1&#8242;,&#8217;000-0001&#8242;,&#8217;No_Memo1&#8217;);<br \/>\nINSERT\u00a0 INTO\u00a0 tab_test3\u00a0 (tab3_name,tab3_tel,tab3_memo)<br \/>\nVALUES (&#8216;nogadax1&#8242;,&#8217;000-0003&#8242;,&#8217;No_Memo1&#8242;);<\/p>\n<p>INSERT\u00a0 INTO\u00a0 tab_test1\u00a0 VALUES (func_test(),&#8217;jini2&#8242;,&#8217;100-0000&#8242;,&#8217;No_Memo2&#8217;);<br \/>\nINSERT\u00a0 INTO\u00a0 tab_test2\u00a0 VALUES (nextval(&#8216;seq_test2&#8242;),&#8217;winob2&#8242;,&#8217;100-0001&#8242;,&#8217;No_Memo2&#8217;);<br \/>\nINSERT\u00a0 INTO\u00a0 tab_test3\u00a0 (tab3_name,tab3_tel,tab3_memo)<br \/>\nVALUES (&#8216;nogadax2&#8242;,&#8217;100-0003&#8242;,&#8217;No_Memo2&#8242;);<\/p>\n<p>INSERT\u00a0 INTO\u00a0 tab_test1\u00a0 VALUES (func_test(),&#8217;jini3&#8242;,&#8217;200-0000&#8242;,&#8217;No_Memo3&#8217;);<br \/>\nINSERT\u00a0 INTO\u00a0 tab_test2\u00a0 VALUES (nextval(&#8216;seq_test2&#8242;),&#8217;winob3&#8242;,&#8217;200-0001&#8242;,&#8217;No_Memo3&#8217;);<br \/>\nINSERT\u00a0 INTO\u00a0 tab_test3\u00a0 (tab3_name,tab3_tel,tab3_memo)<br \/>\nVALUES (&#8216;nogadax3&#8242;,&#8217;200-0003&#8242;,&#8217;No_Memo3&#8242;);<\/p>\n<p>INSERT\u00a0 INTO\u00a0 tab_test1\u00a0 VALUES (func_test(),&#8217;jini4&#8242;,&#8217;300-0000&#8242;,&#8217;No_Memo4&#8217;);<br \/>\nINSERT\u00a0 INTO\u00a0 tab_test2\u00a0 VALUES (nextval(&#8216;seq_test2&#8242;),&#8217;winob4&#8242;,&#8217;300-0001&#8242;,&#8217;No_Memo4&#8217;);<br \/>\nINSERT\u00a0 INTO\u00a0 tab_test3\u00a0 (tab3_name,tab3_tel,tab3_memo)<br \/>\nVALUES (&#8216;nogadax4&#8242;,&#8217;300-0003&#8242;,&#8217;No_Memo4&#8242;);<\/p>\n<p>INSERT\u00a0 INTO\u00a0 tab_test1\u00a0 VALUES (func_test(),&#8217;jini5&#8242;,&#8217;400-0000&#8242;,&#8217;No_Memo5&#8217;);<br \/>\nINSERT\u00a0 INTO\u00a0 tab_test2\u00a0 VALUES (nextval(&#8216;seq_test2&#8242;),&#8217;winob5&#8242;,&#8217;400-0001&#8242;,&#8217;No_Memo5&#8217;);<br \/>\nINSERT\u00a0 INTO\u00a0 tab_test3\u00a0 (tab3_name,tab3_tel,tab3_memo)<br \/>\nVALUES (&#8216;nogadax5&#8242;,&#8217;400-0003&#8242;,&#8217;No_Memo5&#8217;);<\/p>\n<p>END;<\/p>\n<p>&#8211;transaction 2<br \/>\nBEGIN;<br \/>\nSELECT * FROM tab_test1;<br \/>\nSELECT * FROM tab_test2;<br \/>\nSELECT * FROM tab_test3;<br \/>\nVACUUM VERBOSE ANALYZE tab_test1;<br \/>\nVACUUM VERBOSE ANALYZE tab_test2;<br \/>\nVACUUM VERBOSE ANALYZE tab_test3;<br \/>\nEND;<\/p>\n<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-End !!<\/p>\n<p>=====================================================================================<br \/>\n2. GRANT and REVOKE<br \/>\n2.1 GRANT<br \/>\nGRANT\ub294 user,group \ud639\uc740 \ubaa8\ub4e0 user\ub4e4\uc5d0\uac8c \ud574\ub2f9 \uac1d\uccb4\uc5d0 \ub300\ud55c \uc0ac\uc6a9\uad8c\ud55c\uc744 \uc2b9\uc778\ud55c\ub2e4.<br \/>\nREVOKE\ub294 user,group \ud639\uc740 \ubaa8\ub4e0 user\ub85c\ubd80\ud130 \uac1d\uccb4\uc5d0 \ub300\ud55c \uc0ac\uc6a9\uad8c\ud55c\uc744 \ubb34\ud6a8\ud654\ud55c\ub2e4.<\/p>\n<p>GRANT privilege [,&#8230;] ON object [,&#8230;]<br \/>\nTO { PUBLIC | GROUP group | username}<\/p>\n<p>privilege<br \/>\nSELECT : \ud2b9\uc815 TABLE\/VIEW \uc758 column\uc5d0 \ub300\ud55c access \uc744 \uc2b9\uc778<br \/>\nINSERT : \ud2b9\uc815 TABLE\uc758 \ubaa8\ub4e0 column \uc5d0 \ub370\uc774\ud0c0\uc758 \uc0bd\uc785\uc5d0 \ub300\ud55c \uad8c\ud55c \uc2b9\uc778<br \/>\nUPDTAE : \ud2b9\uc815 TABLE\uc758 \ubaa8\ub4e0 column \uc758 \uac31\uc2e0\uc5d0 \ub300\ud55c \uad8c\ud55c \uc2b9\uc778<br \/>\nDELETE : \ud2b9\uc815 TABLE \uc758 row \uc758 \uc0ad\uc81c\uc5d0 \ub300\ud55c \uad8c\ud55c \uc2b9\uc778<br \/>\nRULE : \ud2b9\uc815 TABLE\/VIEW\uc5d0 \ub300\ud55c rule \uc744 \uc815\uc758\ud558\ub294 \uad8c\ud55c\uc5d0 \ub300\ud55c \uc2b9\uc778<br \/>\nALL : \ubaa8\ub4e0 \uad8c\ud55c\uc744 \uc2b9\uc778\ud55c\ub2e4.<\/p>\n<p>object<br \/>\naccess \ub97c \uc2b9\uc778\ud558\ub294 \uac1d\uccb4\uc758 \uc774\ub984\uc73c\ub85c\uc11c \ub2e4\uc74c\uacfc \uac19\uc740 \uac1d\uccb4\ub4e4\uc774 \uc788\ub2e4.<\/p>\n<p>Table<br \/>\nSequence<br \/>\nView<br \/>\nIndex<\/p>\n<p>PUBLIC<br \/>\n\ubaa8\ub4e0 \uc720\uc800\ub97c \uc2b9\uc778<\/p>\n<p>GROUP group<br \/>\n\uc0ac\uc6a9 \uad8c\ud55c\uc744 \ud68d\ub4dd\ud560 group\uc744 \uc9c0\uc815, group \uc744 \uba85\uc2dc\uc801\uc73c\ub85c \uc0dd\uc131\ub418\uc5b4\uc838 \uc788\uc5b4\uc57c \ud568.<\/p>\n<p>username<br \/>\n\uc0ac\uc6a9\uad8c\ud55c\uc744 \ud68d\ub4dd\ud560 \uc0ac\uc6a9\uc790\uba85. PUBLIC \uc740 \ubaa8\ub4e0 \uc720\uc800\uc5d0 \ub300\ud574\uc11c \uc801\uc6a9\ub41c\ub2e4.<\/p>\n<p>Description<br \/>\nGRANT \ub294 \uac1d\uccb4 (object) \ub97c \uc0dd\uc131\ud55c \uc720\uc800\uac00 \ubaa8\ub4e0 \uc720\uc800, \ud639\uc740 \uac1c\uc778 \uc720\uc800, \ud639\uc740 \uadf8\ub8f9\uc5d0 \ub300\ud574<br \/>\n\ud574\ub2f9 \uac1d\uccb4\uc758 \uc0ac\uc6a9 \uad8c\ud55c\uc744 \ud5c8\uc6a9\ud558\ub3c4\ub85d \ud55c\ub2e4. \uac1d\uccb4\ub97c \uc0dd\uc131\ud55c \uc720\uc800\uac00 \uc544\ub2cc \ub2e4\ub978 \uc720\uc800\ub4e4\uc740 \uadf8<br \/>\n\uac1d\uccb4\uc5d0 \ub300\ud55c \uc0ac\uc6a9\uad8c\ud55c\uc774 \uc5c6\uc5b4\uc11c \uc0ac\uc6a9\ud560 \uc218\uac00 \uc5c6\ub2e4. \ub2e8\uc9c0 \uadf8 \ud574\ub2f9 \uac1d\uccb4\ub97c \uc0dd\uc131\ud55c \uc720\uc800\ub9cc\uc774<br \/>\n\uc774\ub97c \ud5c8\uc6a9\ud560 \uc218 \uac00 \uc788\ub294\ub370 \uc774\ub294 GRANT \ub97c \uc0ac\uc6a9\ud568\uc73c\ub85c\uc11c \ub2e4\ub978 \uc720\uc800\ub4e4\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d<br \/>\n\ud5c8\uc6a9\ud55c\ub2e4. \uc5b4\ub5a4 \uac1d\uccb4\ub97c \uc0dd\uc131\ud55c \uc720\uc800\ub294 \uc790\ub3d9\uc801\uc73c\ub85c \ubaa8\ub4e0 \uad8c\ud55c\uc744 \uac00\uc9c0\uba70 \uc774 \uad8c\ud55c\ub4e4\uc740 SELECT<br \/>\nINSERT, UPDATE, DELETE, RULE \ub4f1\uc774\uba70 \ub610\ud55c \uadf8 \uac1d\uccb4 \uc790\uccb4\ub97c \uc0ad\uc81c\ud560 \uc218 \uc788\ub2e4.<\/p>\n<p>Notes<br \/>\npsql \uc5d0\uc11c &#8220;\\z&#8221; \ub97c \uc0ac\uc6a9\ud558\uc5ec \uc874\uc7ac\ud558\ub294 \uac1d\uccb4\uc5d0 \ub300\ud55c permission \ub4f1\uc744 \ucc38\uc870\ud560 \uc218 \uc788\ub2e4.<\/p>\n<p>permission \uc815\ubcf4\uc758 \ud615\uc2dd<br \/>\nusername=arwR : \uc720\uc800\uc5d0\uac8c \uc2b9\uc778\ub41c \uc0ac\uc6a9\uad8c\ud55c<br \/>\ngroup gname=arwR : GROUP \uc5d0\uac8c \uc2b9\uc778\ub41c \uc0ac\uc6a9\uad8c\ud55c<br \/>\n=arwR : \ubaa8\ub4e0 \uc720\uc800\uc5d0\uac8c \uc2b9\uc778\ub41c \uc0ac\uc6a9\uad8c\ud55c<\/p>\n<p>a : INSERT privilege<br \/>\nr : SELECT privilege<br \/>\nw : UPDATE\/DELETE privilege<br \/>\nR : RULE privilege<br \/>\narwR : ALL privilege<\/p>\n<p>USAGE(\uc0ac\uc6a9\uc608)<br \/>\nGRANT INSERT ON imsi_table TO PUBLIC<\/p>\n<p>GRANT ALL ON imsi_table TO nogadax<\/p>\n<p>2.2 REVOKE<br \/>\n\uc720\uc800,\uadf8\ub8f9, \ud639\uc740 \ubaa8\ub4e0 \uc720\uc800\ub85c\ubd80\ud130 access privilege \ub97c \ucde8\uc18c<\/p>\n<p>REVOKE privilege [,&#8230;]<br \/>\nON object [,&#8230;]<br \/>\nFROM { PUBLIC | GROUP gname | username }<\/p>\n<p>privilege<br \/>\nSELECT ,INSERT ,UPDATE, DELETE, RULE, ALL<\/p>\n<p>object<br \/>\n\uc801\uc6a9\ub420 \uc218 \uc788\ub294 \uac1d\uccb4 : table, view, sequence, index<\/p>\n<p>group<br \/>\nprivilege \ub97c \ucde8\uc18c\ud560 \uadf8\ub8f9\uba85<\/p>\n<p>username<br \/>\nPUBLIC<\/p>\n<p>Description<br \/>\nREVOKE \ub294 \uac1d\uccb4\uc758 \uc0dd\uc131\uc790\uac00 \ubaa8\ub4e0 \uc720\uc800, \uc720\uc800, \uadf8\ub8f9\ub4e4\ub85c\ubd80\ud130 \uc804\uc5d0 \uc2b9\uc778\ud588\ub358 \ud37c\ubbf8\uc158\uc744<br \/>\n\ud574\uc81c\ud55c\ub2e4.<br \/>\nUSAGE(\uc0ac\uc6a9\uc608)<br \/>\nREVOKE INSERT ON imsi_table FROM PUBLIC<\/p>\n<p>REVOKE ALL ON imsi_table FROM nogadax<br \/>\n3. TRIGGER<br \/>\n3.1 TRIGGER 1<\/p>\n<p>CREATE\u00a0 TRIGGER\u00a0 name\u00a0 { BEFORE | AFTER } { event [ OR &#8230;]}<br \/>\nON\u00a0 table\u00a0 FOR\u00a0 EACH\u00a0 { ROW\u00a0 |\u00a0 STATEMENT }<br \/>\nEXECUTE\u00a0 PROCEDURE\u00a0 func_name ( )<\/p>\n<p>event\u00a0\u00a0\u00a0\u00a0 : INPUT , UPDATE , DELETE \ub4f1\uc774 \uc62c \uc218 \uc788\ub2e4.<br \/>\nfunc_name : \uc0ac\uc6a9\uc790 \uc815\uc758 \ud568\uc218\uc774\ub2e4. plpgsql \uc744 \uad8c\uc7a5\ud558\uace0 \uc2f6\ub2e4.<br \/>\n\ub610\ud55c \uc774 \ud568\uc218\uc5d0\ub294 \uc778\uc790\uac00 \ub4e4\uc5b4\uc62c \uc218 \uc5c6\ub2e4.<br \/>\n\ub610\ud55c \uc774 \ud568\uc218\uc758 RETURN TYPE \ub85c\ub294 OPAQUE \uc774\uc5b4\uc57c \ud55c\ub2e4.<br \/>\n\uc778\uc218\ub97c \uc704\ud574 TRIGGER \uc758 \uc790\uccb4 \ubcc0\uc218\ub97c \uc0ac\uc6a9\ud558\uc5ec\uc57c \ud55c\ub2e4.<br \/>\n(new,old,&#8230;)<\/p>\n<p>TRIGGER \ub97c\u00a0 \ucd0c\uc2a4\ub7fd\uac8c \ud45c\ud604\ud558\uc790\uba74 \ubc29\uc544\uc1e0\ub97c \ub2f9\uae30\uba74 \ucd1d\uc54c\uc774 \ub098\uac00\ub294 \uac83\uc5d0 \ube44\uc720\ud560 \uc218 \uc788\ub2e4.<br \/>\nTRIGGER \uc740 TUPLE(ROW or RECORD) \uc5d0 \ub300\ud55c\u00a0 INSERT, UPDATE, DELETE \ub97c \uc0ac\uac74(event) \ub85c<br \/>\n\ubcf4\uace0 \uc774 \uc0ac\uac74\uc5d0 \uc815\uc758\ub41c \uc5b4\ub5a4 \ud589\ub3d9\uc73c\ub85c \ubc18\uc751\ud558\ub294 \uac83\uc774\ub2e4.&amp;#65533;<\/p>\n<p>example<br \/>\nCREATE\u00a0\u00a0 TRIGGER\u00a0\u00a0\u00a0 trg_test<br \/>\nBEFORE\u00a0\u00a0 DELETE\u00a0\u00a0\u00a0\u00a0 OR\u00a0\u00a0 UPDATE\u00a0 ON\u00a0 supplier\u00a0 FOR\u00a0 EACH\u00a0 ROW<br \/>\nEXECUTE\u00a0 PROCEDURE\u00a0 check_sup();<\/p>\n<p>supplier \ud14c\uc774\ube14\uc5d0 DELETE, UPDATE \uac00 \ubc1c\uc0dd\ud558\uba74 \uc774 \ub3d9\uc791\uc774 \ud589\ud574\uc9c0\uae30 \uc804\uc5d0<br \/>\ncheck_sup() \ub97c \uc2e4\ud589\ud558\ub77c. \uc774 TRIGGER \uc758 \uc774\ub984\uc740 trg_test \uc774\ub2e4.<br \/>\nplpgsql \ub9db\ubcf4\uae30<br \/>\nCREATE\u00a0 FUNCTION\u00a0 func_name() RETURNS type<br \/>\nAS &#8216;<br \/>\n[DECLARE\u00a0 declarations]<br \/>\nBEGIN<br \/>\nstatements<br \/>\nEND;<br \/>\n&#8216;LANGUAGE &#8216;plpgsql&#8217;;<\/p>\n<p>example<br \/>\nCREATE\u00a0 FUNCTION\u00a0 pgsql_test() RETURNS\u00a0 datetime<br \/>\nAS &#8216;<br \/>\nDECLARE\u00a0 curtime\u00a0 datetime;<br \/>\nBEGIN<br \/>\ncurtime:= &#8221;now&#8221;;<br \/>\nreturn\u00a0 curtime;<br \/>\nEND;<br \/>\n&#8216; LANGUAGE &#8216;plpgsql&#8217;;<\/p>\n<p>3.2 TRIGGER \uc2e4\ud589\uc744 \uc704\ud55c PL\/pgSQL\ub4f1\ub85d \ubc29\ubc95<br \/>\n\ub2e4\uc74c\uc740 \uc2e4\ud589 \uc608\uc81c\uc774\ub2e4. \uc6b0\uc120 \ub2e4\uc74c \uc608\uc81c\ub97c \uc801\uc808\ud788 \ubcf5\uc0ac\ub97c \ud574\uc11c \ud30c\uc77c\ub85c \ub9cc\ub4e0\ub2e4.(\uc608 : trg.sql)<br \/>\n\ub2e4\uc74c \uc608\uc81c\ub97c \uc2e4\ud589\uc5d0 \uc55e\uc11c \uba3c\uc800 \ud574\uc57c\ud560 \uc77c\uc774 \uc788\ub294\ub370 \uadf8\uac83\uc740 Procedural Languages \ub97c \ub4f1\ub85d\ud558\ub294 \uac83\uc774\ub2e4.<br \/>\n\ub2e4\uc74c\uc608\uc81c\uc5d0\ub294 PL\/pgSQL \uc744 \uc774\uc6a9\ud55c \ud568\uc218\ub97c \uc0ac\uc6a9\ud558\ubbc0\ub85c \uc774\uac83\uc744 \ub4f1\ub85d\ud558\ub294 \uac83\uc740 \ud544\uc218\uc774\ub2e4.<\/p>\n<p>\ubc29\ubc95\uc740 \ub450\uac00\uc9c0\uac00 \uc788\ub2e4.<br \/>\n1. template1 \ub370\uc774\ud0c0 \ubca0\uc774\uc2a4\uc5d0 \ub4f1\ub85d\ud558\ub294 \uac83\uc774\ub2e4. \uc774 \ub370\uc774\ud0c0\ubca0\uc774\uc2a4\uc5d0 \ub4f1\ub85d\uc774 \ub41c\ud6c4<br \/>\ntemplate1 \ub370\uc774\ud0c0\ubca0\uc774\uc2a4\uc5d0\uc11c create database \uba85\ub839\uc73c\ub85c \ub370\uc774\ud0c0\ubca0\uc774\uc2a4\ub97c \uc0dd\uc131\ud558\uba74 \uc790\ub3d9\uc801\uc73c\ub85c<br \/>\n\uc0dd\uc131\ub41c \ub370\uc774\ud0c0\ubca0\uc774\uc2a4\uc5d0 PL\/pgSQL\uc774 \ub4f1\ub85d\uc774 \ub418\ubbc0\ub85c \ud3b8\ub9ac\ud558\ub2e4.<br \/>\n\ub4f1\ub85d\uc5d0 \uc55e\uc11c \ub2e4\uc74c\uc744 \ud655\uc778\ud558\ub77c.<\/p>\n<p>postgreSQL\uc758 PATH : \uc5ec\uae30\uc11c\uc758 PATH \ub294 \/usr\/local\/pgsql \uc774\ub2e4. \ub610\ud55c pgsql \ub514\ub809\ud1a0\ub9ac \ubc11\uc758<br \/>\nlib \ub514\ub809\ud1a0\ub9ac\uc5d0\uc11c plpgsql.so \ub97c \ud655\uc778\ud558\ub77c. \uc544\ub9c8\ub3c4 \uc774 \ud654\uc77c\uc740 \ub2e4 \uc874\uc7ac\ud560 \uac83\uc774\ub2e4.<\/p>\n<p>\ub4f1\ub85d \uacfc\uc815<\/p>\n<p>[postgres@nogadax postgres]# psql\u00a0 template1<br \/>\ntemplate1=&amp;gt;<br \/>\ntemplate1=&amp;gt; CREATE\u00a0 FUNCTION\u00a0 plpgsql_call_handler()\u00a0 RETURNS\u00a0 OPAQUE\u00a0 AS<br \/>\ntemplate1-&amp;gt; &#8216;\/usr\/local\/pgsql\/lib\/plpgsql.so&#8217;\u00a0 LANGUAGE\u00a0 &#8216;c&#8217;;<br \/>\ntemplate1=&amp;gt;<br \/>\ntemplate1=&amp;gt; CREATE\u00a0 TRUSTED\u00a0 PROCEDURAL\u00a0 LANGUAGE\u00a0 &#8216;plpgsql&#8217;<br \/>\ntemplate1-&amp;gt; HANDLER\u00a0 plpgsql_call_handler<br \/>\ntemplate1-&amp;gt; LANCOMPILER\u00a0 &#8216;PL\/pgSQL&#8217;;<br \/>\ntemplate1=&amp;gt; CREATE\u00a0 DATABASE\u00a0 nogadax;<br \/>\ntemplate1=&amp;gt; \\q<br \/>\n[postgres@nogadax postgres]#<br \/>\n2. \ub2e4\uc74c \ubc29\ubc95\uc740 \uc0dd\uc131\ud55c \ub370\uc774\ud0c0\ubca0\uc774\uc2a4\ub9c8\ub2e4 \ud558\ub098\ud558\ub098 \ub2e4 \ub4f1\ub85d\uc744 \ud558\ub294 \uac83\uc774\ub2e4.<\/p>\n<p>\ub4f1\ub85d \uacfc\uc815<\/p>\n<p>[postgres@nogadax postgres]# psql\u00a0 nogadax<br \/>\nnogadax=&amp;gt;<br \/>\nnogadax=&amp;gt; CREATE\u00a0 FUNCTION\u00a0 plpgsql_call_handler()\u00a0 RETURNS\u00a0 OPAQUE\u00a0 AS<br \/>\nnogadax-&amp;gt; &#8216;\/usr\/local\/pgsql\/lib\/plpgsql.so&#8217;\u00a0 LANGUAGE\u00a0 &#8216;c&#8217;;<br \/>\nnogadax=&amp;gt;<br \/>\nnogadax=&amp;gt; CREATE\u00a0 TRUSTED\u00a0 PROCEDURAL\u00a0 LANGUAGE\u00a0 &#8216;plpgsql&#8217;<br \/>\nnogadax-&amp;gt; HANDLER\u00a0 plpgsql_call_handler<br \/>\nnogadax-&amp;gt; LANCOMPILER\u00a0 &#8216;PL\/pgSQL&#8217;;<br \/>\nnogadax=&amp;gt;<br \/>\nnogadax=&amp;gt; \\q<br \/>\n[postgres@nogadax postgres]#<br \/>\n\uc774\uc81c\ub294 \uc704\uc758 \ub450\uac00\uc9c0 \ubc29\ubc95\uc911 \ud558\ub098\ub97c \uc120\ud0dd\ud558\uc5ec \ub4f1\ub85d\uc744 \ud558\uba74 \ub41c\ub2e4.<\/p>\n<p>3.3 TRIGGER \uc608\uc81c 1<br \/>\n\ub2e4\uc74c\uc740 \uc544\ub798 \uc608\uc81c\ub97c \uc2e4\ud589\ud558\ub294 \ubc29\ubc95\uc774\ub2e4.<\/p>\n<p>[podtgres@nogadax postgres]$ psql\u00a0 nogadax<br \/>\nnogadax=&amp;gt; \\i\u00a0 \/home\/postgres\/trg.sql<br \/>\n&#8230;..<br \/>\n&#8230;..<\/p>\n<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-Cut here!!<br \/>\n&#8211;coded\u00a0 BY\u00a0 NoGaDa-X\u00a0 2000\/02\/19<\/p>\n<p>&#8211;DROP all Object for safe_test<br \/>\nDROP FUNCTION ins_row();<br \/>\nDROP TRIGGER trg_test ON test1;<br \/>\nDROP TABLE\u00a0 test1;<br \/>\nDROP TABLE\u00a0 test2;<\/p>\n<p>&#8211;Create Table<br \/>\nCREATE\u00a0 TABLE\u00a0 test1(<br \/>\ntab1_id\u00a0\u00a0\u00a0 int4,<br \/>\ntab1_name\u00a0 text<br \/>\n);<\/p>\n<p>CREATE\u00a0 TABLE\u00a0 test2(<br \/>\ntab2_id\u00a0\u00a0\u00a0 int4,<br \/>\ntab2_memo\u00a0 text\u00a0 DEFAULT &#8216;None&#8217;<br \/>\n);<br \/>\n&#8211;Create Function<br \/>\nCREATE\u00a0 FUNCTION ins_row() RETURNS OPAQUE<br \/>\nAS &#8216;<br \/>\nBEGIN<br \/>\nINSERT INTO test2(tab2_id) VALUES(new.tab1_id);<br \/>\nRETURN new;<br \/>\nEND;<br \/>\n&#8216; LANGUAGE &#8216;plpgsql&#8217;;<br \/>\n&#8211;Create Trigger<br \/>\nCREATE\u00a0 TRIGGER\u00a0 trg_test<br \/>\nAFTER\u00a0\u00a0 INSERT\u00a0\u00a0 ON test1 FOR\u00a0 EACH\u00a0 ROW<br \/>\nEXECUTE PROCEDURE\u00a0\u00a0 ins_row();<br \/>\n&#8211;INSERT\u00a0 Transaction<br \/>\nBEGIN;<br \/>\nINSERT\u00a0 INTO\u00a0 test1 values(1,&#8217;nogadax&#8217;);<br \/>\nINSERT\u00a0 INTO\u00a0 test1 values(2,&#8217;winob&#8217;);<br \/>\nINSERT\u00a0 INTO\u00a0 test1 values(3,&#8217;diver708&#8242;);<br \/>\nINSERT\u00a0 INTO\u00a0 test1 values(4,&#8217;jini&#8217;);<br \/>\nINSERT\u00a0 INTO\u00a0 test1 values(5,&#8217;opensys&#8217;);<br \/>\nINSERT\u00a0 INTO\u00a0 test1 values(6,&#8217;Linuz&#8217;);<br \/>\nEND;<\/p>\n<p>&#8211;SELECT TRACTION<br \/>\nBEGIN;<br \/>\nSELECT\u00a0 *\u00a0 FROM\u00a0 test1;<br \/>\nSELECT\u00a0 *\u00a0 FROM\u00a0 test2;<br \/>\nEND;<\/p>\n<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-End !!<\/p>\n<p>3.4 TRIGGER 2<br \/>\nCREATE TRIGGER<br \/>\nCREATE\u00a0 TRIGGER\u00a0 trigger_name\u00a0 { BEFORE | AFTER } { event [OR,&#8230;] }<br \/>\nON\u00a0 table\u00a0 FOR\u00a0 EACH\u00a0 { ROW | STATEMENT }<br \/>\nEXECUTE\u00a0 PROCEDURE\u00a0 funcname ();<\/p>\n<p>trigger_name : TRIGGER \uc758 \uc774\ub984<br \/>\ntable\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 : Table \uc758 \uc774\ub984<br \/>\nevent\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 : INSERT , DELETE , UPDATE \ub4e4 \uc911\uc5d0\uc11c \ud558\ub098 \ud639\uc740 \ub450\uc138\uac1c\ub97c<br \/>\nTRIGGER \ub97c \uae30\ub3d9\uc2dc\ud0a4\uae30 \uc704\ud55c event \ub85c \ubd04<br \/>\n( \uc608 : INSERT OR UPDATE )<br \/>\nfunc_name\u00a0\u00a0\u00a0 : user \uac00 \uc81c\uacf5\ud55c \ud568\uc218. \uc774 \ud568\uc218\ub294 \ud2b8\ub9ac\uac70\uac00 \uc0dd\uc131\ub418\uae30 \uc804\uc5d0 \ub9cc\ub4e4\uc5b4\uc838\uc57c \ud55c\ub2e4.<br \/>\n\ub610\ud55c, \uc774 \ud568\uc218\uc758 return \ud615\uc740\u00a0 opaque\uc774\uba70 \uc778\uc218\uac00 \uc5c6\uc5b4\uc57c \ud55c\ub2e4.<br \/>\n(\uc774 \ubd80\ubd84\uc740 PostgreSQL Programmer&#8217;s Guide \uc5d0 \ub098\uc640 \uc788\ub294 \ubd80\ubd84\uc778\ub370 function<br \/>\n\uc5d0\uc11c \uc65c \uc778\uc218\uac00 \uc4f0\uc774\uba74 \uc548\ub418\ub294\uc9c0 \uadf8\ub9ac\uace0 opaque \ud615\uc758 \ub9ac\ud134 \uac12\ub9cc \ub418\ub294\uc9c0 \ub97c<br \/>\n\uc815\ud655\ud788 \uc124\uba85\ud55c \ubd80\ubd84\uc774 \uc5c6\ub2e4.)<br \/>\n&#8220;CREATE TRIGGER&#8221;\ub85c \uc778\ud574 TRIGGER \uac00 \uc131\uacf5\uc801\uc73c\ub85c \uc0dd\uc131\ub418\uba74 CREATE \ub77c\ub294<br \/>\n\uba54\uc2dc\uc9c0\uac00 \ucd9c\ub825\ub41c\ub2e4.<\/p>\n<p>DESCRIPTION<br \/>\nCREATE TRIGGER\uc740 \ud604\uc7ac\uc758 \ub370\uc774\ud0c0\ubca0\uc774\uc2a4\uc5d0 \uc0c8\ub85c\uc6b4 TRIGGER\uc744 \ub4f1\ub85d\ud560 \uac83\uc774\ub2e4.Trigger<br \/>\n\uc740 \ud14c\uc774\ube14(\ub9b4\ub808\uc774\uc158)\uacfc \uc5f0\uacc4\ub418\uc5b4\uc11c \ubbf8\ub9ac \uaddc\uc815\ub41c \ud568\uc218 func_name\uc744 \uc2e4\ud589\ud55c\ub2e4.<br \/>\n\ud2b8\ub9ac\uac70\ub294 \ud2b8\ub9ac\uac70\uc758 \uc0dd\uc131\uc2dc\u00a0 BEFORE\ud0a4\ub97c \uc0ac\uc6a9\ud558\uc5ec Tuple(row,record)\uc5d0 \uc5b4\ub5a4 event\uac00<br \/>\n\ubc1c\uc0dd\ud558\uae30 \uc804\uc5d0 \uae30\ub3d9\ub418\uc5b4 \uc9c8\uc218 \uc788\ub3c4\ub85d \uaddc\uc815\ub418\uc5b4\uc9c8\uc218 \uc788\uc73c\uba70 \ubc18\ub300\ub85c AFTER\ud0a4\ub97c \uc0ac\uc6a9\ud558<br \/>\n\uc5ec event\uac00 \uc644\ub8cc \ud6c4\uc5d0 \uae30\ub3d9\ub418\uac8c \ud560\uc218\ub3c4 \uc788\ub2e4.<br \/>\n(\ub2e4\uc74c\uc740 \ubd80\ubd84\uc801\uc73c\ub85c Postgres data changes visibility rule \uc774 \ucc38\uc870\ub418\uc5c8\ub2e4.)<br \/>\n\ud2b8\ub9ac\uac70\uac00 BEFORE\uc5d0 \uc758\ud574 event\uc804\uc5d0 \uae30\ub3d9\ub418\uc5b4 \uc9c4\ub2e4\uba74, \ud2b8\ub9ac\uac70\ub294 \ud604\uc7ac\uc758 Tuple\uc5d0 \ub300\ud55c<br \/>\nevent\ub97c \uac74\ub108\ub6f0\uac8c \ud55c\ub2e4. \ud2b9\ud788 INSERT\ub098 UPDATE\uc758 event\uc5d0 \ub300\ud574\uc11c\ub294 \uc0bd\uc785\ub418\uc5b4\uc9c8 \ud29c\ud50c<br \/>\n\uc758 \ubcc0\ud654\ub97c \uc778\uc9c0\ud560 \uc218 \uc5c6\ub2e4. \uc989, BEFORE\uc131\uaca9\uc758 \ud2b8\ub9ac\uac70\ub294 \ubcc0\uacbd\ub418\uc5b4\uc9c8 \ud29c\ud50c\ub4e4\uc5d0 \ub300\ud574\uc11c<br \/>\n&#8220;invisible&#8221;\ud55c \uc0c1\ud0dc\uc774\ub2e4. \ub2e8\uc9c0, \ucc98\ub9ac\ub418\uc5b4\uc9c8 event \ub9cc \uc778\uc2dd\ud560 \uc218 \uc788\ub2e4.<\/p>\n<p>\ub610\ud55c, \ud2b8\ub9ac\uac70\uac00 AFTER \ud0a4\uc5d0 \uc758\ud574 event\ud6c4\uc5d0 \uae30\ub3d9\ub418\uc5b4\uc9c0\uba74, \ucd5c\uadfc\uc758 \uc0bd\uc785,UPDATE,\uc0ad\uc81c<br \/>\n\ub4f1\uc774 \ud2b8\ub9ac\uac70\uc5d0 &#8220;visible&#8221; \uc774\ub2e4. \uc989, \ubcc0\uacbd\ub41c \ubd80\ubd84\uc744 \ud2b8\ub9ac\uac70\uac00 \uc778\uc9c0\ud560 \uc218 \uc788\ub2e4.<br \/>\nevent\ub294 \ub2e4\uc911\uc758 event \ub97c OR \uc5d0 \uc758\ud574 \uaddc\uc815\ud560 \uc218 \uc788\ub2e4. \ub610\ud55c \ub3d9\uc77c\ud55c \ub9b4\ub808\uc774\uc158\uc5d0 \ub3d9\uc77c<br \/>\n\ud55c event \ub97c \uc9c0\uc815\ud558\ub294 \ud558\ub098 \uc774\uc0c1\uc758 \ud2b8\ub9ac\uac70\ub97c \uc815\uc758\ud560 \uc218 \uc788\uc73c\ub098, \uc774\ub294 \ud2b8\ub9ac\uac70\uc758 \uae30\ub3d9<br \/>\n\uc21c\uc11c\ub97c \uc608\uce21\ud560 \uc218 \uc5c6\uac8c \ub41c\ub2e4.<br \/>\n\ud2b8\ub9ac\uac70\uac00 SQL \ucffc\ub9ac\ub97c \uc2e4\ud589\ud560\ub54c \ub2e4\ub978 \ud2b8\ub9ac\uac70\ub4e4\uc744 \uae30\ub3d9\uc2dc\ud0ac \uc218 \uc788\uc73c\uba70 \uc774\ub97c CASCADE<br \/>\n\ud2b8\ub9ac\uac70\ub77c \ud55c\ub2e4. \uc774\ub7ec\ud55c \uce90\uc2a4\uce90\uc774\ub4dc \ud2b8\ub9ac\uac70\uc758 \ub808\ubca8\uc5d0\ub294 \uc81c\ud55c\uc774 \uc5c6\uc73c\ubbc0\ub85c \ud55c\ubc88\uc758 \ud2b8\ub9ac<br \/>\n\uac70\ub85c \uc5ec\ub7ec\uac1c\uc758 \ub2e4\uc911\uc758 \ud2b8\ub9ac\uac70\ub97c \uae30\ub3d9\uc2dc\ud0ac \uc218 \uc788\ub2e4.<br \/>\n\ub3d9\uc77c\ud55c \ub9b4\ub808\uc774\uc158\uc5d0 \ub300\ud55c INSERT \ud2b8\ub9ac\uac70\uac00 \uc788\ub2e4\uba74 \uc774 \ud2b8\ub9ac\uac70\ub294 \ub2e4\uc2dc \ub3d9\uc77c\ud55c \ub9b4\ub808\uc774\uc158<br \/>\n\uc5d0 \ub300\ud55c \ud2b8\ub9ac\uac70\uac00 \uae30\ub3d9\ub418\uc5b4\uc9c8 \uc218 \uc788\ub2e4. \ud558\uc9c0\ub9cc \uc544\uc9c1 PostgreSQL\uc740 \uc774\ub7f0 \ud2b8\ub9ac\uac70\uc5d0 \ub300<br \/>\n\ud55c \ud29c\ud50c\uc758 \ub3d9\uae30\ud654\uac00 \uc9c0\uc6d0\ub418\uc9c0 \uc54a\uc73c\ubbc0\ub85c \uc8fc\uc758\ub97c \ud558\uc5ec\uc57c \ud560 \uac83\uc774\ub2e4.<\/p>\n<p>NOTES<br \/>\nCREATE TRIGGER \uc740 PostgreSQL\uc758 \ud655\uc7a5\ub41c \uae30\ub2a5\uc774\ub2e4.<br \/>\n\ub2e8\uc9c0 \ub9b4\ub808\uc774\uc158(Table) \uc758 \uc18c\uc720\uc790\ub9cc\uc774 \uadf8 \ub9b4\ub808\uc774\uc158\uc5d0 \ud2b8\ub9ac\uac70\ub97c \uc0dd\uc131\ud560 \uc218 \uc788\ub2e4.<br \/>\n\ubc84\uc83c 6.4\uc5d0\uc11c STATEMENT \ub294 \uad6c\ud604\ub418\uc9c0 \uc54a\uc558\ub2e4.<\/p>\n<p>3.5 TRIGGER \uc608\uc81c 2<br \/>\nCASCADING TRIGGER SAMPLE<\/p>\n<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-Cut here !!<br \/>\n&#8211;coded\u00a0 by NoGaDa-X<br \/>\n&#8211;cascading tigger<\/p>\n<p>DROP TRIGGER tab1_trg ON test1;<br \/>\nDROP TRIGGER tab2_trg ON test2;<br \/>\nDROP TRIGGER tab3_trg ON test3;<\/p>\n<p>DROP FUNCTION tab1_func();<br \/>\nDROP FUNCTION tab2_func();<br \/>\nDROP FUNCTION tab3_func();<\/p>\n<p>DROP TABLE test1;<br \/>\nDROP TABLE test2;<br \/>\nDROP TABLE test3;<br \/>\nDROP TABLE test4;<br \/>\n&#8211;Create Table<br \/>\nCREATE TABLE test1(<br \/>\ntab1_id\u00a0\u00a0 INT4<br \/>\n);<\/p>\n<p>CREATE TABLE test2(<br \/>\ntab2_id\u00a0 INT4<br \/>\n);<\/p>\n<p>CREATE TABLE test3(<br \/>\ntab3_id\u00a0\u00a0 INT4<br \/>\n);<\/p>\n<p>CREATE TABLE test4(<br \/>\ntab4_id\u00a0\u00a0 INT4<br \/>\n);<br \/>\n&#8211;Create Function<br \/>\nCREATE FUNCTION tab1_func() RETURNS opaque<br \/>\nAS &#8216;<br \/>\nBEGIN<br \/>\nINSERT\u00a0 INTO\u00a0 test2 values( new.tab1_id);<br \/>\nRETURN new;<br \/>\nEND;<br \/>\n&#8216; LANGUAGE &#8216;plpgsql&#8217;;<\/p>\n<p>CREATE FUNCTION tab2_func() RETURNS opaque<br \/>\nAS &#8216;<br \/>\nBEGIN<br \/>\nINSERT\u00a0 INTO\u00a0 test3 values( new.tab2_id);<br \/>\nRETURN new;<br \/>\nEND;<br \/>\n&#8216; LANGUAGE &#8216;plpgsql&#8217;;<\/p>\n<p>CREATE FUNCTION tab3_func() RETURNS opaque<br \/>\nAS &#8216;<br \/>\nBEGIN<br \/>\nINSERT\u00a0 INTO\u00a0 test4 values( new.tab3_id);<br \/>\nRETURN new;<br \/>\nEND;<br \/>\n&#8216; LANGUAGE &#8216;plpgsql&#8217;;<br \/>\n&#8211;Create Trigger<br \/>\nCREATE TRIGGER tab1_trg AFTER<br \/>\nINSERT OR UPDATE ON test1 FOR EACH ROW<br \/>\nEXECUTE PROCEDURE tab1_func();<\/p>\n<p>CREATE TRIGGER tab2_trg AFTER<br \/>\nINSERT OR UPDATE ON test2 FOR EACH ROW<br \/>\nEXECUTE PROCEDURE tab2_func();<\/p>\n<p>CREATE TRIGGER tab3_trg AFTER<br \/>\nINSERT OR UPDATE ON test3 FOR EACH ROW<br \/>\nEXECUTE PROCEDURE tab3_func();<br \/>\n&#8211;transaction<br \/>\nBEGIN;<br \/>\nINSERT INTO test1 VALUES (1);<br \/>\nSELECT * from test1;<\/p>\n<p>INSERT INTO test1 VALUES (2);<br \/>\nSELECT * from test2;<\/p>\n<p>INSERT INTO test1 VALUES (3);<br \/>\nSELECT * from test3;<\/p>\n<p>INSERT INTO test1 VALUES (4);<br \/>\nSELECT * from test4;<br \/>\nEND;<\/p>\n<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;End !!<\/p>\n<p>4. PL\/pgSQL<br \/>\n4.1 PL\/pgSQL 1 (PL\/pgSQL\ucc98\ub9ac\uae30 \ub4f1\ub85d)<br \/>\n1. Procedure Language<br \/>\nPostgres 6.3 \ubc84\uc83c \ubd80\ud130 PostgreSQL\uc740 procedural Language(PL)\ub97c \uc9c0\uc6d0\ud558\uae30 \uc2dc\uc791\ud588\ub2e4.<br \/>\n\uc774\uac83\uc740 PostgreSQL\ub9cc\uc758 \ud2b9\ubcc4\ud55c \uacbd\uc6b0\ub85c\uc11c oracle \uc758 PL\/SQL\uacfc \ube44\uc720\ub420 \uc218 \uc788\ub2e4.<br \/>\n\ud558\uc9c0\ub9cc \ud2b9\uc218\ud55c \uc5b8\uc5b4\uc778 PostgreSQL\uc758 PL\uc740 PostgreSQL\uc5d0 \ub0b4\uc7a5\ub41c\uac83 \uc544\ub2c8\uace0 \ubaa8\ub4c8\ud654\ub41c Handler\ub97c<br \/>\n\ub2e4\uc2dc \ub370\uc774\ud0c0\ubca0\uc774\uc2a4\uc5d0 \ub4f1\ub85d\uc744 \ud574\uc8fc\uc5b4\uc57c \ud55c\ub2e4. \uadf8\ub807\uc9c0 \uc54a\uc73c\uba74 \ub370\uc774\ud0c0\ubca0\uc774\uc2a4\ub294 PL \ub85c \uc4f0 \uc5ec\uc9c4<br \/>\nfunction\uc758 \ub0b4\uc6a9\uc744 \uc774\ud574\ud560 \uc218 \uc5c6\uc744 \uac83\uc774\ub2e4. \uacb0\ub860\uc801\uc73c\ub85c \ucc98\ub9ac\uae30\ub294 \uacf5\uc720\uac1d\uccb4\ub85c\uc11c \ucef4\ud30c\uc77c\ub418\uba70<br \/>\n\ub3d9\uc801\uc73c\ub85c Load \ub418\ub294 \ud2b9\ubcc4\ud55c \uc5b8\uc5b4 \ucc98\ub9ac \uae30\ub2a5\uc774\ub2e4.<br \/>\n\uc5ec\uae30\uc11c\ub294 PL Handler\uc758 \ub4f1\ub85d\uc758 \uc608\ub85c\uc11c PL\uc758 \ud55c\uc885\ub958\uc778 PL\/pgSQL \uc5b8\uc5b4\ub97c \ub4f1\ub85d\ud558\uaca0\ub2e4.<\/p>\n<p>Installing Procedural Languages<\/p>\n<p>\uacf5\uc720\uac1d\uccb4\uc778 \ucc98\ub9ac\uae30\ub294 \ucef4\ud30c\uc77c\ub41c \ud6c4 \uc778\uc2a4\ud1a8\ub418\uc5b4\uc57c \ud558\ub294\ub370 \ub514\ud3f4\ud2b8\ub85c PL\/pgSQL \uc740 PostgreSQL \uc124\uce58\uc2dc<br \/>\n\uc790\ub3d9\uc73c\ub85c \ucef4\ud30c\uc77c\ub41c\ud6c4 \ub77c\uc774\ube0c\ub7ec\ub9ac \ub514\ub809\ud1a0\ub9ac\uc5d0 \ub193\uc5ec\uc9c4\ub2e4. \ub2e4 \ub978 \ucc98\ub9ac\uae30\uc778 PL\/Tcl \uc740 PostgreSQL \ucef4\ud30c\uc77c\uc2dc<br \/>\n\uba85\uc2dc\uc801\uc73c\ub85c \uc124\uc815\ub418\uc5b4\uc57c\uc9c0\ub9cc \ucef4\ud30c \uc77c\ub418\uba70 \ub77c\uc774\ube0c\ub7ec\ub9ac \ub514\ub809\ud1a0\ub9ac\uc5d0 \ub193\uc5ec\uc9c4\ub2e4.<br \/>\n\ub77c\uc774\ube0c\ub7ec\ub9ac \ub514\ub809\ud1a0\ub9ac\ub294 \uc124\uce58\ub418\uc5b4\uc9c8 PostgreSQL\uc758 \ubc14\ub85c \ubc11\uc758 lib \uc774\ub2e4.<br \/>\n\uc608\ub97c \ub4e4\uc5b4 PostgreSQL\uc758 \uc808\ub300\uacbd\ub85c\uac00 \ub2e4\uc74c\uacfc \uac19\ub2e4\uace0 \ud558\uc790.<br \/>\n\/usr\/local\/pgsql<br \/>\n\uadf8\ub7ec\uba74 \ub77c\uc774\ube0c\ub7ec\ub9ac \ub514\ub809\ud1a0\ub9ac\uc758 \uc808\ub300\uacbd\ub85c\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<br \/>\n\/usr\/local\/pgsql\/lib<\/p>\n<p>PL\/pgSQL \uc5b8\uc5b4 \ucc98\ub9ac\uae30\ub97c \uc124\uce58\ud558\uae30 \uc704\ud574\uc11c\ub294 \uba3c\uc800 \uc704\uc758 \ub77c\uc774\ube0c\ub7ec\ub9ac \ub514\ub809\ud1a0\ub9ac\uc5d0\uc11c &#8220;plpgsql.so&#8221; \ub97c<br \/>\n\uba3c\uc800 \ud655\uc778\ud558\uc5ec\uc57c \ud55c\ub2e4.<\/p>\n<p>\ud655\uc778 \ud6c4 CREATE FUNCTION \uc640 CREATE PROCEDURAL LANGUAGE \uc5d0 \uc758\ud574 \uac01 \ub370\uc774\ud0c0\ubca0\uc774\uc2a4 \uc5d0\uc11c \ub4f1\ub85d\uc744 \ud558\uc5ec\uc57c<br \/>\n\ud55c\ub2e4. \uac01 \ub370\uc774\ud0c0\ubca0\uc774\uc2a4\uc5d0\uc11c \ub4f1\ub85d\uc744 \ud558\uc9c0\uc54a\uace0 \uc77c\uad04\uc801\uc73c\ub85c \ucc98\ub9ac\ud558\uace0 \uc2f6\ub2e4\uba74 PostgreSQL \uc758 \ud2b9\ubcc4\ud78c<br \/>\n\ub370\uc774\ud0c0\ubca0\uc774\uc2a4\uc778 &#8220;template1&#8221; \uc5d0\uc11c \ub4f1\ub85d\uc744 \ud558\uba74\ub41c\ub2e4. template1 \uc5d0\uc11c \ub4f1\ub85d\uc774 \ub418\uc5c8\ub2e4\uba74 \ucc28\ud6c4 \uc0dd\uc131\ub418\ub294<br \/>\n\ub370\uc774\ud0c0\ubca0\uc774\uc2a4\uc5d0\ub294 \uc790\ub3d9\uc801\uc73c\ub85c \ucc98\ub9ac\uae30\uac00 \ub4f1\ub85d\ub41c\ub2e4.<\/p>\n<p>PL\/pgSQL \ucc98\ub9ac\uae30 \ub4f1\ub85d \uc608\uc81c<br \/>\n[postgres@nogadax postgresql]psql template1<br \/>\ntemplate1=&amp;gt;<br \/>\ntemplate1=&amp;gt; CREATE\u00a0 FUNCTION\u00a0 plpgsql_call_handler()\u00a0 RETURNS\u00a0 OPAQUE<br \/>\ntemplate1-&amp;gt; AS\u00a0 &#8216; \/usr\/local\/pgsql\/lib\/plpgsql.so &#8216;<br \/>\ntemplate1-&amp;gt; LANGUAGE\u00a0 &#8216;C&#8217; ;<br \/>\ntemplate1=&amp;gt;<br \/>\ntemplate1=&amp;gt; CREATE\u00a0 TRUSTED\u00a0 PROCEDURAL\u00a0 LANGUAGE\u00a0 &#8216;plpgsql&#8217;<br \/>\ntemplate1-&amp;gt; HANDLER\u00a0 plpgsql_call_handler<br \/>\ntemplate1-&amp;gt; LANCOMPILER\u00a0 &#8216;PL\/pgSQL&#8217; ;<br \/>\ntemplate1=&amp;gt;<br \/>\ntemplate1=&amp;gt; CREATE\u00a0 DATABASE\u00a0 nogadax ;<br \/>\ntemplate1=&amp;gt;<\/p>\n<p>\ud639\uc740 \uc704\uc758 \ubb38\uc744 \ud654\uc77c\ub85c \uc800\uc7a5\ud55c\ud6c4 \\i \ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n<p>template1=&amp;gt; \\i\u00a0\u00a0 \/usr\/local\/src\/plsql_inst.sql<\/p>\n<p>&#8220;CREATE TRUSTED PROCEDURAL LANGUAGE&#8221; \uc5d0\uc11c TRUSTED \ud0a4\uc6cc\ub4dc\ub294 PostgreSQL \uc758 \uc288\ud37c\uc720\uc800 \uad8c\ud55c\uc774 \uc5c6\ub294<br \/>\n\uc77c\ubc18 \uc720\uc800\uac00 &#8220;CREATE FUNCTION&#8221; \uc774\ub098 &#8220;CREATE TRIGGER&#8221; \ubb38\uc744 \uc0ac\uc6a9\ud560 \ub54c \ub4f1\ub85d \ub41c procedure<br \/>\nlanguage(PL) \ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d \ud574\uc900\ub2e4.<\/p>\n<p>2. PL\/pgSQL<br \/>\nPL\/pgSQL \uc740 PostgreSQL \ub370\uc774\ud0c0\ubca0\uc774\uc2a4 \uc2dc\uc2a4\ud15c\uc5d0\uc11c &#8220;Loadable Procedural Language&#8221;\uc774\ub2e4.<br \/>\n\uc774 \ud328\ud0a4\uc9c0\ub294 Jan Wieck \uc5d0\uc758\ud574 \uc791\uc131\ub418\uc5c8\ub2e4.<\/p>\n<p>OVERVIEW<br \/>\n1. PL\/pgSQL \uc740 function \uc774\ub098 trigger procedure \ub97c \ub9cc\ub4dc\ub294\ub370 \uc0ac\uc6a9\ub418\uc5b4 \uc9c8 \uc218 \uc788\ub2e4.<br \/>\n2. SQL \ubb38\uc5d0 \uc81c\uc5b4 \uad6c\uc870\ub97c \ucd94\uac00\ud560 \uc218 \uc788\ub2e4.<br \/>\n3. \ubcf5\uc7a1\ud55c \uacc4\uc0b0\uc744 \uad6c\ud604\ud560 \uc218 \uc788\ub2e4.<br \/>\n4. user\uac00 \uc815\uc758\ud55c Type, Function, Operation\uc744 \uc0c1\uc18d\ud560 \uc218 \uc788\ub2e4.<br \/>\n5. Server \uc5d0 \uc758\ud574 Trusted(Authentication \uad00\ub828\uc758 \ub73b)\ub41c\uac83\uc744 \uc815\uc758\ud560 \uc218 \uc788\ub2e4.<br \/>\n6. \uc0ac\uc6a9\ud558\uae30 \uc27d\ub2e4.<\/p>\n<p>\uc124\uba85<br \/>\nPL\/pgSQL \uc740 \ub300\uc18c\ubb38\uc790\uc758 \uad6c\ubd84\uc774 \uc5c6\uc73c\ubbc0\ub85c \ud0a4\uc6cc\ub4dc\ub098 Identifier \ub4e4\uc740 \ub300\uc18c\ubb38\uc790<br \/>\n\uad6c\ubd84\uc5c6\uc774 \ud63c\uc6a9\ub418\uc5b4 \uc4f0\uc77c \uc218 \uc788\ub2e4.<\/p>\n<p>PL\/pgSQL \uc740 \ube14\ub7ed \uc9c0\ud5a5\uc5b8\uc5b4\uc774\ub2e4. \ube14\ub7ed\uc740 \ub2e4\uc74c\ucc98\ub7fc \uc815\uc758\ub418\uc5b4\uc9c4\ub2e4.<\/p>\n<p>[ Label ]<br \/>\n[ DECLARE\u00a0 declarations ]<br \/>\nBEGIN<br \/>\nstatements<br \/>\nEND;<\/p>\n<p>\ube14\ub7ed\uc758 statements\uad6c\uc5ed\ub0b4\uc5d0 \uc5ec\ub7ec\uac1c\uc758 sub-block\uc774 \uc0dd\uc131\ub420 \uc218 \uc788\uc73c\uba70 \uc774\ub294 \uc11c\ube0c\ube14\ub7ed\ub0b4\uc758 \ubcc0\uc218 \ub4e4\uc744<br \/>\n\uc11c\ube0c\ube14\ub7ed \uc678\ubd80\ub85c\ubd80\ud130 \uc228\uae30\uae30 \uc704\ud574 \uc0ac\uc6a9\ub418\uc5b4\uc9c8\uc218 \uc788\ub2e4. \ube14\ub7ed \uc55e\ubd80\ubd84\uc758 declarations\uad6c\uc5ed \uc5d0\uc11c \uc120\uc5b8\ub41c<br \/>\n\ubcc0\uc218\ub294 function \uc774 \ud638\ucd9c\ub420 \ub54c \ub2e8\uc9c0 \ud55c\ubc88 \ucd08\uae30\ud654\uac00 \ub418\ub294 \uac83\uc774 \uc544\ub2c8\ub77c \ube14\ub7ed\uc73c\ub85c \uc9c4\uc785\ud560 \ub54c\ub9c8\ub2e4 \ub9e4\ubc88<br \/>\n\ub514\ud3f4\ud2b8 \uac12\uc73c\ub85c \ucd08\uae30\ud654\ub41c\ub2e4.<br \/>\nPL\/pgSQL \uc758 BEGIN\/END \uc640 Transaction(BEGIN; END;)\uc744 \uc704\ud55c \ub370\uc774\ud0c0\ubca0\uc774\uc2a4\uc758 \uba85\ub839\ubb38\uacfc\ub294 \ub2e4\ub974\ub2e4\ub294\uac83\uc744<br \/>\n\uc774\ud574\ud574\uc57c \ud55c\ub2e4. \ub610\ud55c Function\uacfc Trigger Procedure \uc5d0\uc11c\ub294 \ud2b8\ub79c\uc7ad\uc158\uc744 \uc2dc\uc791 \ud558\uac70\ub098 commit \uc744 \ud560 \uc218<br \/>\n\uc5c6\uace0 Postgres\ub294 \uc911\ucca9\ub41c \ud2b8\ub79c\uc7ad\uc158\uc744 \uac00\uc9c8 \uc218 \uc5c6\ub2e4.<\/p>\n<p>&#8212;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 : \ud55c \ub77c\uc778\uc758 \uc8fc\uc11d\ucc98\ub9ac<br \/>\n\/*\u00a0\u00a0 *\/\u00a0 : \ube14\ub7ed \ub2e8\uc704 \uc8fc\uc11d \ucc98\ub9ac<\/p>\n<p>example<br \/>\nCREATE\u00a0 FUNCTION\u00a0 logfunc2(text,text,text)\u00a0 RETURNS\u00a0 datetime<br \/>\nAS &#8216;<br \/>\nDECLARE\u00a0 logtxt1\u00a0 ALIAS\u00a0 FOR\u00a0 $1;<br \/>\nlogtxt2\u00a0 ALIAS\u00a0 FOR\u00a0 $2;<br \/>\nlogtxt2\u00a0 ALIAS\u00a0 FOR\u00a0 $3;<br \/>\ncurtime\u00a0 datetime;<br \/>\nBEGIN<br \/>\ncurtime :=&#8221;now&#8221;;<br \/>\nINSERT\u00a0 INTO\u00a0 logtable\u00a0 VALUES (logtxt1,logtxt2,logtxt3,curtime);<br \/>\nRETURN\u00a0 curtime;<br \/>\nEND;<br \/>\n&#8216; LANGUAGE &#8216;plpgsql&#8217;;<\/p>\n<p>\uc124\uba85<br \/>\n$1,$2,$3 \uc740 \ud568\uc218\uc758 \uc778\uc790\ub4e4\ub85c\uc11c \ub098\uc5f4\ub41c \uc21c\uc11c\ub85c\uc11c \ucc38\uc870\ub418\uc5b4\uc9c4\ub2e4.<br \/>\nDECLARE \uc758 ALIAS FOR \ubcc0\uc218 $1 \uc5d0 \ub300\ud55c \ubcc4\uba85\uc744 \uc124\uc815\ud55c\ub2e4. \uc774\ub85c\uc11c $1 \uc5d0 \ub300\ud55c \uac00\ub3c5\uc131\uc774 \ub192\uc544\uc9c8\uc218 \uc788\ub2e4.<br \/>\ncurtime := &#8221;now&#8221;; \ub294 \ubcc0\uc218 curtime\uc5d0 \ud604\uc7ac\uc758 \uc2dc\uac01\uac12\uc744(&#8221;now&#8221;) \ud560\ub2f9\ud55c\ub2e4.&#8221;:=&#8221; \uc740 \ubcc0\uc218\uc5d0 \uac12\uc744<br \/>\n\ud560\ub2f9\ud560\ub54c \uc4f0\uc778\ub2e4. \ub9c8\uc9c0\ub9c9\uc73c\ub85c \uc704\uc758 \ud568\uc218\uc758 \ub9ac\ud134\uac12\uc774 datetime \uc774\ubbc0\ub85c datetime \ud0c0\uc785\uc758 \ubcc0\uc218 curtime<br \/>\n\uc744 \ub9ac\ud134\ud558\uac8c \ub41c\ub2e4.<\/p>\n<p>4.2 PL\/pgSQL 2<br \/>\nexample 1<br \/>\n\ub2e4\uc74c\uc740 \uc608\uc81c\uc785\ub2c8\ub2e4. \uc801\ub2f9\ud788 \ud654\uc77c\ub85c \ubcf5\uc0ac\ud574\uc11c \uc2e4\ud589\uc744 \ud558\uba74 \ub429\ub2c8\ub2e4.<\/p>\n<p>DROP FUNCTION test1();<br \/>\nDROP TABLE tab1;<\/p>\n<p>CREATE TABLE tab1 (<br \/>\nid\u00a0\u00a0\u00a0 int4,<br \/>\nname\u00a0 text<br \/>\n);<\/p>\n<p>CREATE FUNCTION test1() RETURNS int4<br \/>\nAS &#8216;<br \/>\nDECLARE<br \/>\nvar1\u00a0 tab1.id%TYPE:=1;<br \/>\nvar2\u00a0 tab1.name%TYPE;<br \/>\nvar3\u00a0 var2%TYPE:=&#8221;nogada&#8221;;<br \/>\nBEGIN<br \/>\nINSERT INTO tab1(id,name) VALUES(var1,var3);<br \/>\nRETURN\u00a0 var1;<br \/>\nEND;<br \/>\n&#8216;\u00a0 LANGUAGE &#8216;plpgsql&#8217;;<\/p>\n<p>SELECT test1();<br \/>\nSELECT * FROM tab1;<\/p>\n<p>\uc124\uba85<br \/>\n\uc704\uc758 \uc608\uc81c\ub294 DROP\uba85\ub839\ubb38\uc73c\ub85c\ubd80\ud130 \uc2dc\uc791\ud55c\ub2e4. \ubcc4\ub2e4\ub978 \uc774\uc720\ub294 \uc5c6\uace0 \uc548\uc804\ud55c \ud14c\uc2a4\ud2b8\ub97c \uc704\ud574 \uae30\uc874\uc5d0 \uc788\uc744\uc9c0<br \/>\n\ubaa8\ub97c function\uc774\ub098 table \uc744 \uba3c\uc800 \uc0ad\uc81c\ud55c\ub2e4. DROP \uba85\ub839\uc5b4\ub85c \uc778\ud55c \uc5d0\ub7ec\ub294 \ubb34\uc2dc\ud574\ub3c4 \ub41c\ub2e4.<br \/>\nFunction\uc758 DECLARE \ubd80\ubd84\uc740 \ubcc0\uc218\uc758 \uc120\uc5b8 \uad6c\uc5ed\uc73c\ub85c \ubcf4\uba74 \ub418\uaca0\ub2e4. var1 , var2,var3\uc740 \ubcc0\uc218\uba85\uc774\ub2e4.<br \/>\ntab.id%TYPE \uc740 var1 \uc758 \ubcc0\uc218\ud615\uc73c\ub85c\uc11c tab.id \uc758 \uc18d\uc131\uc744 \ucc38\uc870\ud558\uba70 \uc774\uc18d\uc131\uc758 \ubc14\ub85c \ub4a4\uc758 %TYPE \uc5d0\uc758\ud574<br \/>\n\uc9c0\uc815\ub41c\ub2e4. \ub610\ud55c %TYPE \uc740 \uc55e\uc804\uc5d0 \uc120\uc5b8\ub41c \ubcc0\uc218\uc758 \uc790\ub8d4\ud615\uc744 \ucc38\uc870 \ud560 \uc218 \uc788\ub2e4. var3 \ub294 \ubc14\ub85c \uc804\uc5d0 \uc120\uc5b8\ub41c<br \/>\nvar2 \uc758 \uc790\ub8cc\ud615\uc744 \ucc38\uc870\ud55c\ub2e4.<\/p>\n<p>Trigger Procedure<br \/>\nPL\/pgSQL \uc740 \ud2b8\ub9ac\uac70 \ud504\ub85c\uc2dc\uc838\ub97c \uc815\uc758\ud558\ub294\ub370 \uc0ac\uc6a9\ub418\uc5b4\uc9c8 \uc218 \uc788\ub294\ub370 CREATE FUNCTION\ubb38\uc744 \uc0ac\uc6a9 \ud558\uc5ec<br \/>\n\uc0dd\uc131\ub418\uc5b4\uc9c4\ub2e4.<br \/>\n\uc0dd\uc131\ub420 \ud2b8\ub9ac\uac70 \ud504\ub85c\uc2dc\uc838\ub294 \ub300\uccb4\ub85c \uc778\uc790\uac00\uc5c6\uace0 opaque\ud615\uc744 \ub9ac\ud134\ud558\ub294 \ud568\uc218 \ub85c\uc11c \uc0dd\uc131\ub418\uc5b4\uc9c4\ub2e4.<\/p>\n<p>\ud2b8\ub9ac\uac70 \ud504\ub85c\uc2dc\uc838\ub85c\uc11c \uc0dd\uc131\ub41c \ud568\uc218\uc5d0\ub294 \uc57d\uac04\uc758 \ud2b9\uc218\ud55c \ubcc0\uc218\ub97c \uac00\uc9c0\uba70 \uc774\ub294 \uc790\ub3d9\uc73c\ub85c \uc0dd\uc131\ub418\uc5b4 \uc9c0\uba70<br \/>\n\ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<p>NEW\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :\u00a0 ROW \ub808\ubca8 \ud2b8\ub9ac\uac70\uc0c1\uc5d0\uc11c INSERT\/UPDATE \ub85c \uc778\ud574 \uc0c8\ub85c\ub9ac \uc0dd\uc131\ub41c<br \/>\nROW \ub97c \uc720\uc9c0\ud558\ub294 \ubcc0\uc218\ub85c\uc11c \ub370\uc774\ud0c0\ud0c0\uc785\uc740 RECORD \uc774\ub2e4. RECORD<br \/>\n\ud615\uc740 \ubbf8\ub9ac \uad6c\uc870\ud654\ub418\uc9c0 \uc54a\uc740 ROWTYPE\ub85c\uc11c selection\uc774\ub098 insert<br \/>\n,update \uc2dc \uacb0\uacfc\ub85c \uc0dd\uc131\ub41c \ud558\ub098\uc758 row \ub97c \uc720\uc9c0\ud558\ub294 \ud615\uc774\ub2e4.<br \/>\nOLD\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :\u00a0 new \uc640 \ub300\uc870\ub418\ub294 \ubcc0\uc218\ub85c\uc11c UPDATE\ub098 DELETE\ud615 \uc73c\ub85c \uc778\ud574 \ubcc0\uacbd<br \/>\n\ub418\uae30 \uc804\uc758 ROW\ub97c \uc720\uc9c0\ud558\ub294 \ubcc0\uc218\uc774\ub2e4.<br \/>\nTG_NAME\u00a0\u00a0\u00a0 :\u00a0 \ub370\uc774\ud0c0 \ud0c0\uc785\uc740 NAME \uc774\uace0 \uc2e4\uc81c\ub85c \uae30\ub3d9\ub41c \ud2b8\ub9ac\uac70\uc758 \uc774\ub984\uc5d0 \ub300\ud55c<br \/>\n\ubcc0\uc218\uc774\ub2e4.<br \/>\nTG_WHEN\u00a0\u00a0\u00a0 :\u00a0 text\ud615\uc774\uace0 BEFORE\ub098\u00a0 AFTER\ub97c \uac00\uc9c4\ub2e4.<br \/>\nTG_LEVEL\u00a0\u00a0 :\u00a0 text\ud615\uc774\uace0 ROW\ub098 STATEMENT\ub97c \uac00\uc9c4\ub2e4.<br \/>\nTG_OP\u00a0\u00a0\u00a0\u00a0\u00a0 :\u00a0 text\ud615\uc774\uace0 INSERT\ub098 UPDATE\ub098 DELETE \ub97c \uac00\uc9c4\ub2e4.<br \/>\nTG_RELID\u00a0\u00a0 :\u00a0 oid\ud615\uc774\uace0(Object ID) \ud2b8\ub9ac\uac70\ub97c \uae30\ub3d9\uc2dc\ud0a4\ub294 \ud14c\uc774\ube14\uc758 Object ID<br \/>\n\uc774\ub2e4.<br \/>\nTG_RELNAME :\u00a0 name\ud615\uc774\uace0 \ud2b8\ub9ac\uac70\ub97c \uae30\ub3d9\uc2dc\ud0a4\ub294 \ud14c\uc774\ube14\uc758 name \uc744 \uac00\uc9c0\ub294 \ubcc0\uc218<br \/>\n\uc774\ub2e4.<br \/>\nTG_NARGS\u00a0\u00a0 :\u00a0 Integer\ud615\uc774\uace0 \ud2b8\ub9ac\uac70 \ud504\ub85c\uc2dc\uc838\uc5d0 \uc8fc\uc5b4\uc9c0\ub294 \uc778\uc790\uc758 \uac1c\uc218\uc774\ub2e4.<br \/>\nTG_ARGV[]\u00a0 :\u00a0 array of text \ud615\uc774\uace0 \ud2b8\ub9ac\uac70 \ud504\ub85c\uc2dc\uc838\uc5d0 \uc8fc\uc5b4\uc9c0\ub294 \uc778\uc790\ub4e4\uc744<br \/>\n\uac12\uc73c\ub85c \uac00\uc9c0\ub294 \ud14d\uc2a4\ud2b8 \ubc30\uc5f4\ud615\uc758 \ubcc0\uc218\uc774\ub2e4.<\/p>\n<p>4.3 \uc608\uc81c<br \/>\n\ub2e4\uc74c\uc744 \ud654\uc77c\ub85c \ub9cc\ub4e4\uc5b4 \uc2e4\ud589\ud574\ubcf4\uc138\uc694.<\/p>\n<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-Cut here !!<br \/>\nDROP\u00a0 TRIGGER\u00a0\u00a0 emp_stamp\u00a0 ON\u00a0 emp;<br \/>\nDROP\u00a0 FUNCTION\u00a0 emp_stamp() ;<br \/>\nDROP\u00a0 TABLE\u00a0 emp;<br \/>\nCREATE\u00a0 TABLE\u00a0 emp(<br \/>\nempname\u00a0\u00a0\u00a0\u00a0 text,<br \/>\nsalary\u00a0\u00a0\u00a0\u00a0\u00a0 int4,<br \/>\nlast_date\u00a0\u00a0 datetime,<br \/>\nlast_user\u00a0\u00a0 name<br \/>\n);<br \/>\nCREATE\u00a0 FUNCTION\u00a0 emp_stamp()\u00a0 RETURNS\u00a0 OPAQUE<br \/>\nAS &#8216;<br \/>\nBEGIN<\/p>\n<p>IF\u00a0 NEW.empname\u00a0 ISNULL\u00a0 THEN<br \/>\nRAISE\u00a0 EXCEPTION &#8221;empname cannot be NULL value&#8221;;<br \/>\nEND\u00a0 IF;<\/p>\n<p>IF\u00a0 NEW.salary\u00a0 ISNULL\u00a0 THEN<br \/>\nRAISE EXCEPTION &#8221;% cannot have NULL salary&#8221;, NEW.empname ;<br \/>\nEND\u00a0 IF;<br \/>\nIF\u00a0 NEW.salary\u00a0 &amp;lt;\u00a0 0\u00a0 THEN<br \/>\nRAISE\u00a0 NOTICE &#8221;% cannot have a negative salary&#8221;, NEW.empname ;<br \/>\nEND\u00a0 IF;<br \/>\n&#8211;NOTICE TEST<br \/>\nRAISE NOTICE &#8221;TRIGGER NAME : %&#8221;,TG_NAME ;<br \/>\nRAISE NOTICE &#8221;TRIGGER LEVEL : %\u00a0\u00a0 TRIGGER OPERATION : %&#8221;,TG_LEVEL , TG_OP;<\/p>\n<p>&#8211;EXCEPTION TEST<br \/>\nRAISE EXCEPTION &#8221;TRIGGER WHEN : %&#8221;,TG_WHEN;<br \/>\nRAISE NOTICE &#8221;TRIGGER LEVEL : %\u00a0\u00a0 TRIGGER OPERATION : %&#8221;,TG_LEVEL , TG_OP;<br \/>\nNEW.last_date := &#8221;now&#8221;;<br \/>\nNEW.last_user := getpgusername();<br \/>\nRETURN\u00a0 NEW;<br \/>\nEND;<br \/>\n&#8216; LANGUAGE &#8216;plpgsql&#8217;;<br \/>\nCREATE\u00a0 TRIGGER\u00a0 emp_stamp\u00a0 AFTER\u00a0 INSERT\u00a0 OR\u00a0 UPDATE\u00a0 ON\u00a0 emp<br \/>\nFOR\u00a0 EACH\u00a0 ROW\u00a0 EXECUTE\u00a0 PROCEDURE\u00a0 emp_stamp();<br \/>\nINSERT\u00a0 INTO\u00a0 emp(empname,salary)\u00a0 VALUES(&#8216;nogadax&#8217;,20);<br \/>\nINSERT\u00a0 INTO\u00a0 emp(empname) VALUES(&#8216;winob&#8217;);<br \/>\nINSERT\u00a0 INTO\u00a0 emp(salary)\u00a0 VALUES(10);<br \/>\nINSERT\u00a0 INTO\u00a0 emp(empname,salary)\u00a0 VALUES(&#8216;diver&#8217;,30);<br \/>\nINSERT\u00a0 INTO\u00a0 emp(salary)\u00a0 VALUES(-20);<br \/>\nSELECT\u00a0 *\u00a0 FROM\u00a0 emp;<\/p>\n<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;End !!<\/p>\n<p>\uc124\uba85<br \/>\nRAISE\ub294 \uba54\uc2dc\uc9c0\ub97c \ub358\uc9c0\ub294 \uac83\uc785\ub2c8\ub2e4.<br \/>\nEXCEEPTION\uc740 \ud3ec\uc2a4\ud2b8\uadf8\ub808\uc2a4\uc758 DEBUG\ub808\ubca8\ub85c\uc11c \ub370\uc774\ud0c0\ubca0\uc774\uc2a4\uc5d0 log \ub97c \ub0a8\uae30\uace0 \ud2b8\ub79c\uc7ad\uc158\uc744 \uc911\uc9c0\ud55c\ub2e4.<br \/>\n\ub2e4\ub978 \ud0a4\uc6cc\ub4dc\ub85c NOTICE\uac00 \uc788 \ub294\ub370 \uc774\uac83\uc740 \ub370\uc774\ud0c0\ubca0\uc774\uc2a4\ub97c \uc791\uc131\ud558\uace0 \uc774\ub97c \ud074\ub77c\uc774\uc5b8\ud2b8\uce21\uc73c\ub85c\ub3c4 \uc804\uc1a1\ud55c\ub2e4.<\/p>\n<p>RAISE EXCEPTION &#8221;% cannot have NULL salary&#8221;, NEW.empname ;<\/p>\n<p>\uc704\uc758 \ubb38\uc5d0\uc11c &#8221; \uc640 &#8221; \uc0ac\uc774\uc758 % \ub294 NEW.empname \uc758 \uac12\uc744 \ucd9c\ub825\ud55c\ub2e4.<br \/>\nCREATE\u00a0 TRIGGER\u00a0 emp_stamp\u00a0 AFTER\u00a0 INSERT\u00a0 OR\u00a0 UPDATE\u00a0 ON\u00a0 emp<br \/>\nFOR\u00a0 EACH\u00a0 ROW\u00a0 EXECUTE\u00a0 PROCEDURE\u00a0 emp_stamp();<br \/>\nNEW.empname\uc758 NEW\ub294 RECORD\ud0c0\uc785\uc73c\ub85c\uc11c \ud2b8\ub9ac\uac70\uc758 \uc774\ubca4\ud2b8\uc758 \uc6d0\uc778\uc774 \ub418\ub294 emp \uc758 \uad6c\uc870\ub97c \uac00\uc9c0\uba70 NEW \uc758 \uac12\uc740 event\uc758 \uacb0\uacfc\ub85c\uc11c \ucd94\uac00\ub418\uac70\ub098 \ubcc0\uacbd\ub41c \ud589\uc744 \uac00\uc9c4\ub2e4.<\/p>\n<p>\uc815\ub9ac<\/p>\n<p>Declaration : \uc120\uc5b8\ubd80<br \/>\nname [CONSTANT] type [NOT NULL] [DEFAULT | :=value]<br \/>\nexample )<br \/>\nDECLARE<br \/>\nvar_a\u00a0 int4\u00a0 DEFAULT\u00a0 5;<\/p>\n<p>&#8211;var_a\u00a0 \ubcc0\uc218\uc758\u00a0 DEFAULT\uc758 \uac12\uc740\u00a0 5\uc774\ub2e4.<br \/>\nname class%ROWTYPE<br \/>\nexample )<br \/>\nDECLARE<br \/>\nvar_a\u00a0 test_table%ROWTYPE;<\/p>\n<p>var_a \ubcc0\uc218\ub294 test_table \uc758 \ud14c\uc774\ube14 \uad6c\uc870\ub97c \uac00\uc9c4\ub2e4.<\/p>\n<p>name RECORD<br \/>\nexample )<br \/>\nDECLARE<br \/>\nvar_a\u00a0 RECORD ;<\/p>\n<p>\ud2b9\uc815 \ud14c\uc774\ube14\uc758 \uad6c\uc870\ub97c \uac00\uc9c0\uc9c0 \uc54a\uace0 selection \uc758 \uacb0\uacfc\uc5d0<br \/>\n\ub300\ud55c \uad6c\uc870\ub97c \uac00\uc9c8 \uc218 \uc788\ub2e4.(NEW,OLD)&amp;#65533;<\/p>\n<p>name ALIAS FOR $n;<br \/>\n$n \uc5d0 \ub300\ud55c \ubcc4\uce6d<br \/>\nRENAME oldname TO newname<br \/>\noldname\ub97c\u00a0 newname\ub85c \ubc14\uafc8<\/p>\n<p>Data Type : \uc790\ub8cc\ud615<\/p>\n<p>Postgres-BaseType : \ud3ec\uc2a4\ud2b8 \uadf8\ub808\uc2a4\uc758 \uae30\ubcf8 \uc790\ub8cc\ud615( int4,integer,text,char,..)<\/p>\n<p>variable%TYPE<\/p>\n<p>class.field%TYPE<\/p>\n<p>Expression<\/p>\n<p>Select expression<\/p>\n<p>Statement : \ucc98\ub9ac\ubb38\uc7a5<br \/>\nAssignment : \uac12\uc758 \ud560\ub2f9<\/p>\n<p>identifier :=expression;<\/p>\n<p>SELECT\u00a0 expressions\u00a0 INTO\u00a0 target\u00a0 FROM &#8230;<\/p>\n<p>PERFORM\u00a0 query\u00a0 : Calling another function<\/p>\n<p>RETURN\u00a0 expression;<\/p>\n<p>RAISE\u00a0 [NOTICE | EXCEPTION]\u00a0 &#8221; message % &#8221;,variable<br \/>\n\uc81c\uc5b4\ubb38<\/p>\n<p>IF\u00a0 expression\u00a0 THEN<br \/>\nstatements<br \/>\n[ELSE\u00a0 statements]<br \/>\nEND\u00a0 IF;<br \/>\n[label]<br \/>\nLOOP\u00a0 statements\u00a0 END\u00a0 LOOP;<br \/>\n[label]<br \/>\nWHILE\u00a0 expression\u00a0 LOOP\u00a0 statements\u00a0 END\u00a0 LOOP;<br \/>\n[label]<br \/>\nFOR\u00a0 name\u00a0 IN\u00a0 [REVERSE]\u00a0 expression\u00a0 LOOP\u00a0 statements\u00a0 END\u00a0 LOOP;<br \/>\n[label]<br \/>\nFOR\u00a0 record | row\u00a0 IN\u00a0 select_clause\u00a0 LOOP\u00a0 statement<br \/>\nEND\u00a0 LOOP;<br \/>\nEXIT\u00a0 [label]\u00a0 [WHEN\u00a0 expression];<\/p>\n<p>5. Large Object with Transaction<br \/>\n5.1 Large Object\uc640 \uc608\uc81c<br \/>\n\ud3ec\uc2a4\ud2b8\uadf8\ub808\uc2a4\uc5d0\uc11c\ub294 \ud55c \ud29c\ud50c\uc758 \uc0ac\uc774\uc988\uac00 8192 Byte (8k Bytes) \ub85c \uc81c\ud55c\ub418\uc5b4 \uc788\ub2e4. \ud558\ub098\uc758 \ub808\ucf54\ub4dc\uc5d0<br \/>\n\ub4e4\uc5b4\uac08 \uc218 \uc788\ub294 \ub370\uc774\ud0c0\uc758 \ucd1d \ud06c\uae30\uac00 \uc81c\ud55c\ub418\uc5b4 \uc788\uc73c\ubbc0\ub85c \uc774\ubbf8\uc9c0\ub098 \uc0ac\uc774\uc988\uac00 8K \ub97c \ub118\ub294 \ubb38\uc11c\ub4e4\uc740 \ub2e4\ub974\uac8c<br \/>\n\uc800\uc7a5\ub418\uc5b4\uc57c \ud55c\ub2e4.<\/p>\n<p>\ud3ec\uc2a4\ud2b8\uadf8\ub808\uc2a4\ub294 Large Object \ub77c\ub294 \uac1c\ub150\uc73c\ub85c \uc774\ub97c \uadf9\ubcf5\ud558\ub824\ud55c\ub2e4. \uacfc\uac70\uc5d0 \ud3ec\uc2a4\ud2b8\uadf8 \ub808\uc2a4\ub294 \uc774\ub7f0 \ud070<br \/>\n\uc0ac\uc774\uc988\uc758 \ub370\uc774\ud0c0\ub97c \uc704\ud574 3\uac00\uc9c0\uc758 \uc9c0\uc6d0\uc774 \uc788\uc5c8\uc73c\ub098 \uc0ac\uc6a9\uc790\ub4e4\uc0ac\uc774\uc758 \uc7a6\uc740 \ud63c\ub780\uc73c\ub85c \ud558\ub098\ub9cc\uc744 \uc9c0\uc6d0\ud558\uac8c<br \/>\n\ub418\uc5c8\uace0 \uadf8\uac83\uc740 \ub2e8\uc21c\ud788 \ub370\uc774\ud0c0\ubca0\uc774\uc2a4\uc548\uc758 \ub370\uc774\ud0c0\ub85c \uc11c\uc758 Large Object \ub97c \uc9c0\uc6d0\ud55c\ub2e4. \uc774\uac83\uc740 \uc561\uc138\uc2a4\ub97c<br \/>\n\ud560\ub54c \ub290\ub9b4\uc218 \uc788\uc9c0\ub9cc \uc5c4\uaca9\ud55c \ub370\uc774\ud0c0 \ubb34\uacb0\uc131\uc744 \uc81c\uacf5\ud55c\ub2e4.<\/p>\n<p>\ud3ec\uc2a4\ud2b8\uadf8\ub808\uc2a4\ub294 Large Object \ub97c \ucabc\uac1c\uc5b4 \uc774\ub97c \ub370\uc774\ud0c0\ubca0\uc774\uc2a4\uc758 \ud29c\ud50c\ub4e4\uc5d0 \uc800\uc7a5\ud55c\ub2e4. B-tree \uc778\ub371\uc2a4\ub294<br \/>\n\ub79c\ub364\ud55c resd-write \uc561\uc138\uc2a4\uc5d0 \ub300\ud55c \ube60\ub978 \uac80\uc0c9\uc744 \ubcf4\uc99d\ud55c\ub2e4.<\/p>\n<p>\ub2e4\uc74c\uc740 \uc608\uc81c\uc774\ub2e4.<\/p>\n<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\ndrop\u00a0 table\u00a0 image;<\/p>\n<p>BEGIN\u00a0 WORK;<\/p>\n<p>SET\u00a0 TRANSACTION\u00a0 ISOLATION\u00a0 LEVEL\u00a0 SERIALIZABLE;<\/p>\n<p>create table image(<br \/>\nname\u00a0\u00a0\u00a0 text,<br \/>\nraster\u00a0 oid<br \/>\n);<\/p>\n<p>insert\u00a0 into\u00a0\u00a0\u00a0 image (name , raster)<br \/>\nvalues (&#8216;snapshot&#8217; , lo_import(&#8216;\/usr\/local\/src\/snapshot01.gif&#8217;) );<\/p>\n<p>select\u00a0 lo_export (image.raster , &#8216;\/tmp\/snap.gif&#8217;)<br \/>\nfrom\u00a0 image\u00a0 where name=&#8217;snapshot&#8217;;<\/p>\n<p>COMMIT\u00a0 WORK;<br \/>\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<\/p>\n<p>Large Object Note<br \/>\n\uc704\uc758 \uc608\uc81c\uc5d0\uc11c \uba85\uc2dc\uc801\uc73c\ub85c \ud2b8\ub79c\uc7ad\uc158\ub0b4\uc5d0\uc11c Large Object \uc758 \ucc98\ub9ac\uac00 \uc774\ub8e8\uc5b4\uc9c0\uace0 \uc788\ub2e4.<br \/>\n\uc774\ub294 \ud3ec\uc2a4\ud2b8\uadf8\ub808\uc2a4 6.5 \ubc84\uc83c\ub300\uc5d0\uc11c\ubd80\ud130\uc758 Large Object \ucc98\ub9ac\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d\uc73c\ub85c\uc11c 6.5 \uc774\uc804 \ubc84\uc83c\uc758<br \/>\n\uc554\uc2dc\uc801\uc778 \ud2b8\ub79c\uc7ad\uc158 \uc694\uad6c\uc0ac\ud56d\uacfc\ub294 \ub2ec\ub9ac \uba85\uc2dc\uc801\uc778 \ud2b8\ub79c\uc7ad\uc158\uc744 \uc694\uad6c\ud55c \ub2e4. \uc774 \uc694\uad6c\uc0ac\ud56d\uc774 \ubb34\uc2dc\ub41c\ub2e4\uba74,<br \/>\n\uc989 \uba85\uc2dc\uc801\uc778 \ud2b8\ub79c\uc7ad\uc158\ubb38\uc774 \uc791\uc131\ub418\uc9c0 \uc54a\ub294\ub2e4\uba74 \ube44\uc815 \uc131\uc801\uc778 \uacb0\uacfc\ub97c \ub9cc\ub4e0\ub2e4.<\/p>\n<p>\uc124\uba85<br \/>\nBEGIN\u00a0 WORK;<br \/>\n\uc0ac\uc6a9\uc790 \uc815\uc758 \ud2b8\ub79c\uc7ad\uc158 \uc2dc\uc791<\/p>\n<p>SET\u00a0 TRANSACTION\u00a0 ISOLATION\u00a0 LEVEL\u00a0 SERIALIZABLE;<br \/>\n\ud2b8\ub79c\uc7ad\uc158 \ub808\ubca8 \uc911 \uac00\uc7a5 \uac15\ub825\ud55c SERIZABLE \ub808\ubca8\ub85c \uc7ac \uc124\uc815\uc744 \ud568.<\/p>\n<p>\ud3ec\uc2a4\ud2b8\uadf8\ub808\uc2a4\uc758 \ud2b8\ub79c\uc7ad\uc158\uc758 \ub514\ud3f4\ud2b8 \ub808\ubca8\uc740 &#8220;READ COMMITTED&#8221; \ub85c\uc11c \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc758<br \/>\nquery \ub294 \uc774 query \uac00 \uc2e4\ud589\ub418\uae30\uc804\uc5d0 commit \ub41c \ub370\uc774\ud0c0\ub9cc \ub2e4\ub8f0 \uc218 \uc788\ub2e4.<\/p>\n<p>SERIALIZABLE \ub294 \ud3ec\uc2a4\ud2b8\uadf8\ub808\uc2a4\uc758 \uac00\uc7a5 \uac15\ub825\ud55c \ud2b8\ub79c\uc7ad\uc158 \ub808\ubca8\ub85c\uc11c \ud2b8\ub79c\uc7ad\uc158\ub0b4\uc758<br \/>\nquery\ub294 query\uc2dc\uc791\uc804\uc774 \uc544\ub2cc \uadf8 \ud2b8\ub79c\uc7ad\uc158\uc774 \uc2dc\uc791\ub418\uae30\uc804\uc5d0 commit\ub41c \ub370\uc774\ud0c0\ub9cc\uc744<br \/>\n\ub2e4\ub8f0\uc218 \uc788\ub2e4.<\/p>\n<p>OID \ub294 \uac1d\uccb4\uc5d0\ub300\ud55c \ud3ec\uc2a4\ud2b8\uadf8\ub808\uc2a4\uc758 \uc2dc\uc2a4\ud15c \uad00\ub828 \uc2dd\ubcc4\uc790\uc774\ub2e4.<\/p>\n<p>lo_import(\uc77d\uc5b4\uc62c \ub370\uc774\ud0c0\uc758 PATH); \ub294 \ub370\uc774\ud0c0\ub97c \uc77d\uc5b4\ub4e4\uc774\ub294 Large Object \uad00\ub828<br \/>\n\ub0b4\uc7a5 \ud568\uc218\uc774\ub2e4.<\/p>\n<p>lo_export( OID , \ub370\uc774\ud0c0\uac00 \uc4f0\uc5ec\uc9c8 \uc2dc\uc2a4\ud15c\uc758 PATH); \ub294 \ub370\uc774\ud0c0\ub97c \uc77d\uc5b4\uc11c \uaebc\ub0b4\ub294<br \/>\nLarge Object \uad00\ub828 \ub0b4\uc7a5\ud568\uc218\uc774\ub2e4.<\/p>\n<p>COMMIT WORK; \ub294 \ud2b8\ub79c\uc7ad\uc158\uc758 \uc644\ub8cc\ub97c \uc758\ubbf8\ud55c\ub2e4. \uc774\ub85c \uc778\ud574 \uc2e4\uc9c8\uc801\uc778 \uac31\uc2e0\uc774\ub098 \uc0ad\uc81c\ub4f1\uc774<br \/>\n\uc774\ub8e8\uc5b4\uc9c4\ub2e4.<\/p>\n<p>5.2 TRANSACTION<br \/>\n\ud2b8\ub79c\uc7ad\uc158\uc758 \uc131\uaca9(ACID)<br \/>\n\uc6d0\uc790\uc131\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 : \ud558\ub098\uc758 \ud2b8\ub79c\uc7ad\uc158\uc740 \ub2e4\uc218\uc758 query\ub97c \uc2e4\ud589\ud558\uc9c0\ub9cc \uc774\ub294 \ub2e8\uc9c0 \ud558\ub098\uc758<br \/>\n(ATOMIC)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 query \uc778\uc591 \uc2e4\ud589\ub418\uc5b4\uc57c \ud55c\ub2e4.<\/p>\n<p>\uc77c\uad00\uc131\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 : \ud2b8\ub79c\uc7ad\uc158\uc758 \uc218\ud589\uc5d0 \ub300\ud574 \ub370\uc774\ud0c0\ubca0\uc774\uc2a4\uc758 \ub370\uc774\ud0c0\ub4e4\uc758 \uc77c\uad00\uc131\uc740<br \/>\n(CONSISTENT)\u00a0\u00a0 \uc720\uc9c0\ub418\uc5b4\uc57c \ud55c\ub2e4.<\/p>\n<p>\ubd84\ub9ac\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 : \uac01 \ud2b8\ub79c\uc7ad\uc158\uc740 \ubd84\ub9ac\ub418\uc5b4 \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc911\uc5d0 \uac04\uc12d\ud574\uc11c\ub294 \uc548\ub41c\ub2e4.<br \/>\n(ISOLATABLE)\u00a0\u00a0 \uc774\ub294 \ubcd1\ub82c (CONCURRENCY) \uc81c\uc5b4\uc758 \uac1c\ub150\uc73c\ub85c \ub370\uc774\ud0c0\ubca0\uc774\uc2a4\ub294 \uba40\ud2f0<br \/>\n\uc720\uc800 \ud658\uacbd\uc77c \uc218 \uc788\uc73c\ubbc0\ub85c \uac01 \uc720\uc800\uc758 \ud2b8\ub79c\uc7ad\uc158\uc740 \uc548\uc804\ud558\uac8c \uc774\ub8e8<br \/>\n\uc5b4\uc838\uc57c \ud55c\ub2e4.<\/p>\n<p>\uc601\uad6c\uc131\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 : \ud2b8\ub79c\uc7ad\uc158\uc758 \uc218\ud589\ud6c4 commit \ub41c \ub370\uc774\ud0c0\ub4e4\uc740 \uc601\uad6c\uc801\uc73c\ub85c \uc720\uc9c0\ub418\uc5b4\uc57c<br \/>\n(DURABLE)\u00a0\u00a0\u00a0\u00a0\u00a0 \ud55c\ub2e4.<\/p>\n<p>\ud2b8\ub79c\uc7ad\uc158 \uad00\ub828 SQL \uba85\ub839\uc5b4 \uc815\ub9ac<br \/>\nBEGIN [WORK | TRANSACTION]<br \/>\nBEGIN : \uc0c8\ub85c\uc6b4 \ud2b8\ub79c\uc7ad\uc158\uc774 Chain Mode\ub85c \uc2dc\uc791\ud588\uc74c\uc744 \uc54c\ub9b0\ub2e4.<br \/>\nWORK , TRANCTION : Optional Keyword. They have no effect.<\/p>\n<p>COMMIT [WORK | TRANSACTION]<br \/>\n\ud2b8\ub79c\uc7ad\uc158\ud6c4 \ubcc0\uacbd\ub41c \uacb0\uacfc\ub97c \uc800\uc7a5.<\/p>\n<p>END [WORK | TRANCTION]<br \/>\n\ud604\uc7ac \ud2b8\ub79c\uc7ad\uc158\uc744 COMMIT.<br \/>\nEND\ub294 \ud3ec\uc2a4\ud2b8\uadf8\ub808\uc2a4 \ud655\uc7a5\uc73c\ub85c\uc11c COMMIT \uc640 \uac19\uc740 \uc758\ubbf8\uc774\ub2e4.<\/p>\n<p>LOCK [TABLE] name<br \/>\nLOCK [TABLE] name IN [ROW | ACCESS] {SHARE | EXCLUSIVE} MODE<br \/>\nLOCK [TABLE] name IN SHARE ROW EXCLUSIVE MODE<br \/>\n\uba85\uc2dc\uc801\uc73c\ub85c \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc758 \ud14c\uc774\ube14\uc744 \uc7a0\uae08.<\/p>\n<p>ROLLBACK [WORK | TRANSACTION]<br \/>\n\ud604\uc7ac \ud2b8\ub79c\uc7ad\uc158\uc744 \uc911\uc9c0\ud55c\ub2e4.<br \/>\nABORT [WORK | TRANSACTION]<br \/>\n\ud604\uc7ac \ud2b8\ub79c\uc7ad\uc158\uc744 \uc911\uc9c0\ud55c\ub2e4. ABORT \ub294 \ud3ec\uc2a4\ud2b8\uadf8\ub808\uc2a4 \ud655\uc7a5\uc73c\ub85c ROLLBACK\uc640<br \/>\n\uac19\uc740 \uc758\ubbf8\ub85c\uc11c \uc4f0\uc778\ub2e4.<br \/>\nSET TRANSACTION ISOLATION LEVEL {READ COMMITTED | SERIALIZABLE}<br \/>\n\ud604\uc7ac \ud2b8\ub79c\uc7ad\uc158\uc5d0 \ub300\ud55c \ubd84\ub9ac \ub808\ubca8\uc744 \uc124\uc815\ud55c\ub2e4.<br \/>\n\uc124\uba85<br \/>\nINSERT INTO tab VALUES(&#8216;qwe&#8217;,&#8217;www&#8217;,123);<\/p>\n<p>\uc704\uc758 INSERT\ubb38 \uc774 \uc131\uacf5\uc801\uc73c\ub85c \uc218\ud589\ub418\uc5c8\ub2e4\uba74 commit \ub420\uac83\uc774\ub2e4.<br \/>\n\uc544\ub2c8\uba74 RollBack \ub420\uac83\uc774\ub2e4. \ub2e4\uc2dc \ub9d0\ud574,\u00a0 \uc704\uc758 \ubb38\uc774 \uc131\uacf5\ud558\uba74<br \/>\n\ub370\uc774\ud0c0\ubca0\uc774\uc2a4\uc5d0 \uadf8\uc5d0\u00a0 \ub530\ub978\u00a0 \ub370\uc774\ud0c0\uac00 \uc800\uc7a5\ub418\uace0 \uadf8\ub807\uc9c0 \uc54a\uace0<br \/>\nINSERT \uc758 \uc2e4\ud589\uacb0\uacfc\uac00 ERROR \uc774\uba74 \ub370\uc774\ud0c0\ub294 \uc800\uc7a5\ub418\uc9c0 \uc54a\ub294\ub2e4.<\/p>\n<p>\uc774\ub97c autocommit \ub77c \ud558\ub294\ub370 \ub610\ud55c \ub2e4\ub978\ub9d0\ub85c unchained mode<br \/>\n\ub77c\uace0\ub3c4 \ud55c\ub2e4.<\/p>\n<p>\ud3ec\uc2a4\ud2b8\uadf8\ub808\uc2a4\uc5d0\uc11c\uc758 \uc77c\ubc18\uc801\uc778 \uba85\ub839\ub4e4\uc758 \uc2e4\ud589\uc740 unchained mode \uc774\ub2e4.<br \/>\n\uadf8\ub9ac\uace0 \uc774\ub97c \uc880 \ub354 \uadf8\uc220\uc801\uc73c\ub85c \uc11c\uc220\ud558\uba74 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<p>&#8220;\uac01\uac01\uc758 \ubb38\uc7a5(statement)\ub4e4\uc740 \uc554\uc2dc\uc801\uc778 \ud2b8\ub79c\uc7ad\uc158\ub0b4\uc5d0\uc11c \uc2e4\ud589\ub418\uc5b4\uc9c0\uace0<br \/>\n\uadf8 \ubb38\uc7a5\uc758 \ub05d\ubd80\ubd84\uc5d0\uc11c commit\uac00 \uc774\ub8e8\uc5b4\uc9c0\ub294\ub370 \uc2e4\ud589\uc774 \uc131\uacf5\uc801\uc774\uba74 commit<br \/>\n\uac00 \ud589\ud574\uc9c0\uace0 \ubc18\ub300\ub85c \uc2e4\ud589\uc774 \uc131\uacf5\uc801\uc774\uc9c0 \uc54a\uc73c\uba74 rollback \ub418\uc5b4\uc9c4\ub2e4.&#8221;<\/p>\n<p>\uacb0\uad6d\uc740 \uac1c\ubcc4\uc801\uc778 SQL \ubb38\ub4e4\uc758 \uc2e4\ud589\uc5d0 \uc788\uc5b4 \uc0ac\uc6a9\uc790\ub4e4\uc740 \uc790\uc2e0\ub3c4 \ubaa8\ub974\uac8c<br \/>\n\ud2b8\ub79c\uc7ad\uc158\ub0b4\uc5d0\uc11c \uc218\ud589\ud558\uace0 \uc788\uace0 \ub610\ud55c \uadf8 \uacb0\uacfc\ub3c4 \uc790\uc2e0\ub3c4 \ubaa8\ub974\uac8c commit<br \/>\n\uc774\uac70\ub098 rollback\uc774 \uc774\ub8e8\uc5b4\uc9c4\ub2e4.<br \/>\nBEGIN \uc740 \uba85\uc2dc\uc801\uc73c\ub85c \ud2b8\ub79c\uc7ad\uc158\uc744 \uc2dc\uc791\ud568\uc744 \uc758\ubbf8\ud558\uba70 autocommit \uc774 \ub418\uc9c0<br \/>\n\uc54a\ub294\ub2e4(chained mode). \uba85\uc2dc\uc801\uc778 commit \ubb38\uc774 \uc62c\ub54c\uae4c\uc9c0 \uc791\uc5c5\ub4e4\uc758 \uacb0\uacfc\ub4e4\uc774<br \/>\n\ub370\uc774\ud0c0\ubca0\uc774\uc2a4\uc5d0 \uc800\uc7a5\ub418\uc9c0 \uc54a\ub294\ub2e4.<\/p>\n<p>BEGIN \ubb38 \ubc14\ub85c \ub4a4\uc5d0 SET \ubb38\uc744 \uc0ac\uc6a9\ud558\uc5ec \uadf8 \ud2b8\ub79c\uc7ad\uc158\uc758 \ud2b8\ub79c\uc7ad\uc158 \ubd84\ub9ac \ub808\ubca8<br \/>\n\uc744 \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4. SET \ubb38\uc758 \uc608\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<br \/>\nBEGIN WORK;<br \/>\nSET\u00a0 TRANSACTION\u00a0 ISOLATION\u00a0 LEVEL\u00a0 SERIALIZABLE<br \/>\nINSERT INTO tab VALUES(1,2,3);<br \/>\nINSERT INTO tab VALUES(3,4,5);<br \/>\nCOMMIT WORK;<\/p>\n<p>\ud2b8\ub79c\uc7ad\uc158 \ubd84\ub9ac \uc815\ucc45\uc740 \uc5ec\ub7ec \uc720\uc800\uc758 \ub3d9\uc2dc\uc131 \uc5d0 \ub300\ud55c \ubcf4\ub2e4 \uac15\ub825\ud55c \uc81c\ud55c\uc774\ub77c \ud560<br \/>\n\uc218 \uc788\uaca0\ub2e4. \ud3ec\uc2a4\ud2b8\uadf8\ub808\uc2a4\uc5d0\uc758 \ub514\ud3f4\ud2b8 \ud2b8\ub79c\uc7ad\uc158 \ubd84\ub9ac\ub808\ubca8\uc740 &#8220;READ COMMITTED&#8221;<br \/>\n\uc774\ub2e4. READ COMMITTED \ubcf4\ub2e4 \ub354\uc6b1\ub354 \uc5c4\uaca9\ud55c \ub808\ubca8\uc774 SERIALIZABLE \uc774\ub2e4.<\/p>\n<p>6. \ucc38\uace0 \ubb38\uc11c\uc640 \uae30\ud0c0<br \/>\n<a class=\"con_link\" href=\"http:\/\/database.sarang.net\/\" target=\"_blank\">http:\/\/database.sarang.net<\/a><br \/>\n<a class=\"con_link\" href=\"http:\/\/www.postgresql.org\/\" target=\"_blank\">http:\/\/www.postgresql.org<\/a><br \/>\npostgresql \ub3c4\ud050\uba3c\ud2b8<\/p>\n<p>programmer&#8217;s guide<br \/>\nuser&#8217;s guide<\/p>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<div id=\"post_footer_contents\" class=\"post_footer_contents\">\n<div class=\"wrap_tag\">\n<div id=\"tagList_20150109357\" class=\"_param(false|false|2)\">\n<div class=\"autosourcing-stub-extra\">\n<p><a class=\"item pcol2 itemTagfont _setTop\" href=\"https:\/\/blog.naver.com\/PostListByTagName.naver?blogId=ijmking&amp;logType=mylog&amp;tagName=IT%C2%B7%EC%BB%B4%ED%93%A8%ED%84%B0\"><strong>[\ucd9c\ucc98]<\/strong>\u00a0<\/a><a href=\"https:\/\/blog.naver.com\/ijmking\/20150109357\" target=\"_blank\">Postgree SQL<\/a>|<strong>\uc791\uc131\uc790<\/strong>\u00a0<a href=\"https:\/\/blog.naver.com\/ijmking\" target=\"_blank\">\ud0b9\ud338<\/a><\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n","protected":false},"excerpt":{"rendered":"<p>\uc774 \ubb38\uc11c\ub294 \ud3ec\uc2a4\ud2b8\uadf8\ub808\uc2a4\uc758 Index,function,trigger,grant,revoke,Large Object\ub97c \uc608\uc81c\uc640 \ud568\uaed8 \uc124\uba85\ud55c \uae00\uc774\ub2e4. ===================================================================================== ===================================================================================== 1.INDEX, SEQUENCE, FUNCTION(1) 1.1 CREATE INDEX INDEX \ub294 \ub370\uc774\ud0c0\ubca0\uc774\uc2a4\ub0b4\uc758 relation(\ud14c\uc774\ube14)\uc5d0 \ub300\ud55c \uac80\uc0c9\uc758 \uc131\ub2a5\uc744 \ub192\uc5ec\uc900\ub2e4. CREATE\u00a0 [UNIQUE]\u00a0 INDEX\u00a0 index_name ON\u00a0 table_name\u00a0 (name_of_attribute); CREATE\u00a0 [UNIQUE]\u00a0 INDEX\u00a0 index_name\u00a0 ON\u00a0 table_name [USING\u00a0 acc_name] (column [ops_name] [,&#8230;]); CREATE\u00a0 [UNIQUE]\u00a0 INDEX\u00a0 index_name\u00a0 ON\u00a0 table_name [USING\u00a0 acc_name] (func_name() ops_name ); ACCESS [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-823","post","type-post","status-publish","format-standard","hentry","category-mariadb-mysql"],"_links":{"self":[{"href":"https:\/\/www.onepage.co.kr\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/823","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.onepage.co.kr\/wordpress\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.onepage.co.kr\/wordpress\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.onepage.co.kr\/wordpress\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.onepage.co.kr\/wordpress\/index.php\/wp-json\/wp\/v2\/comments?post=823"}],"version-history":[{"count":3,"href":"https:\/\/www.onepage.co.kr\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/823\/revisions"}],"predecessor-version":[{"id":826,"href":"https:\/\/www.onepage.co.kr\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/823\/revisions\/826"}],"wp:attachment":[{"href":"https:\/\/www.onepage.co.kr\/wordpress\/index.php\/wp-json\/wp\/v2\/media?parent=823"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.onepage.co.kr\/wordpress\/index.php\/wp-json\/wp\/v2\/categories?post=823"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.onepage.co.kr\/wordpress\/index.php\/wp-json\/wp\/v2\/tags?post=823"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}