Next Previous Contents

5. Áß±ÞÆí

5.1 primary,foreign key ¿¹Á¦ 1


create sequence test1_seq ;

create table test1 ( 
  t_1_id   int4  default  nextval('test1_seq') ,
  t_1_name text  default  'N/A',
  primary key(t_1_id)
  );

create table test2 (
  t_2_id   int4 ,
  t_2_name text default 'N/A',
  t_2_item text default 'N/A', 
  CONSTRAINT const_test2
  FOREIGN KEY(t_2_id) REFERENCES test1
  ON DELETE CASCADE
  ON UPDATE CASCADE
  );

insert into test1(t_1_name) values('jone');
insert into test2 values(currval('test1_seq'),'jone','A-100');
insert into test1(t_1_name) values('sam');
insert into test2 values(currval('test1_seq'),'sam','B-500');

select * from test1;

    t_1_id | t_1_name 
   --------+----------
         1 | jone
         2 | sam
   (2 rows)


select * from test2;

   t_2_id | t_2_name | t_2_item 
  --------+----------+----------
        1 | jone     | A-100
        2 | sam      | B-500
  (2 rows)


delete from test1 where t_1_id=1;

select * from test1;

   t_1_id | t_1_name 
  --------+----------
        2 | sam
  (1 row)


select * from test2;

   t_2_id | t_2_name | t_2_item 
  --------+----------+----------
        2 | sam      | B-500
  (1 row)


update test1 set t_1_id=10 , t_1_name='abc'  where t_1_id=2;

select * from test1;

   t_1_id | t_1_name 
  --------+----------
       10 | abc
  (1 row)

select * from test2;

   t_2_id | t_2_name | t_2_item 
  --------+----------+----------
       10 | sam      | B-500
  (1 row)

´ÙÀ½ÀÇ ¿¹Á¦´Â À§ÀÇ Example 1 ¿¹Á¦¿Í °ÅÀÇ ºñ½ÁÇÕ´Ï´Ù. ´ÜÁö, Primary, Foreign Key¿¡ µÎ°³ÀÇ columnÀ» »ç¿ëÇÑ °Í¸¸ »©°í¿ä..

----Example 2


create sequence test1_seq ;

create table test1 ( 
  t_1_id   int4  default  nextval('test1_seq') ,
  t_1_name text  default  'N/A',
  primary key(t_1_id, t_1_name)
  );

create table test2 (
  t_2_id   int4 ,
  t_2_name text default 'N/A',
  t_2_item text default 'N/A', 
  CONSTRAINT const_test2
  FOREIGN KEY(t_2_id, t_2_name) REFERENCES test1
  ON DELETE CASCADE
  ON UPDATE CASCADE
  );

insert into test1(t_1_name) values('jane');
insert into test2 values(currval('test1_seq'),'jane','A-100');
insert into test1(t_1_name) values('sam');
insert into test2 values(currval('test1_seq'),'sam','B-500');
insert into test1(t_1_name) values('tom');
insert into test2 values(currval('test1_seq'),'tom','C-150');

select * from test1;

    t_1_id | t_1_name 
   --------+----------
         1 | jane
         2 | sam
         3 | tom
   (3 rows)

select * from test2;

    t_2_id | t_2_name | t_2_item 
   --------+----------+----------
         1 | jane     | A-100
         2 | sam      | B-500
         3 | tom      | C-150
   (3 rows)

delete from test1 where t_1_id=1;

select * from test1;

    t_1_id | t_1_name 
   --------+----------
         2 | sam
         3 | tom
   (2 rows)

select * from test2;

    t_2_id | t_2_name | t_2_item 
   --------+----------+----------
         2 | sam      | B-500
         3 | tom      | C-150
   (2 rows)

update test1 set t_1_id=10 , t_1_name='abc'  where t_1_id=3;

select * from test1;

    t_1_id | t_1_name 
   --------+----------
         2 | sam
        10 | abc
   (2 rows)

select * from test2;

    t_2_id | t_2_name | t_2_item 
   --------+----------+----------
         2 | sam      | B-500
        10 | abc      | C-150
   (2 rows)

5.2 primary,foreign key ¿¹Á¦ 2

--°í°´°ú »óǰ¿¡´Â ÆÇ¸Å¶ó´Â °ü°è°¡ ¼º¸³ÇÑ´Ù. 

   °í°´  TABLE                 »óǰ TABLE      
  +-----------+              +------------+ Primary Key     
  | °í°´_¹øÈ£ +--+ Primary   | »óǰ_¹øÈ£  +---+   
  +-----------+  |           +------------+   |
  | °í°´_¼ºº° |  |           | »óǰ_À̸§  |   |
  +-----------+  |           +------------+   |
  | °í°´_ÀüÈ­ |  |           | »óǰ_ȸ»ç  |   |
  +-----------+  |           +------------+   |
  | °í°´_ÁÖ¼Ò |  |           | »óǰ_°¡°Ý  |   |
  +-----------+  |           +------------+   |
                 |                            |
                 |                            |
                 |                            |
                 |      ÆÇ¸Å TABLE            |
                 |    +----------------+      |
                 |    | ÆÇ¸Å_¹øÈ£      |      |
                 |    +----------------+      |
                 +----+ ÆÇ¸Å_°í°´_¹øÈ£ |      |
              Foreign +----------------+      |
                      | ÆÇ¸Å_»óǰ_¹øÈ£ +------+ 
                      +----------------+ Foreign Key    
                      | ÆÇ¸Å_³¯Â¥      |   
                      +----------------+   
                      | ÆÇ¸Å_°³¼ö      |   
                      +----------------+   
                      

´ÙÀ½Àº À§ÀÇ ±×¸²¿¡ ´ëÇÑ ¿¹Á¦ÀÔ´Ï´Ù.

create table °í°´ (
 °í°´_¹øÈ£   text , 
 °í°´_À̸§   text,
 °í°´_¼ºº°   bool,
 °í°´_ÀüÈ­   text, 
 °í°´_ÁÖ¼Ò   text,
 primary key(°í°´_¹øÈ£)
 );

create table »óǰ (
 »óǰ_¹øÈ£  text, 
 »óǰ_À̸§  text,
 »óǰ_ȸ»ç  text,
 »óǰ_°¡°Ý  int4,
 primary key(»óǰ_¹øÈ£)
);

create table ÆÇ¸Å (
 ÆÇ¸Å_¹øÈ£         text, 
 ÆÇ¸Å_°í°´_¹øÈ£    text,  
 ÆÇ¸Å_»óǰ_¹øÈ£    text,
 ÆÇ¸Å_³¯Â¥         date, 
 ÆÇ¸Å_°³¼ö         int4,

 constraint °í°´_con 
 foreign key(ÆÇ¸Å_°í°´_¹øÈ£) references °í°´(°í°´_¹øÈ£)  ,

 constraint »óǰ_con 
 foreign key(ÆÇ¸Å_»óǰ_¹øÈ£)  references »óǰ(»óǰ_¹øÈ£)
);


insert into °í°´ values (
         'ÇØ¿î´ë±¸-001-³²-30', 'nogadax', 't', 
         '051-729-7777', 'ºÎ»ê½Ã ÇØ¿î´ë±¸ ÇØ¿î´ë µ¿¹é¼¶ 1/1'
);

insert into °í°´ values (
         '³²±¸-002-³²-27', 'ogler', 't', 
         '051-629-7887', 'ºÎ»ê½Ã ³²±¸ ¿ëÈ£µ¿ 2/1'
);

insert into °í°´ values (
         '³²±¸-003-³²-32', 'winob', 't', 
         '051-629-2111', 'ºÎ»ê½Ã ³²±¸ ´ë¿¬µ¿ 8/8'
);


insert into »óǰ values 
     ('co-001-e-01' , 'TV'    , 'NGD co.' , 90000);
insert into »óǰ values 
     ('co-008-e-02' , 'RADIO' , 'NGD co.' , 20000);
insert into »óǰ values 
     ('co-011-e-01' , 'AUDIO' , 'NGD co.' , 70000);


select * from °í°´;

    °í°´_¹øÈ£      | °í°´_À̸§ |..|             °í°´_ÁÖ¼Ò             
-------------------+-----------+..+-----------------------------------
ÇØ¿î´ë±¸-001-³²-30 | nogadax   |..| ºÎ»ê½Ã ÇØ¿î´ë±¸ ÇØ¿î´ë µ¿¹é¼¶ 1/1
³²±¸-002-³²-27     | ogler     |..| ºÎ»ê½Ã ³²±¸ ¿ëÈ£µ¿ 2/1
³²±¸-003-³²-32     | winob     |..| ºÎ»ê½Ã ³²±¸ ´ë¿¬µ¿ 8/8
(3 rows)


select * from »óǰ;


  »óǰ_¹øÈ£  | »óǰ_À̸§ | »óǰ_ȸ»ç | »óǰ_°¡°Ý 
-------------+-----------+-----------+-----------
 co-001-e-01 | TV        | NGD co.   |     90000
 co-008-e-02 | RADIO     | NGD co.   |     20000
 co-011-e-01 | AUDIO     | NGD co.   |     70000
(3 rows)


--integrity(¹«°á¼º)¿¡ ¹®Á¦°¡ ¾øÀ¸¹Ç·Î.. ÀÔ·ÂÀÌ ÀÌ·ç¾îÁø´Ù. 

insert into ÆÇ¸Å values (
      'ÆÇ¸Å_001_S_Branch' , '³²±¸-002-³²-27', 
      'co-001-e-01' ,'2001-03-27',2
);


--integrity(¹«°á¼º) error ..ÀÔ·ÂÀÌ µÇÁö ¾Ê´Â´Ù.  
--"³²±¸-003-³²-27"À̶õ °ªÀº  "°í°´" Å×À̺íÀÇ "°í°´_¹øÈ£"¿¡ ¾øÀ½.
--"co-001-e-02"   À̶õ °ªÀº  "»óǰ" Å×À̺íÀÇ "»óǰ_¹øÈ£"¿¡ ¾øÀ½

insert into ÆÇ¸Å values ('ÆÇ¸Å_001_S_Branch' , '³²±¸-003-³²-27', 
           'co-011-e-01' ,'2001-03-28',1
);

insert into ÆÇ¸Å values ('ÆÇ¸Å_001_S_Branch' , '³²±¸-003-³²-32', 
           'co-001-e-02' ,'2001-03-29',3
);

select * from ÆÇ¸Å;

     ÆÇ¸Å_¹øÈ£     | ÆÇ¸Å_°í°´_¹øÈ£ | ÆÇ¸Å_»óǰ_¹øÈ£ | ÆÇ¸Å_³¯Â¥  | ÆÇ¸Å_°³¼ö 
-------------------+----------------+----------------+------------+-----------
 ÆÇ¸Å_001_S_Branch | ³²±¸-002-³²-27 | co-001-e-01    | 2001-03-27 |         2
(1 row)

´ÙÀ½Àº À§ ¿¹Á¦ÀÇ Full SQL sourceÀÌ´Ù.

-------------------------------Cut here!!
drop index °í°´_pkey;
drop index »óǰ_pkey;
drop table °í°´; 
drop table »óǰ; 
drop table ÆÇ¸Å; 

create table °í°´ (
 °í°´_¹øÈ£   text , 
 °í°´_À̸§   text,
 °í°´_¼ºº°   bool,
 °í°´_ÀüÈ­   text, 
 °í°´_ÁÖ¼Ò   text,
 primary key(°í°´_¹øÈ£)
 );

create table »óǰ (
 »óǰ_¹øÈ£  text, 
 »óǰ_À̸§  text,
 »óǰ_ȸ»ç  text,
 »óǰ_°¡°Ý  int4,
 primary key(»óǰ_¹øÈ£)
);

create table ÆÇ¸Å (
 ÆÇ¸Å_¹øÈ£         text, 
 ÆÇ¸Å_°í°´_¹øÈ£    text,  
 ÆÇ¸Å_»óǰ_¹øÈ£    text,
 ÆÇ¸Å_³¯Â¥         date, 
 ÆÇ¸Å_°³¼ö         int4,

 constraint °í°´_con 
 foreign key(ÆÇ¸Å_°í°´_¹øÈ£) references °í°´(°í°´_¹øÈ£)  ,
 constraint »óǰ_con 
 foreign key(ÆÇ¸Å_»óǰ_¹øÈ£)  references »óǰ(»óǰ_¹øÈ£)
);

insert into °í°´ values (
         'ÇØ¿î´ë±¸-001-³²-30', 'nogadax', 't', 
         '051-729-7777', 'ºÎ»ê½Ã ÇØ¿î´ë±¸ ÇØ¿î´ë µ¿¹é¼¶ 1/1'
);
insert into °í°´ values (
         '³²±¸-002-³²-27', 'ogler', 't', 
         '051-629-7887', 'ºÎ»ê½Ã ³²±¸ ¿ëÈ£µ¿ 2/1'
);
insert into °í°´ values (
         '³²±¸-003-³²-32', 'winob', 't', 
         '051-629-2111', 'ºÎ»ê½Ã ³²±¸ ´ë¿¬µ¿ 8/8'
);


insert into »óǰ values 
     ('co-001-e-01' , 'TV'    , 'NGD co.' , 90000);
insert into »óǰ values 
     ('co-008-e-02' , 'RADIO' , 'NGD co.' , 20000);
insert into »óǰ values 
     ('co-011-e-01' , 'AUDIO' , 'NGD co.' , 70000);

select * from °í°´;
select * from »óǰ;


--integrity(¹«°á¼º)¿¡ ¹®Á¦°¡ ¾øÀ¸¹Ç·Î.. ÀÔ·ÂÀÌ ÀÌ·ç¾îÁø´Ù. 

insert into ÆÇ¸Å values (
      'ÆÇ¸Å_001_S_Branch' , '³²±¸-002-³²-27', 
      'co-001-e-01' ,'2001-03-27',2
);


--integrity(¹«°á¼º) error ..ÀÔ·ÂÀÌ µÇÁö ¾Ê´Â´Ù.  
--"³²±¸-003-³²-27"À̶õ °ªÀº  "°í°´" Å×À̺íÀÇ "°í°´_¹øÈ£"¿¡ ¾øÀ½.
--"co-001-e-02"   À̶õ °ªÀº  "»óǰ" Å×À̺íÀÇ "»óǰ_¹øÈ£"¿¡ ¾øÀ½

insert into ÆÇ¸Å values ('ÆÇ¸Å_001_S_Branch' , '³²±¸-003-³²-27', 
           'co-011-e-01' ,'2001-03-28',1
);
insert into ÆÇ¸Å values ('ÆÇ¸Å_001_S_Branch' , '³²±¸-003-³²-32', 
           'co-001-e-02' ,'2001-03-29',3
);

select * from ÆÇ¸Å;
-----------------------------End ..

5.3 serial,sequence

´ÙÀ½Àº serial ¿¡Á¦ÀÌ´Ù.

--SERIAL (Auto-Sequence type)

drop sequence table_name1_colm_id_seq;
drop index table_name1_colm_id_key;
drop table table_name1;

DROP
DROP
DROP

create table table_name1(
 colm_id serial , 
 colm_name text
);

CREATE

insert into table_name1(colm_name) values('xxx');
insert into table_name1(colm_name) values('yyy');
insert into table_name1(colm_name) values('zzz');

INSERT 22729 1
INSERT 22730 1
INSERT 22731 1

select * from table_name1;

 colm_id | colm_name 
---------+-----------
       1 | xxx
       2 | yyy
       3 | zzz
(3 rows)

´ÙÀ½Àº sequence ¿¹Á¦ÀÌ´Ù.

drop sequence table_name2_colm_id_seq;
drop index table_name2_colm_id_key;
drop table table_name2;

DROP
DROP
DROP

create sequence table_name2_colm_id_seq;
create table table_name2(
 colm_id int4 default nextval('table_name2_colm_id_seq'), 
 colm_name text
);
create unique index table_name2_colm_id_key on table_name2(colm_id);

CREATE
CREATE
CREATE

insert into table_name2(colm_name) values('aaa');
insert into table_name2(colm_name) values('bbb');
insert into table_name2(colm_name) values('ccc');

INSERT 22763 1
INSERT 22764 1
INSERT 22765 1

select * from table_name2;

 colm_id | colm_name 
---------+-----------
       1 | aaa
       2 | bbb
       3 | ccc
(3 rows)

5.4 Function


CREATE TABLE FUNCTION_NAME([PARAM1,PARAM2,..]) RETURNS [SETOF] DATA_TYPE
AS ' 
   USER_DEFINITION 
' LANGUAGE 'lang';

À§ÀÇ []´Â »ý·« °¡´ÉÇÔÀ» ÀǹÌÇÑ´Ù. lang¿¡´Â sql,plpgsql,c µîÀÌ ¿Ã¼ö ÀÖ´Ù.

´ÙÀ½Àº ¾ÕºÎºÐ(±âÃÊÆí1)¿¡¼­ ¾ð±ÞµÈ function ¿¹ÀÌ´Ù. ½ÇÇà °á°ú´Â ¾ÕºÎºÐÀ» ÂüÁ¶Ç϶ó.

 CREATE FUNCTION SQL_FUNC_1(int4) RETURNS text AS '
 SELECT
  CASE
     WHEN NOGADA_TAB.id_ngd = $1
       THEN ''ÀÖ±º¿ä..''::text
       ELSE ''¾ø±º¿ä..''::text
  END
 ' LANGUAGE 'sql';

  SELECT SQL_FUNC_1(1) ;

´ÙÀ½Àº Æ÷½ºÆ®±×·¹½ºÀÇ functionÀ¸·Î °£´ÜÇÑ ¿¹¿Í ±× °á°úÀÌ´Ù.

    create function func1() returns text
    as ' select \'nogadax\'::text \; ' 
    language 'sql';


    select func1() as name;

      name 
   -------
   nogadax
   (1 row)

returns ¿¡ ¿¹¾à¾î setof ¸¦ »ç¿ëÇϸé Çѹø¿¡ ¿©·¯ µ¥ÀÌŸ¸¦ ¹ÞÀ» ¼ö ÀÖ´Ù. ¸®ÅÏÇü¿¡´Â ÀÏ¹Ý ÀÚ·áÇü»Ó¸¸¾Æ´Ï¶ó Å×À̺íÀ̳ª ºäµµ Æ÷ÇԵȴÙ.

    create table tablex (id_t int4, name text);
       
    insert into tablex values ( 1, 'abc'); 
    insert into tablex values ( 2, 'bcd');        
    insert into tablex values ( 3, 'cde');        
    insert into tablex values ( 4, 'def');        

    create function func2(int4) returns setof tablex
    as ' select * from tablex where id_t > $1 '
    language 'sql';

    select id_t(func2(1)) as id ;
        
      id
     ---
       2
       3
       4
   (3 rows)

    select id_t(func2(2)) as id , name(func2(2)) as name;

    id  |   name
   -----+-------- 
     3  |    cde
     4  |    def
  (2 rows)

5.5 PL/pgSQL

PL/pgSQLÀº PGLIBÀÇ plpgsql.so¸¦ ÇÊ¿ä·Î Çϸç ÀÌ ÆÄÀÏÀ» Çڵ鷯 ȤÀº 󸮱â¶ó ÇÑ´Ù. PL/pgSQLÀ» »ç¿ëÇϱâ À§Çؼ­´Â Çڵ鷯¸¦ µ¥ÀÌŸº£À̽º¿¡ µî·ÏÇÏ¿©¾ß ÇÑ´Ù. Âü°í·Î Æ®¸®°Å¿¡¼­ PL/pgSQL ÀÌ »ç¿ëµÉ¶§´Â Æ®¸®°Å ÇÁ·Î½ÃÁ®¶ó ÇÑ´Ù. ´ÙÀ½Àº µî·Ï ¿¹ÀÌ´Ù.

 $ su - postgres
 $ createlang plpgsql template1
 $

´ÙÀ½Àº PL/pgSQLÀÇ ¿¹ÀÌ´Ù.

create function test(int4)returns int4
as ' 
  begin 
    return $1;
   end;
' language 'plpgsql';

 select test(2) ;

  test
  ----
    2
  (1 rows)

5.6 Æ®¸®°Å ÇÁ·Î½ÃÁ®

Æ®¸®°Å ÇÁ·Î½ÃÁ®¶õ Æ®¸®°Å¿¡¼­ »ç¿ëµÇ´Â FUNCTION À» ÀǹÌÇϸç PL/pgSQLÀÌ Æ®¸®°Å¿¡¼­ »ç¿ëµÉ °æ¿ìµµ ¸¶Âù°¡Áö·Î Æ®¸®°Å ÇÁ·Î½ÃÁ®¶ó ÇÑ´Ù.

PL/pgSQL ÀÌ Æ®¸®°Å ÇÁ·Î½ÃÁ®·Î ½Ã¿ëµÉ ¶§ Ưº°È÷ »ç¿ëµÇ´Â º¯¼öµéÀÌ ÀÖ´Ù. ´ÙÀ½Àº Æ®¸®°Å ÇÁ·Î½ÃÁ® º¯¼öµéÀÇ ¿¹ÀÌ´Ù.

±âŸ ÀÚ¼¼ÇÑ °ÍÀº °ü·Ã ¹®¼­¸¦ ã¾Æº¸±â ¹Ù¶õ´Ù.

5.7 Æ®¸®°Å

Æ®¸®°Å´Â ÇϳªÀÇ ROW¿¡ ´ëÇØ µ¿ÀÛÇÑ´Ù(FOR EACH ROW). Áï, µ¿½Ã¿¡ ¿©·¯ ROW¿¡ ´ëÇØ 󸮰¡ ÀÌ·ç¾îÁöÁö ¾Ê´Â´Ù. ÀÌ´Â RULE°úÀÇ Â÷ÀÌÁ¡ÀÌ´Ù. ´ÙÀ½Àº Æ®¸®°Å ¿¹Á¦ÀÌ´Ù.

CREATE TABLE test_table1 (test_id int, test_name text);
CREATE TABLE test_table2 (test_id int, test_name text);

insert into test_table1 values(1,'jini1');
insert into test_table2 values(1,'jini1');
insert into test_table1 values(2,'jini2');
insert into test_table2 values(2,'jini2');

insert into test_table1 values(10,'jini10');
insert into test_table1 values(15,'jini15');
insert into test_table1 values(19,'jini19');
insert into test_table1 values(20,'jini20');

select * from test_table1;

 test_id | test_name 
---------+-----------
       1 | jini1
       2 | jini2
      10 | jini10
      15 | jini15
      19 | jini19
      20 | jini20
(6 rows)

select * from test_table2;


   test_id | test_name 
  ---------+-----------
         1 | jini1
         2 | jini2
  (2 rows)

--RAISE ´Â ¿¹¿Ü ó¸®ÀÚÀ̸ç NOTICE, EXCEPTION µîÀÌ ¿Ã ¼ö ÀÖ´Ù. 
--RAISE µÚÀÇ EXCEPTION Àº ¿¹¿Ü ¹ß»ý½Ã ÇØ´ç Æ®·£Àè¼ÇÀ» ÁßÁöÇÑ´Ù.

CREATE FUNCTION test_func1() RETURNS OPAQUE AS '
 BEGIN
   IF NEW.test_id < 20  THEN 
    RAISE NOTICE ''³Ê¹« À۾ƿä. % %'', TG_RELNAME ,TG_OP;
   END IF;
   RETURN OLD;
 END; 
' language 'plpgsql';

CREATE TRIGGER test_trg1 AFTER INSERT ON test_table1
FOR EACH ROW EXECUTE PROCEDURE test_func1();


insert into test_table1 values(10,'jini10');

NOTICE: ³Ê¹« À۾ƿä. test_table1 INSERT
psql:test_trg:76 NOTICE:  ³Ê¹« À۾ƿä. test_table2 INSERT
INSERT 21228 1


insert into test_table1 values(15,'jini15');

NOTICE: ³Ê¹« À۾ƿä. test_table1 INSERT
psql:test_trg:77 NOTICE:  ³Ê¹« À۾ƿä. test_table2 INSERT
INSERT 21229 1


select * from test_table1;

   test_id | test_name 
  ---------+-----------
         1 | jini1
         2 | jini2
        10 | jini10
        15 | jini15
        19 | jini19
        20 | jini20
        10 | jini10
        15 | jini15
  (8 rows)

5.8 Rule examples

instead ÀÖ´Â ¾×¼ÇÀº user command ½ÇÇà¾ÈÇÔ. ¿©±â¼­ÀÇ user command ´Â rule1 À» ±âµ¿ÇÏ´Â test1 ¿¡ ´ëÇÑ insert .. SQL ¹®ÀÌ´Ù. Áï, rule1 ÀÇ test1Å×ÀÌºí¿¡ ´ëÇÑ insert ¸í·ÉÀº ½ÇÇàµÇÁö ¾Ê°í do instead µÚÀÇ update¹®¸¸ ½ÇÇàµÊ. instead °¡ ¾ø´Ù¸é do µÚÀÇ actionÀ» ÃëÇϰí user command °¡ ½ÇÇàµÊ

create table test1(tid int4,tname text);
create table test2(tid int4,tname text);

insert into test1 values(1,'test1');
insert into test2 values(2,'test2');

create rule rule1 as on insert to test1
do instead update test1 set tname='t1';

create rule rule2 as on insert to test2
do update test2 set tname='t2';

insert into test1 values(3,'test1');
insert into test2 values(4,'test2');

select * from test1;


 tid | tname 
-----+-------
   1 | t1
(1 row)


select * from test2;

 tid | tname 
-----+-------
   2 | t2
   4 | test2
(2 rows)

create view °¡ ¾Æ´Ñ create rule¸¦ »ç¿ëÇÏ¿© view ¸¦ »ý¼ºÇÒ °æ¿ì ÇØ´ç Å×ÀÌºí¿¡ ´ëÇÑ »õ·Î¿î ºó Å×À̺íÀ» »ý¼ºÇÏ°í ±× Å×À̺íÀ» view·Î »ç¿ëÇÑ´Ù.

¾Æ·¡ÀÇ ¿¹¿¡¼­ "_RETtest3"Àº Ưº°ÇÑ rule À̸§À¸·Î¼­ rule ·Î view ¸¦ »ý¼ºÇÒ °æ¿ìÀÇ ¿¹¾à¾î ±¸½ÇÀ» ÇÑ´Ù. Áï, test3 ¿¡ ´ëÇÑ view ¸¦ ¸¸µé·Á´Â ruleÀÇ °æ¿ì ÇØ´ç view¸íÀº "_RETtest3" À¸·Î Á¤ÇØ¾ß ÇÑ´Ù.

--view rule for test3

create table test3(tid int4,tname text);
create rule "_RETtest3" as on select to test3 
do instead select * from test1;

select * from test3;

 tid | tname 
-----+-------
   1 | t1
(1 row)

ruleÀÌ Á¦´ë·Î µî·ÏµÇ¾ú´ÂÁö È®ÀÎÄÚÀÚ ½Ã½ºÅÛ Ä«Å»·Î±×ÀÎ pg_rewrite¸¦ °Ë»öÇÑ´Ù.

select rulename from pg_rewrite;

    rulename    
----------------
 _RETpg_user
 _RETpg_rules
 _RETpg_views
 _RETpg_tables
 _RETpg_indexes
 rule1
 rule2
 rule3
 _RETtest3
(9 rows)

5.9 ½Ã½ºÅÛ Ä«Å»·Î±× Ȱ¿ë ¿¹

´ÙÀ½Àº ½Ã½ºÅÛ Ä«Å»·Î±×ÀÇ È°¿ë ¿¹ÀÌ´Ù.

--Select database_name

 SELECT pg_database.datname , pg_user.usename      
  FROM   pg_database, pg_user      
  WHERE  pg_database.datdba = pg_user.usesysid ;


  datname  | usename  
-----------+----------
 postgres  | postgres
 betty     | postgres
 nogada    | postgres
 jini      | postgres
 winob     | postgres
 template1 | postgres
 registdb  | webdb
 test2     | speedall
 test1     | lockmind
(9 rows)


--select system_relation

SELECT c.relname as Name, 'table'::text as Type, u.usename as Owner
  FROM pg_class c, pg_user u
  WHERE c.relowner = u.usesysid AND c.relkind = 'r'
    AND not exists (select 1 from pg_views where viewname = c.relname)
    AND c.relname ~ '^pg_';

      name      | type  |  owner   
----------------+-------+----------
 pg_type        | table | postgres
 pg_attribute   | table | postgres
 pg_proc        | table | postgres
 pg_class       | table | postgres
 pg_group       | table | postgres
 pg_database    | table | postgres
 pg_attrdef     | table | postgres
 pg_relcheck    | table | postgres
 pg_trigger     | table | postgres
 pg_inherits    | table | postgres
 pg_index       | table | postgres
 pg_statistic   | table | postgres
 pg_operator    | table | postgres
 pg_opclass     | table | postgres
 pg_am          | table | postgres
 pg_amop        | table | postgres
 pg_amproc      | table | postgres
 pg_language    | table | postgres
 pg_aggregate   | table | postgres
 pg_ipl         | table | postgres
 pg_inheritproc | table | postgres
 pg_rewrite     | table | postgres
 pg_listener    | table | postgres
 pg_description | table | postgres
 pg_shadow      | table | postgres
(25 rows)


--select normal_relation

SELECT c.relname as Name, 'table'::text as Type, u.usename as Owner
   FROM pg_class c, pg_user u
   WHERE c.relowner = u.usesysid AND c.relkind = 'r'
     AND not exists (select 1 from pg_views where viewname = c.relname)
     AND c.relname !~ '^pg_';

    name    | type  | owner 
------------+-------+-------
 regist_tab | table | webdb
(1 row)


-- * Get general table info 

SELECT relhasindex, relkind, relchecks, reltriggers, relhasrules
  FROM pg_class WHERE relname='regist_tab';

 relhasindex | relkind | relchecks | reltriggers | relhasrules 
-------------+---------+-----------+-------------+-------------
 f           | r       |         0 |           0 | f
(1 row)


-- * Get column info 

SELECT a.attname, t.typname,a.atttypmod-4 as Type_Length,t.typalign, 
          t.typlen ,a.attstorage,a.attnotnull, a.atthasdef, a.attnum
         
   FROM pg_class c, pg_attribute a, pg_type t
   WHERE c.relname = 'regist_tab'
   AND a.attnum > 0 AND a.attrelid = c.oid AND a.atttypid = t.oid
   ORDER BY a.attnum;

 attname | typname | type_length |..| atthasdef | attnum 
---------+---------+-------------+..+-----------+--------
 a       | varchar |           2 |..| f         |      1  
 b       | varchar |           4 |..| f         |      2  
 c       | varchar |           6 |..| f         |      3
(3 rows)


--±âŸ ½Ã½ºÅÛ Ä«Å»·Î±× SQL ¹® 

select tablename from pg_tables;
select relname,relhaspkey from pg_class;
select datname from pg_database;ö

5.10 pg_shadow,pg_user

´ÙÀ½Àº Æ÷½ºÆ®±×·¹½º¸¦ ¼³Ä¡ ÈÄ Æ÷½ºÆ®±×·¹½ºÀÇ ½´ÆÛÀ¯Àú postgres À¯Àú¿¡°Ô ÆÐ½º¿öµå¸¦ ÇÒ´çÇÏ´Â ¿¹ÀÌ¸ç ÆÐ½º¿öµå¸¦ ÇÒ´ç ÈÄ À¯Àú Á¤º¸¸¦ »ìÇÇ´Â ¿¹ÀÌ´Ù. "alter user .."´Â ±âÁ¸ÀÇ »ç¿ëÀÚ Á¤º¸¸¦ ¼öÁ¤ÇÑ´Ù. °¢°¢ÀÇ ¸í·ÉÀº ½´ÆÛÀ¯Àú "postgres"·Î ½ÇÇàÇÏ¿´´Ù.

template1=# alter user postgres with password 'abxy912q';
ALTER USER

template1=# select * from pg_user;

 usename  | usesysid | usecreatedb |..| usecatupd |  passwd  | valuntil 
----------+----------+-------------+..+-----------+----------+----------
 postgres |      501 | t           |..| t         | ******** | 
(1 row)

template1=# select * from pg_shadow;

 usename  | usesysid | usecreatedb |..| usecatupd |  passwd  | valuntil 
----------+----------+-------------+..+-----------+----------+----------
 postgres |      501 | t           |..| t         | abxy912q | 
(1 row)

template1=#

Next Previous Contents