37
Copyright © 2009 by Peekanung                                                                                                     1 PostgreSQL 8.3 Manual

PostgreSQL Manual (ภาษาไทย)

Embed Size (px)

DESCRIPTION

Manual การใช้ PostgreSQL 8.3 สรุปมาจาก Documents ของเว็บ postgres (http://www.postgresql.org/docs/manuals/) เนื้อหาประกอบด้วย 3 หัวข้อหลักๆ คือ ความรู้ทั่วไปเกี่ยวกับ PostgreSQL , Installation และ การใช้งานค่ะ

Citation preview

Copyright © 2009 by Peekanung                                                                                                     1

PostgreSQL 8.3 Manual

Copyright © 2009 by Peekanung                                                                                                     2

Page1. เกยวกบ PostgreSQL 3

2. Installation PostgreSQL บน Ubuntu 42.1 เกยวกบ pg_hba.conf 62.2 เกยวกบ postgresql.conf 72.3 Install pgAdmin GUI Application 8

3. การใชงาน PostgreSQL 103.1 postgreSQL-Client Application (psql) 103.2 การจดการ Database 103.3 การจดการ Table และ View 12

3.3.1 Table 123.3.2 View 14

3.4 การจดการ Roles 153.5 Data type 193.6 การ Import/Export data 203.7 postgreSQL Functions 213.8 Partitioning Table 223.9 Materialized View 24

3.9.1 Snapshot 243.9.2 Eager 273.9.3 Lazy 323.9.4 Very Lazy 32

3.10 การสำารองขอมล 353.10.1 Backup 353.10.2 Restore 36

3.11 Database Maintenance 37

Copyright © 2009 by Peekanung                                                                                                     3

1. เกยวกบ PostgreSQL

PostgreSQL เปน object-relational database management system (ORDBMS) พฒนามาจาก POSTGRES Version 4.2 โดย University of California at Berkeley ภาควชา Computer Science PostgreSQL เปนโปรแกรม Open source สามารถนำาไปใชงานไดโดยไมมคาใชจาย และสนบสนนมาตรฐาน SQL:2003

ซงมความสามารถตางๆ เชน complex query foreign keys triggers views transactional integrity multiversion concurrency control

นอกจากน PostgreSQL ยงใหผใชงาน(User) กำาหนดการใชงานเองได เชน

Data types Functions Operators Aggregate functions Index methods Procedural languages

รายละเอยดทวไปเกยวกบ PostgreSQL ขนาดฐานขอมล : ไมจำากด ขนาดตารางขอมล(table) : ไมเกน 32 TB ขนาดของขอมลแตละรายการ(row) : ไมเกน 400 GB ขนาดของขอมลแตละ field : 1GB จำานวนรายการ(rows) ในตารางขอมล(table) : ไมจำากด จำานวน columns ในตารางขอมล(table): 250-1600 columns ขนอยกบชนด column จำานวน indexes ในตารางขอมล(table) : ไมจำากด การตงชอ

ขนตนดวยตวอกษรหรอ underscore(_) ความยาวไมเกน 31 ตวอกษร ไมซำากบ reserve word หรอถาตองการใหใช Quote(“”) การใช Quote(“”) จะทำาใหชอทอยใน Quote(“”) เปนแบบ Case Sensitive ชอทอยในประเภทเดยวกนตองไมซำากน เชน

■ ชอ Database ทอยใน Cluster เดยวกนตองไมซำากน■ ชอ Table ทอยใน Database เดยวกนตองไมซำากน■ ชอ Column ทอยใน Table เดยวกนตองไมซำากน■ ชอ Index ทอยใน Database เดยวกนตองไมซำากน

รปดานลาง เปนโครงสรางอยางงายของ PostgreSQL

Copyright © 2009 by Peekanung                                                                                                     4

2. Install PostgreSQL 8.3 บน Ubuntu

ในการตดตงระบบฐานขอมล PostgreSQL นนผใชงานทำาไดโดย Install Package Postgresql ดวยคำาสงตอไปน$ sudo apt-get install postgresql

หลงจากท Os ทำาการ install Package เสรจเรยบรอยแลว Home ของ PostgreSQL จะถกตดตงอยท /var/lib/postgres/ และจะมกลมของผใชงาน และ user ทชอวา postgres ซงใชในการเรยกใชงานระบบฐานขอมล PostgreSQL แตเพอความปลอดภยในการใชงานระบบฐานขอมล เราไมควรจะอนญาตใหใช username : postgres เขาใชงานระบบจงควร สราง user ใหมดวยคำสง ( ตวอยาง : user01)

$ createuser -P user01 // ใช -P เพอ assign password ให user Enter password for new role:Enter it again:Shall the new role be a superuser? (y/n) Shall the new role be allowed to create databases? (y/n) Shall the new role be allowed to create more new roles? (y/n)

หลงจากทผใชงานสราง user ไดแลว ผใชงานยงสามารถสราง database ดวยคำาสง ( ตวอยาง : mydb)$ createdb mydb

สามารถเขาใชงาน Database ทถกสรางไวดวยคำาสงตอไปน$ psql -d mydb // ใช -d เพอระบ ชอ database

หรอ$ psql -d mydb -U user01 // ใช -U เพอระบ user ทใชในการ connect ( ถาไมระบจะหมายถง user :

postgres เสมอ )

   

หมายเหต1. สามารถเขาใชงาน database โดยใชคำาสง psql ตามดวยชอ Database และชอ User ตามลำาดบ โดยไมตองระบ option

เนองจาก default format เปน psql <database name> <user name> เชน $ psql mydb user01

Copyright © 2009 by Peekanung                                                                                                     5

2. การเขาใชงานทกครง ตองระบขอ Database เสมอ ( ชอ User จะกำาหนดหรอไมกได) เชน $ psql mydb // สามารถ connect ได โดย Database = mydb , User = postgres (default user)

$ psql -d mydb // สามารถ connect ได โดย Database = mydb , User = postgres (default user) $ psql user01 // ไมสามารถ connect ได เนองจากไมม database ชอ user01

3. สามารถเขาใชงานโดยการระบเฉพาะชอ User โดยใช option -U ไดกรณเดยวคอ ชอ Database และชอ User เปนชอ เดยวกน เชน3.1 ชอ Database และชอ User เปนชอเดยวกน คอ xyz

$ createuser -P xyz // สราง user ชอ xyz โดยกำาหนดใหม password$ createdb xyz // สราง database ชอ xyz $ psql xyz xyz // สามารถ connect ได โดย Database = xyz , User = xyz$ psql xyz // สามารถ connect ได โดย Database = xyz , User = postgres (default user)$ psql -d xyz // สามารถ connect ได โดย Database = xyz , User = postgres (default user)$ psql -U xyz // สามารถ connect ได โดย Database = xyz , User = xyz

3.2 ชอ User ไมตรงกบชอ Database $ createuser -P abc // สราง user ชอ abc โดยกำาหนดใหม password$ psql abc error “psql: FATAL: database "abc" does not exist” เนองจากไมม Database ชอ abc$ psql -d abc error “psql: FATAL: database "abc" does not exist” เนองจากไมม Database ชอ abc$ psql -U abc Password for user abc: // ใส password ของ user abc error “psql: FATAL: database "abc" does not exist” เนองจากไมม Database ชอ abc

สามารถ connect โดยไมระบ option ได แตตองเรยงตามลำาดบดงน : host (ถาม), ชอ database, ชอ user เชน$ psql mydb abc // สามารถ connect ได โดย Database = mydb , User = abc

โดยเราสามารถตรวจสอบรายชอ Database ตางๆ ไดโดยใชคำาสง$ psql -l

แกไข Configuration file 1. แกไขไฟล postgresql.conf เพอใหสามารถ remote เขามาใชงาน database ได

$ sudo vi /etc/postgresql/8.3/main/postgresql.conf แกไขในสวนของ ‘Connections and Authentication’ section… ดงน

listen_addresses = '*' // อนญาตใหเครอง Client ทใช IP อน นอกจาก localhost สามารถเชอมตอกบ database ได และ

password_encryption = on // กำาหนดใหมการเขารหส password ของทก User ใน Database

Copyright © 2009 by Peekanung                                                                                                     6

2. แกไขไฟล /etc/postgresql/8.3/main/pg_hba.conf เปนการกำาหนดผทมสทธเขาถง database โดยแกไขใหมคาดงน

อธบายlocal all postgres ident sameuser // กำานดให user : postgress บนเครอง local เขาใชงานไดทก database ( ไมตองใส password ของ database) local all all md5// กำาหนดใหทก user บนเครอง local เขาใชงานไดทก database โดยตองใส password ของ database host all all 127.0.0.1/32 md5 host all all ::1/128 md5

// กำาหนดใหทก user ในกลม IP ทกำาหนด สามารถconnect ผาน TCP/IP โดยตองใส password ของ database หลงจากนนให restart services ใหม $ service postgresql-8.3 restart [ start | stop | restart ]

2.1 เกยวกบ pg_hba.conf การตรวจสอบสทธของเครองลกขายในการเขาใชงาน postgreSQL server จะถกควบคมโดยขอความทระบในไฟล

pg_hba.conf ทอยใน /etc/postgresql/8.3/main/pg_hba.conf. (HBA ยอมาจาก host-based authentication) ซงไฟล pg_hba.conf นจะถกตดตงเมอทำาการสราง database รปแบบทวไปของไฟล pg_hba.conf คอกลมของขอความแยกตามบรรทด หนงชดของขอความจะตองจบลงในหนง

บรรทด บรรทดวางจะถกขามไปโดยไมมการประมวลผล และขอความทอยหลงเครองหมาย # จะเปนคำาอธบายและไมถกประมวล ผล เชนกน แตละบรรทดประกอบหลายขอความทถกแยกจากกนดวยชองวาง ในแตละขอความสามารถมชองวางได แตจะตองค รอม ดวยเครองหมาย " "

แตละบรรทดจะระบ ชนดของการเชอมตอชวงหมายเลข ip ของเครองลกขาย ชอของฐานขอมลทจะเขาใชงาน ชอ user และวธการตรวจสอบสทธ กรณมหลายบรรทดทเขาเงอนไข บรรทดแรกทสอดคลองตามเงอนไขทเชอมตอเขามาจะถกเลอกมาใช

เพอการตรวจสอบสทธ ถาสทธไมถกตองการเชอมตอนนจะถกยกเลก โดยไมสนใจบรรทดอนทกำาหนดสทธแตกตางกนรปแบบของแตละบรรทดสามารเขยนไดหลายรปแบบตามตวอยาง

Note: ไฟล postgresql.conf เปนไฟลทใชเกบ Configuation ตางๆ ของ PostgreSQL ดงน ( เฉพาะ parameter ทเปดใชอยเทานน)

# FILE LOCATIONSdata_directory = '/var/lib/postgresql/8.3/main' // Directory ทใชเกบ data และ configuration file ของ databasehba_file = '/etc/postgresql/8.3/main/pg_hba.conf' // Configuration file เกยวกบสทธการเขาถง databaseident_file = '/etc/postgresql/8.3/main/pg_ident.conf' // Configuration file ทใช map user กบ identifier user เพอใชงานระบบexternal_pid_file = '/var/run/postgresql/8.3-main.pid' // path file ทใชบนทก process id

# CONNECTIONS AND AUTHENTICATIONlisten_addresses = '*' // อนญาตใหเครอง Client ทใช IP อน นอกจาก localhost สามารถเชอมตอกบ database ไดport = 5432 // หมายเลข port ของ database server max_connections = 100 // กำาหนดจำานวนสงสดของการเชอมตอกบ database ในเวลาเดยวกน (default = 32)unix_socket_directory = '/var/run/postgresql' // Directory สำาหรบการเชอมตอจาก Client Applicationssl = true // เปดการใชงาน SSL (Secure Sockets Layer) password_encryption = on // กำาหนดใหมการเขารหส password ของทก User ใน Database

# RESOURCE USAGE (except WAL)shared_buffers = 24MB // กำาหนดขนาดของ share buffer สำาหรบการทำางานของ database ( คานอยสดคอ 128 kB หรอmax_connection*16 kB) max_fsm_pages = 153600 // กำาหนดขนาดทใชเกบ free space เพอนำากลบมาใชใหม (default = 10000 , คานอยสด คอ จำานวนrealtion*16)

# ERROR REPORTING AND LOGGINGlog_line_prefix = '%t ' // รปแบบของชอ log file ทขนตนดวยเวลาทไมรวม millisecond

# CLIENT CONNECTION DEFAULTSdatestyle = 'iso, mdy' //รปแบบของวนเวลาทใชในระบบlc_messages = 'en_US.UTF-8' // รปแบบของตวอกษรบน error messagelc_monetary = 'en_US.UTF-8' // รปแบบของตวอกษรทใชกบขอมลจำานวนเงนlc_numeric = 'en_US.UTF-8' // รปแบบของตวอกษรทใชกบขอมลประเภทตวเลขlc_time = 'en_US.UTF-8' //รปแบบของตวอกษรของเวลาdefault_text_search_config = 'pg_catalog.english' //มาตราฐานรปแบบของการเรยงขอมลตามตวอกษร

# Database administrative login by UNIX sockets# local database user auth-method local all postgres ident sameuser local all all md5# IPv4 local connections:# host database user CIDR-address auth-method host all all 127.0.0.1/32 md5# IPv6 local connections: host all all ::1/128 md5

Copyright © 2009 by Peekanung                                                                                                     7

local DATABASE USER METHOD [OPTION] host DATABASE USER CIDR-ADDRESS METHOD [OPTION] hostssl DATABASE USER CIDR-ADDRESS METHOD [OPTION] hostnossl DATABASE USER CIDR-ADDRESS METHOD [OPTION]

แตละขอความ สามารถอธบายไดดงนlocal เปนการเชอมตอในรปแบบทเครองลกขาย (client) และฐานขอมลอยในเครองเดยวกนhost เปนเชอมตอของเครองลกขายโดยใช TCP/IP ซงขอมลเปนแบบเขารหสหรอไมกไดhostssl เปนเชอมตอของเครองลกขายโดยใช TCP/IP ซงขอมลเปนแบบเขารหสเทานนhostnossl เปนเชอมตอของเครองลกขายโดยใช TCP/IP ซงขอมลเปนแบบไมเขารหส

DATABASE กำาหนดวาจะอนญาตใหเขาใชงานฐานขอมลไหนโดยระบชอฐานขอมล หรอสามารถใชคาตางๆเหลาน • all เพอระบทกฐานขอมล • sameuser เพอกำาหนดวาฐานขอมลทเขาใชงานมชอตรงกบ user ทเรยกเขาใชงาน • samegroup กำาหนดวา user ทขอเขาใชงานตองเปนสมาชกของกลมทมชอตรงกบฐานขอมลทขอเขาใชงาน • ถากำาหนดหลายฐานขอมลใหคนดวยเครองหมาย , (comma) • ในกรณระบเปนชอไฟลใหนำาหนาชอไฟลดวยเครองหมาย @ และไฟลนจะตองอยไดเรคทอรเดยวกบไฟล pg_hba.conf

USER ระบชอของ user ทจะอนญาตใหเเขาใชงาน database สามารถใชคาเหลานแทนได• all เพอระบทก user สามารถเขาใชงาน database ได• ถากำาหนดหลาย user ใหคนแตละ user ดวยเครองหมาย comma ( , )• ถาระบเปนชอของกลม user ใหนำาหนาชอกลมดวยเครองหมาย +

CIDR-ADDRESS (Classless Inter-Domain Routing ) ระบหมายเลข ip ของเครอง client ทจะอนญาตใหเขาใชงาน (ไม สามารถระบเปน domain หรอ ชอเครอง)

METHOD ระบวธการตรวจสอบตวตน ของ user ทเชอมตอเขามา สามารถใชตวเลอกเหลาน

Trust ไมมเงอนไขในการในการตรวจสอบ ไมตองใส password Reject ปฏเสธทกการเชอมตอโดยไมมเงอนไข md5 เครอง client ทเขาขอเขาใชงานตองใส password ของ database ในรปแบบทเขารหสแบบ MD5 crypt คลายๆแบบ MD5 ( สำาหรบ version 7.2 หรอ ตำากวา ) password คลาย MD5 แต password จะถกสงในรปแบบทไมมการเขารหส krb5 (Kerberos V5) เปนการตรวจสอบตวตนของ user สำาหรบการเชอมตอแบบ TCP/IP เทานน ident รบคา user name ของเครอง client จากระบบปฏบตการ โดยเครอง client จะตองม ident server ทำางานอย

กรณ Client อยในเครองเดยวกบ server ระบบปฏบตการจะตอง Unix-domain socket credentials pam ตรวจสอบตวตนของ user โดยใชบรการ Pluggable Authentication Modules (PAM) ของบางระบบปฏบต

การ เชน Unix

OPTION ใส option ขนกบวาเลอกการพสจนตวตน (authentication) แบบไหน เชนถาใช method แบบ ident หรอ pam ท option นจะตองระบชอผใหบรการ

2.2 เกยวกบ postgresql.conf

ไฟล postgresq.conf เปนไฟลทใชเกบ configuration ทงหมดของ postgreSQL ซง parameter และคาตางๆ ทตอง เปดใชงาน มดงน

listen_addresses = ‘*’ : เพออนญาตใหเครอง Client ทใชหมายเลข IP (IP address) อนๆ ทไมใช localhost สามารถตดตอเขาใชงานฐานขอมล

data_directory : path directory ทใชเกบโปรเเกรมระบบฐานขอมลและ configure file ของระบบ hba_file : path file ทใชในการควบคมการเขาใชงานระบบฐานขอมลของ host ident_file : path file ทใชในการ map user กบ identifier user เพอใชงานระบบ external_pid_file : '/var/run/postgresql/8.3-main.pid' > path file ทใชบนทก process id port = 5432 : port ทถกเปดใชงานระบบฐานขอมล max_connections = 100 : requires สงสดทสามารถใหบรการ unix_socket_directory = '/var/run/postgresql' : set path ในการเรยกใชงานระบบ ssl = true : ระบการสงขอมลในรปแบบของการเขารหส password_encryption = on : ระบรปแบบการสงขอมลวาจะมการเขารหสตวขอมลดวยหรอไม shared_buffers = 24MB : shared buffers มขนาดใหใชงานเทากบ 24MB

Copyright © 2009 by Peekanung                                                                                                     8

max_fsm_pages = 153600 : พนทวางสงสดของ disk ใน shared free-space map log_line_prefix = '%t ' : รปแบบของชอ log file ทขนตนดวยเวลาทไมรวม millisecond datestyle = 'iso, mdy' : รปแบบของวนเวลาทใชในระบบ lc_messages = 'en_US.UTF-8' : รปแบบของตวอกษรบน error message lc_monetary = 'en_US.UTF-8' : รปแบบของตวอกษรทใชกบขอมลจำานวนเงน lc_numeric = 'en_US.UTF-8' : รปแบบของตวอกษรทใชกบขอมลประเภทตวเลข lc_time = 'en_US.UTF-8' : รปแบบของตวอกษรของเวลา default_text_search_config = 'pg_catalog.english' : มาตราฐานรปแบบของการเรยงขอมลตามตวอกษร

2.3 Install pgAdmin GUI Application ในการ Install pgAdmin ทำาไดโดยใชคำาสงตอไปน

$ sudo apt-get install pgadmin3

แลว Run scripts ตอไปนเพอใหสามารถใชงาน pgAdmin ได$ sudo su postgres -c psql < /usr/share/postgresql/8.3/contrib/adminpack.sql หรอ$ cd /usr/share/postgresql/8.3/contrib$ su postgres -c psql postgres=# adminpack.sql

การเขาใชงาน ไปท Applications > Programming > pgAdmin III

คลกป ม 'Add a connection to a server' เพอสรางการเชอมตอ

Copyright © 2009 by Peekanung                                                                                                     9

ระบคาตาง ๆ ของ Database เพอใชในการเชอมตอ แลวกด OK

จะปรากฎหนาตาของ pgAdmin ซงแบงหนาตางออกเปน 2 สวน ดงน1. Object browser ของแตละ Connection ( ดานซาย )

2. Properties, Statistics, Dependencies และ Dependcents ของ Object ( ดานขวา ) 

Copyright © 2009 by Peekanung                                                                                                     10

3. การใชงาน PostgreSQL

3.1 PostgreSQL-Client Application (psql) โปรแกรม PostgreSQL-Client คอ psql จะใชโปรแกรมนได อยใน Text Mode หรอCommand line psql เปนโปรแกรมทใชตดตอกบ Database Server แบบ command line โดยสามารถเรยกด option ตางๆของ psql ไดจาก

$ psql --help

Options: -d <ชอฐานขอมล> กำาหนด database name ทตองการตดตอ (default: postgres) -f <ชอไฟล> Execute queries จากไฟล -h <host> กำาหนด database server host (default: localhost) -l แสดงรายการฐานขอมลทมอยทงหมด -p <port> กำาหนด database server port (default: 5432) -q ทำางานโดยไมแสดงขอความจากระบบ แสดงเฉพาะผลลพธทไดจาก query -U <username> กำาหนด database username (default: postgres) -V แสดง version information -W Prompt เพอใส password ( ปกตจะตอง ใส password อยแลว)

การจดการเกยวกบ Service ของ PostgreSQL ( ตอง Login ดวย root) ตรวจสอบสถานะของ service $ service postgresql-8.3 status หรอ /etc/init.d/ postgresql-8.3 status

Start service $ service postgresql-8.3 start หรอ /etc/init.d/ postgresql-8.3 startStop service $ service postgresql-8.3 stop หรอ /etc/init.d/ postgresql-8.3 stop

3.2 การจดการ Database • เมอใชโปรแกรม psql คำาสงทใชคอภาษา SQL ตามมาตรฐาน SQL92/SQL99 • คำาสงทเปนภาษา SQL ใหปดคำาสงดวย ; สงทำางานดวย <Enter> • คำาสงของ psql ทขนตนดวย \ ไมตองปดคำาสงดวย ; สงทำางานดวย <Enter>

(1) สราง database ใหม

Options: -D, --tablespace=TABLESPACE กำาหนด tablespace ใหกบ database -E, --encoding=ENCODING กำาหนด encoding ใหกบ database -O, --owner=OWNER กำาหนด user ทจะเปนเจาของ database -T, --template=TEMPLATE สราง database ตาม template ทกำาหนด -e, --echo กำาหนดใหแสดงคำาสงทจะถกสงไป server -q, --quiet กำาหนดใหไมตองแสดงผลจากการสง create --help แสดงตวชวยเหลอเกยวกบการสราง database --version แสดงเวอรชนConnection options: -h, --host=HOSTNAME database server host หรอ socket directory -p, --port=PORT database server port -U, --username=USERNAME กำาหนด user name ทใช connect -W, --password กำาหนดใหระบ password ทนท

Syntax : psql [options] [dbname [username]]

$ createdb [OPTION]... [DBNAME] [DESCRIPTION]

Copyright © 2009 by Peekanung                                                                                                     11

ตวอยาง $ createdb test with encoding='win874'

// สราง database ชอ 'test' โดยกำาหนด encoding เปน 'win874' $ createdb test –U postgres –E win874 –O user1

// สราง database ชอ 'test' โดยกำาหนด username ทใช connect เปน 'postgres' กำาหนด encoding เปน 'win874' และให user1 เปนเจาของ database

หรอใช SQL Command

ตวอยาง SQL > CREATE DATABASE test ENCODING 'win874';

// สราง database ชอ 'test' โดยกำาหนด encoding เปน 'win874' SQL > CREATE DATABASE test ENCODING 'win874' OWNER user1;

// สราง database ชอ 'test' โกำาหนด encoding เปน 'win874' และให user1 เปนเจาของ database

หมายเหต ในการกำาหนด OWNER โดยปกต(default) จะกำาหนดใหผทสรางเปนOWNER แตถาเปน superuser เชน postgres จะสามารถกำาหนด OWNER ให user อนได

(2) ลบ database

Options: -e, --echo กำาหนดใหแสดงคำาสงทจะถกสงไป server

-i ,--interactive กำาหนดใหตรวจสอบความถกตองของคำาสงกอนทำางาน-h, --host=HOSTNAME database server host หรอ socket directory

-p, --port=PORT database server port -U, --username=USERNAME กำาหนด user name ทใช drop database -W, --password กำาหนดใหระบ password ทนท ตวอยาง $ dropdb demo // ลบ database ชอ 'demo' $ dropdb -i demo –U postgres // ลบ database ขอ 'domo' ดวย user 'postgres'

หรอใช SQL Command

ตวอยาง SQL > DROP DATABASE test; / ลบ database ชอ 'test' * หมายเหต ฐานขอมลทเปดใชอย ไมสามารถลบได ตองปดกอน โดยใชคำาสง \q หรอ เปดฐานขอมลอน เชน \c test

(3) ด database

ตวอยาง $ psql -l // คำาสง psql -l จะแสดง Name,Owner,Encoding ของ database List of databases Name | Owner | Encoding---------------+------------+---------- db01 | user01 | UTF8 mydb | postgres | UTF8 postgres | postgres | UTF8

SQL > CREATE DATABASE database-name [ WITH [ OWNER [=] {username|DEFAULT}]

[ TEMPLATE [=] {template-name|DEFAULT}] [ ENCODING [=] {encoding|DEFAULT}] [ TABLESPACE [=] tablespace ]]

$ dropdb [OPTION]... [DBNAME] [DESCRIPTION]

SQL > DROP DATABASE

$ psql -l

Copyright © 2009 by Peekanung                                                                                                     12

template0 | postgres | UTF8 template1 | postgres | UTF8

หรอใช SQL Command

ตวอยาง

SQL > SELECT * FROM pg_database ; // pg_database จะแสดงรายละเอยดทงหมดของ database

datname|datdba|encoding|datistemplate|datallowconn|datconnlimit|datlastsysoid|datfrozenxid| dattablespace | datconfig | datacl ----------+---------+-----------+-----------------+-----------------+---------------+-----------------+---------------+-------------------+-------------+------------ db01 |16535 | 6 | f | t | -1 | 11510 | 379 | 16538| |

SQL > \l // คำาสง \l จะแสดงผลเหมอนคำาสง psql -l

(4) แกไข database

SQL Command

Options: CONNECTION LIMIT connlimit จำากดการเขาถง database โดยถากำาหนดเปน -1 จะหมายถง unlimit

RENAME TO newname เปลยนชอ database OWNER TO new_owner เปลยนเจาของ databaseSET configuration_parameter {TO|=}{value|DEFAULT} แกไข parameter ของ database (กำาหนดเอง) SET configuration_parameter FROM CURRENT แกไข paramter ใหเปนไปตาม session นRESET configuration_parameter reset configuration ของ database RESET ALL reset ทก configuration ของ database

ตวอยางSQL > ALTER DATABASE test RENAME TO test_01; // แกไข database โดยเปลยนชอจาก 'test' เปนชอ 'test_01'SQL > ALTER DATABASE test OWNER TO user01; // แกไข database โดยเปลยนเจาของเปน 'user01'SQL > ALTER DATABASE test SET enable_indexscan TO off;

// แกไข database 'test' โดยกำาหนดเปนแบบไมใช index scaning

(5) การ connect เขาใชงาน database ใช SQL Command

เชน SQL > \c mydb user01// connect เขา database 'mydb' ดวย user 'user01' ถาไมระบ user จะเปนการ connect ดวย user ปจจบนทใขอย

3.3 การจดการ Table และ View3.3.1 Table

(1) การสราง Table

SQL > select * from pg_database; หรอSQL > \l

SQL > ALTER DATABASE name [ [ WITH ] option [ ... ] ]

SQL > CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name ( [ { column_name data_type [ DEFAULT default_expr ] [ column_constraint [ ... ] ] | table_constraint | LIKE parent_table [ { INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS |

INDEXES } ] ... } [, ... ]

] ) [ INHERITS ( parent_table [, ... ] ) ] WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ] [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] [ TABLESPACE tablespace ]

SQL > \c <dabatase name> <user name>

Copyright © 2009 by Peekanung                                                                                                     13

หมายเหตOIDs คอ Object Identifier เปน Internal ID ของ postgreSQL ถาระบเปน WITH OIDS จะสามารถใชคำาสง

SELECT เพอด OIDs ได โดย SQL > SELECT oid, * FROM a;

oid | a_id | v----------+------+---- 16880 | 1 | 11 16881 | 2 | 22 (2 rows)

ตวอยางSQL > CREATE TABLE testtable (id int, name varchar(30));SQL > CREATE TABLE person (

did integer, name varchar(40), PRIMARY KEY(did) );

SQL > CREATE TABLE distributors ( did integer PRIMARY KEY DEFAULT nextval(’serial’), name varchar(40) NOT NULL CHECK (name <> ”) );

(2) การด Table ด รายละเอยด Table ทงหมด

SQL > \d ; // คำาสง \d จะแสดงผลทง Table , View และ sequence List of relations

Schema | Name | Type | Owner------------+--------------------------+----------+---------- public | a | table | user01 public | arr | table | postgres public | b_v | view | user01

หรอSQL > SELECT * FROM pg_tables ; // pg_tables จะแสดงผลเฉพาะ Table

หรอระบชอ table SQL > SELECT * FROM pg_tables where tablename = 'shipment';

schemaname | tablename | tableowner | tablespace | hasindexes | hasrules | hastriggers-------------------+--------------+----------------+---------------+----------------+------------+------------- public | shipment | user01 | | t | f | t(1 row)

ดโครงสรางของ Table SQL > \d table_name;

เชน SQL > \d shipment; Table "public.shipment" Column | Type | Modifiers

-------------------+-----------------------------+------------------------------------------------------- id | integer | not null default nextval('shipment_id_seq'::regclass) address | text | not null shipping_date | timestamp without time zone | not nullIndexes: "shipment_pkey" PRIMARY KEY, btree (id)Triggers: shipment_insert_trigger BEFORE INSERT ON shipment FOR EACH ROW EXECUTE PROCEDURE shipment_insert()

ดขอมลใน Table SQL > SELECT * FROM table_name ;

(3) การลบ Table SQL > DROP TABLE table_name;

เชน SQL > DROP TABLE testtable1;

Copyright © 2009 by Peekanung                                                                                                     14

(4) การแกไขโครงสราง Table (Alter Table)

แกไขชอ table SQL > ALTER TABLE tbtest RENAME TO tbdemo; แกไขชอ column SQL > ALTER TABLE tbdemo RENAME COLUMN col1 TO democol; เพม column SQL > ALTER TABLE tbdemo ADD COLUMN col1; ลบ column SQL > ALTER TABLE tbdemo DROP COLUMN col1; เปลยนOwner SQL > ALTER TABLE tbdemo CHANGE OWNER TO ‘new user name’; กำาหนด default

SQL > ALTER TABLE tbdemo ADD COLUMN col2 SET DEFAULT ‘1’ ; ยกเลก default

SQL > ALTER TABLE tbdemo ALTER COLUMN col2 DROP DEFAULT ;

(5) Temporary TablesTemporary Tables เปนตารางชวคราว จะมอยใน database session ทมการกำาหนดขนเทานน เมอมการปด หรอ

ยกเลกการทำางานของ database session นน temporary tables กจะถกลบโดยอตโนมต การใชงาน Temporary Tables นน จะใชงานและมองเหนไดเฉพาะผทสรางใน database session นนๆเทานน ผใช

คนอนๆไมสามารถมองเหนได ดงนนผใชงานแตละคนจงสามารถสราง Temporary Tables ชอเดยวกนไดTemporary tables สวนมากจะถกใชในกรณทตองการขอมล จาก Query ทซบซอน ทตองการ execute คำาสงในท

เดยว แลวนำาขอมลทไดไปเกบไวท Temporary Tables ตวอยาง

SQL > SELECT * INTO TEMPORARY position_doctorFROM position WHERE postcode=60403;

3.3.2 View Views เปนตารางขอมลเทยม ซง view จะเกดจากตารางขอมล(Table) ทมอยในฐานขอมล โดยใชคำาสง SELECT

ขอมลมาแสดงตามทกำาหนด View จะมการกำาหนดสทธตางๆแยกจาก ตาราง และสวนตางๆ ของฐานขอมล ดงนนเราจง สามารถกำาหนดสทธใหผใชทเราตองการกำาหนดเหนเฉพาะขอมลในสวนทตองการได

(1) การสราง View

ตวอยางSQL > CREATE VIEW myview AS

SELECT city, temp_lo, temp_hi, prcp, date, location FROM weather, cities WHERE city = name;

(2) การดView ดโครงสราง view SQL > \d view_name;

เชน SQL > \d myview;View "public.myview" Column | Type | Modifiers------------+-----------------------+----------- city | character varying(80) | temp_lo | integer | temp_hi | integer | prcp | real | date | date | name | text | population | real | altitude | integer |View definition: SELECT weather.city, weather.temp_lo, weather.temp_hi, weather.prcp, weather.date, cities.name,

cities.population, cities.altitude FROM weather, cities WHERE weather.city::text = cities.name;

SQL > CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] VIEW name [ ( column_name [, ...] ) ] AS query

Copyright © 2009 by Peekanung                                                                                                     15

การดขอมลใน View SQL > SELECT * FROM myview;

(3) การลบ View

Parameters: IF EXISTS ถาไมมชอ view ทตองการลบ ใหแสดง notice แทน error

name ชอ view CASCADE กรณทม objects ใดขนอยกบ view น ใหถกลบโดยอตโนมต

RESTRICT กรณทม objects ใดขนอยกบ view น จะไมอนญาตให drop view ( เปนคา default)

ตวอยาง กรณ veiw 'v_myveiw' ไมมอยจรง

SQL > DROP view v_myview;ERROR: view "v_myview" does not exist // ไมสามารถลบ view ไดเนองจากไมมชอ view นอยจรง

SQL > DROP VIEW IF EXISTS v_myview;NOTICE: view "v_myview" does not exist, skippingDROP VIEW

(4) การแกไข View ทำาไดแคการเปลยนชอ view เทานน

เชน SQL > ALTER VIEW myview RENAME TO myview02;// แกไข view โดยเปลยนชอจาก 'myview' เปน 'myview02'

3.4 การจดการ Roles

postgreSQL ใช 'roles' ในการจดการ การเขาถง database สำาหรบ postgreSQL version 8.1 หรอนอยกวา user และ group จะถอเปนคนละอยางกน แตหลงจาก version 8.1 เปนตนมา role สามารถเปนไดทง user , group หรอทง

สองอยาง

3.4.1 การ สราง Roles

คำาสง CREATE USER เปน alias ของคำาสง CREATE ROLE สามารถใชแทนกนได มขอแตกตางเพยงขอเดยวคอCREATE USER จะม option 'LOGIN' เปน default จงสามารถใชในการ Log in ไดเลยCREATE ROLE จะม option 'NOLOGIN' เปน default ถาตองการใช Log in ไดดวยตองระบ option 'LOGIN'

ผทมสทธในการสราง Users จะตองเปน Superuser เทานน (default คอ user : postgres)

Options : SUPERUSER | NOSUPERUSER กำาหนดใหเปน superuser หรอไม| CREATEDB | NOCREATEDB กำาหนดใหสามารถ create database ไดหรอไม

| CREATEROLE | NOCREATEROLE กำาหนดใหสามารถ create role ไดหรอไม | CREATEUSER | NOCREATEUSER กำาหนดใหสามารถ create user ไดหรอไม | INHERIT | NOINHERIT กำาหนดใหไดรบ privileges จาก role ทเปนสมาชกอยหรอไม | LOGIN | NOLOGIN กำาหนดใหใชในการ Log in ไดดวยหรอไม | CONNECTION LIMIT connlimit จำากดจำานวนทใช connect หรอไม ( คา -1 หมายถง unlimit)

(default คอ unlimit) | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password' encryp password หรอไม

SQL > DROP VIEW [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]

SQL > ALTER VIEW name RENAME TO newname ;

SQL > CREATE [USER|ROLE] name [ [ WITH ] option [...] ]

Copyright © 2009 by Peekanung                                                                                                     16

| VALID UNTIL 'timestamp' กำาหนดวน และเวลา หมดอายให password | IN ROLE rolename [, ...] assign role ใหกบ user ทสราง | IN GROUP rolename [, ...] assign group ใหกบ user ทสราง ( ปจจบนเลกใชแลว

ถากำาหนด option น จะหมายถง option IN ROLE) | ROLE rolename [, ...] กำาหนด user ใหกบ role ทสราง | ADMIN rolename [, ...] กำาหนด user ใหกบ role ทสราง โดย user จะม Admin option ดวย | USER rolename [, ...] ปจจบนเลกใชแลว ถากำาหนด option นจะหมายถง option ROLE | SYSID uid ปจจบนเลกใชแลว

หมายเหต option ทขดเสนใตไว หมายถง คา default

ตวอยางSQL > CREATE USER user01;

// สราง user ชอ 'user01' แบบไมระบ password ( ซง user นจะยงเขาใชงาน database ไมได ตองกำาหนด

password ใหกบ user กอน) SQL > ALTER USER user01 WITH PASSWORD 'user0123' ;

// กำาหนด password ให user ทสรางไวแลวSQL > CREATE USER user01 WITH PASSWORD 'user0123';

// สราง user ชอ 'user01' แบบระบ password SQL > CREATE USER user01 WITH PASSWORD 'user0123' CREATEDB;

// สราง user ทสามารถสราง Database ไดSQL > CREATE USER test1 role test2;

// assign role 'test1' ให user 'test2' เทยบเทากบ SQL > GRANT test1 TO test2 ; ในกรณน test1 เปน role , test2 เปน user ( หลง option role จะเปน user)

SQL > CREATE USER test3 in role test2 ; // assign role 'test2' ให user 'test3' เทยบเทากบ SQL > GRANT test2 TO test3; ในกรณน test2 เปน role , test3 เปน user ( หลง option in role จะเปน role )

SQL > CREATE USER test4 admin test2 ; // assign role 'test4' ให user 'test2' โดย 'test2' สามารถ grant privileges ให user อนได เทยบเทากบ SQL > GRANT test2 TO test3 WITH ADMIN OPTION ;

3.4.2 การ แกไข Roles

Option : SUPERUSER | NOSUPERUSER | CREATEDB | NOCREATEDB | CREATEROLE | NOCREATEROLE | CREATEUSER | NOCREATEUSER | INHERIT | NOINHERIT | LOGIN | NOLOGIN | CONNECTION LIMIT connlimit | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password' | VALID UNTIL 'timestamp'

3.4.3 การลบ Roles

3.4.4 การด Roles

SQL > ALTER [USER|ROLE] user-name [[WITH] option ]...

SQL > DROP USER user-name

Copyright © 2009 by Peekanung                                                                                                     17

SQL > \du List of roles

Role name | Superuser | Create role | Create DB | Connections | Member of -----------+-----------+-------------+-----------+-------------+----------- abc | yes | yes | yes | no limit | {} postgres | yes | yes | yes | no limit | {} test | no | yes | yes | no limit | {} testuser | no | yes | yes | no limit | {} user01 | no | yes | yes | no limit | {} xyz | yes | yes | yes | no limit | {}(6 rows)

SQL > SELECT * FROM pg_user; usename | usesysid | usecreatedb | usesuper | usecatupd | passwd | valuntil | useconfig----------+----------+-------------+----------+-----------+----------+----------+----------- postgres | 10 | t | t | t | ******** | | test | 16514 | t | f | f | ******** | | testuser | 16532 | t | f | f | ******** | | user01 | 16535 | t | f | f | ******** | | xyz | 16582 | t | t | t | ******** | | abc | 16587 | t | t | t | ******** | |(6 rows)

3.4.5 การกำาหนดสทธการใชงานขอมล เมอมการสรางตารางขอมลขนมา ผทสรางตาราง(owner) เทานนทมสทธในการใชงาน ถาตองการใหผอนใชงานไดดวย จะตองมการแกไขสทธของตาราง(Table’s permission) โดยการใชคำาสง GRANT โดยคำาสงนสามารถกำาหนดขอบเข

ตการใชงาน SELECT, UPDATE, DELETE, RULE,ALL โดยทกำาหนดการใช เปนรายบคคล กลม หรอทงหมด(Public) และ REVOKE เปนคำาสง ยกเลกการกำาหนดสทธตางๆ ทเกดจากคำาสง GRANT

(1) GRANT SQL > GRANT { { SELECT | INSERT | UPDATE | DELETE | REFERENCES | TRIGGER }

[,...] | ALL [ PRIVILEGES ] } ON [ TABLE ] tablename [, ...] TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ] ;

SQL > GRANT { { USAGE | SELECT | UPDATE } [,...] | ALL [ PRIVILEGES ] } ON SEQUENCE sequencename [, ...] TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]

SQL > GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] } ON DATABASE dbname [, ...] TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]

SQL > GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON FUNCTION funcname ( [ [ argmode ] [ argname ] argtype [, ...] ] ) [, ...] TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]

SQL > GRANT { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGE langname [, ...] TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]

SQL > GRANT { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] } ON SCHEMA schemaname [, ...] TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]

SQL > GRANT { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACE tablespacename [, ...] TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]

SQL > GRANT role [, ...] TO rolename [, ...] [ WITH ADMIN OPTION ]

Copyright © 2009 by Peekanung                                                                                                     18

ตวอยางSQL > GRANT all ON DATABASE pis TO user1; // กำาหนดให user1 มสทธทกอยางบน database pisSQL > GRANT all ON person TO user1; // กำาหนดให user1 มสทธทกอยางบน table personSQL > GRANT select ON person TO user2; // กำาหนดให user2 มสทธ select บน table person

(2) REVOKE

ตวอยางSQL > REVOKE all ON DATABASE pis FROM user1;

// ยกเลกการใหสทธทกอยางบน database pis แก user1 SQL > REVOKE all ON person FROM user1; // ยกเลกการใหสทธทกอยางบน table pis แก user1 SQL > REVOKE select ON person FROM user2; // ยกเลกการใหสทธ select บน table pis แก user2

SQL > REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | REFERENCES | TRIGGER } [,...] | ALL [ PRIVILEGES ] }

ON [ TABLE ] tablename [, ...] FROM { [ GROUP ] rolename | PUBLIC } [, ...] [ CASCADE | RESTRICT ]

SQL > REVOKE [ GRANT OPTION FOR ] {{ USAGE | SELECT | UPDATE } [,...] | ALL [ PRIVILEGES ] }

ON SEQUENCE sequencename [, ...] FROM { [ GROUP ] rolename | PUBLIC } [, ...] [ CASCADE | RESTRICT ]

SQL > REVOKE [ GRANT OPTION FOR ] {{ CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PREVILEGES]} ON DATABASE dbname [, ...] FROM { [ GROUP ] rolename | PUBLIC } [, ...] [ CASCADE | RESTRICT ]

SQL > REVOKE [ GRANT OPTION FOR ] { EXECUTE | ALL [PRIVILEGES]} ON FUNCTION funcname ( [ [ argmode ] [ argname ] argtype [, ...] ] ) [, ...] FROM { [ GROUP ] rolename | PUBLIC } [, ...] [ CASCADE | RESTRICT ]

SQL > REVOKE [ GRANT OPTION FOR ] { USAGE | ALL | PRIVILEGES ] } ON LANGUAGE langname [, ...] FROM { [ GROUP ] rolename | PUBLIC } [, ...] [ CASCADE | RESTRICT ]SQL >REVOKE [ GRANT OPTION FOR ] { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] } ON SCHEMA schemaname [, ...] FROM { [ GROUP ] rolename | PUBLIC } [, ...] [ CASCADE | RESTRICT ]

SQL >REVOKE [ GRANT OPTION FOR ] { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACE tablespacename [, ...] FROM { [ GROUP ] rolename | PUBLIC } [, ...] [ CASCADE | RESTRICT ]

SQL >REVOKE [ ADMIN OPTION FOR ] role [, ...] FROM rolename [, ...] [ CASCADE | RESTRICT ]

Copyright © 2009 by Peekanung                                                                                                     19

3.5 Data type เมอสราง Table จะตองมการกำาหนดชนดของขอมลทจะเกบไวในแตละคอลมน(Column) เชน ชอเปนตวอกษร วนเกด

เกบคาเปนวนท เงนเดอนเปนตวเลข เปนตน ขอมลทอยใน PostgreSQL ถกกำาหนดดวยชนดขอมล(data type) ซงมประเภทของชนดขอมล(data type) หลาย

ประเภท ดงน

3.5.1 Character types

Data type Description

Character varying(n), varchar (n) variable-length with limit

Character (n) , char (n) fixed-length, blank padded

text variable unlimited length

3.5.2 Numberic types

Data type Size Description Range

smallint 2 bytes small range fixed- precision -32768 to +32767

integer 4 bytes usual choice for integer -2147483648 to +2147483647

bigint 8 bytes large-range integer -9223372036854775808 to 9223372036854775807

decimal variable user-specified precision, exact no limit

numeric variable user-specified precision, exact no limit

real 4 bytes variable-precision, inexact 6 decimal digits precision

double precision 8 bytes variable-precision, inexact 15 decimal digits precision

serial 4 bytes autoincrementing integer 1 to 2147483647

bigserial 8 bytes large autoincrementing integer 1 to 9223372036854775807

3.5.3 Date/Time types

Data type Size Description

timestamp [ (p) ] [ without time zone ] 8 bytes both date and time

timestamp [ (p) ] with time zone 8 bytes both date and time, with time zone

interval [ (p) ] 12 bytes time intervals

date 4 bytes dates only

time [ (p) ] [ without time zone ] 8 bytes times of day only

time [ (p) ] with time zone 12 bytes times of day only, with time zone

3.5.4 Logical types

Data type Description Renge

boolean(bool) TRUE, FALSE, or NULL true, 't', 'y', 'yes', 1false, 'f', 'n', 'no', 0

Copyright © 2009 by Peekanung                                                                                                     20

3.6 การ Import / Export data คำาสง COPY

ในการนำาขอมลเขาและออกจากฐานขอมลโดยการใชคำาสง COPY ซงคำาสงนจะเขยนขอมลจากตารางเปนไฟลขอมลชนด ASCII และนำาขอมลทเปนไฟลขอมลชนด ASCII เขา table ได

คำาสงนสามารถนำาไปใชในการสำารองขอมล หรอสงผานขอมลระหวาง postgreSQL กบโปรแกรมอนๆได

SQL > COPY...TO เปนคำาสงสำาเนาขอมลในตารางไปเปนไฟลขอมลSQL > COPY...FROM เปนคำาสงนำาขอมลไฟลเขาตาราง

อธบายBINARY ขอมลจะเปน binary format ทำาใหไมสามาถใช option DELIMITER, NULL หรอ CSV ไดOIDS ระบใหเอาคา OIDS ดวยDELIMITERS กำาหนดตวคนระหวาง column (default จะเปน tab) NULL กำาหนดคาใหฟลดทเปน null (default คอ \N สำาหรบ text file , เปนคาวางสำาหรบ csv file ) CSV กำาหนดใหเปน csv file formatHEADER สำาหรบ output คาจะเปนชอ column , input เปนการบอกวาบรรทดแรกเปน headerQUOTE กำาหนด ASCII quotation character สำาหรบ csv file format (default คอ double-

quote)ตวอยางSQL > COPY country TO '/tmp/country.txt' WITH DELIMITER '|';

// copy ขอมลใน table 'country' เกบไวท /tmp ชอไฟล country.txt ขอมลถกคนดวย | SQL > COPY country TO '/tmp/country.txt' WITH NULL 'null data';

// copy ขอมลใน table 'country' เกบไวท /tmp ชอไฟล country.txt โดยขอมลทเปน null จะถกแทนทดวย คำาวา 'null data'

SQL > COPY country FROM '/tmp/country.txt' ;// นำาขอมลในไฟล /tmp/country.txt เขา table country

COPY tablename [ ( column [, ...] ) ]

FROM { 'filename' | STDIN } [ [ WITH ] [ BINARY ] [ OIDS ]

[ DELIMITER [ AS ] 'delimiter' ]

[ NULL [ AS ] 'null string' ] [ CSV [ HEADER ]

[ QUOTE [ AS ] 'quote' ]

[ ESCAPE [ AS ] 'escape' ]

[ FORCE NOT NULL column [, ...] ]

COPY { tablename [ ( column [, ...] ) ] | ( query ) }

TO { 'filename' | STDOUT } [ [ WITH ] [ BINARY ] [ OIDS ]

[ DELIMITER [ AS ] 'delimiter' ]

[ NULL [ AS ] 'null string' ] [ CSV [ HEADER ]

[ QUOTE [ AS ] 'quote' ]

[ ESCAPE [ AS ] 'escape' ]

[ FORCE QUOTE column [, ...] ]

Copyright © 2009 by Peekanung                                                                                                     21

3.7 PostgreSQL function PostgreSQL มคณสมบตใหสราง Server-side Function ซงบางครงเรยกวา Stored procedures ได การทเราสราง Server-side Function และ function จะตดไปกบ Database จะทำาใหนำาไปใชงานไดกบโปร

แกรมอนๆได โดยทโปรแกรมเหลานนไมตองสรางหรอสำาเนา function เหลานนไปอก เราสามารถเรยกใช function จากคำาสง SQL Queries ไดเลย และเมอมการแกไข function ทกโปรแกรมทเรยก

ใช function นกจะเปลยนไปตามทแกไขดวย

Server-side functions สามารถเขยนไดจากภาษาตางๆดงน SQL PL/PGSQL PL/TCL PL/Perl C

ตวอยางการสราง SQL functions

ในการสราง function สามารถกำาหนดชอและบนทกเกบไวเพอเรยกใชในภายหลงไดอก การสรางใชคำาสง CREATE FUNCTION และการลบใชคำาสง DROP FUNCTION

คำาสง CREATE FUNCTION ตองการขอมลตางๆทใชกำาหนดการสรางดงน− ชอ Function− จำานวน Argument− ชนดขอมลของแตละ Argument− Function return type− การทำางาน− ภาษาทใชในการทำางาน

เชนSQL > CREATE FUNCTION tax(numeric)

RETURNS numericAS'SELECT ($1*0.07::numeric(8,2))::numeric(8,2);'LANGUAGE 'sql';

SQL > SELECT tax(20); tax------ 1.40(1 row)

อธบาย− ชอ Function คอ tax− จำานวน Argument 1 การเรยกใช argument กำาหนดตามลำาดบ $1 $2 $3− ชนดขอมลของแตละ Argument คอ numeric− Function return type เปน numeric− การทำางาน คอ SELECT ($1*0.07::nueric(8,2)):: nueric(8,2);

ในคำาสงการทำางานสามารถใช INSERT UPDATE DELETE ไดรวมทง Multiple Queries แยกคำาสงโดยใช semicolons คนแตละคำาสง

− ภาษาทใชในการทำางาน คอ SQL

การใช function ในการ SELECT Query จะชวยลดปญหาความผดพลาดในการ join table แตกทำาใหทำางานชากวา เนองจากการใช function จะมการ execution function ทกๆรายการขอมล

** หมายเหต ในกรณทสราง Function แลวเกด error

ERROR: language "plpgsql" does not exist HINT: Use CREATE LANGUAGE to load the language into the database.

วธแกไข คอ ตอง Login ดวย user ทเปนเจาของ Database แลวใชคำาสง

Copyright © 2009 by Peekanung                                                                                                     22

SQL > CREATE LANGUAGE <ภาษาทใช>;เชนSQL > CREATE LANGUAGE plpgsql;

// เปนการ install PostgreSQL procedural languages (PL/pgSQL)

3.8 Partitioning table

การทำา Partitioning Table คอ การแบงขอมลใน Table ออกเปน Table ยอยหลายๆ Table เหมาะสำาหรบ Table ทมขอมล จำานวนมาก ซงมขอดตางๆ ดงน

Manageability สามารถจดการกบขอมลสวนยอยไดโดยไมกระทบกบขอมลทงหมด การ Backup / Recovery สามารถแยกทำาแตละ partition ได ทำาใหการทำางานเรวขน และไมมผลกระทบกบ

partition อน สามารถแยก Tablespace ของแตละ Partition ได ทำาใหการจดการ tablespace ทำาไดงายขน

Availability เมอตองมการจดการบางอยางเดยวกบ Disk เชน เปลยน หรอซอม disk ระบบยงสามารถทำางานตอไปได เนองจาก

ไมมผลกระทบใดๆ ตอขอมลทอยตาง disk กน ( กรณทแตละ partition มการแยก disk กน) Perfermance

การ Query ขอมลจาก partition จะเรวกวาการ query จาก master table เนองจากขอมลมจำานวนนอยกวา

ชนดของ Partitioning table ใน Postgresql 1. Range Partitioning : แบง partition ตามชวงของขอมล โดยไมมการทบ

ซอน (overlap) ของขอมลในแตละ partition เชน แบงเปนชวงป หรอ ชวงเดอน เปนตน2. List Partitioning : แบง partition ตามรายการ หรอหมวดหม ตามคา

ของขอมลทกำาหนด เชน แบงขอมลตามทวปตางๆ ของโลก เปนตน

ตวอยาง การสราง Partition table 1. แกไขไฟล postgresql.conf โดย set constraint_exclusion = on ซงจะทำาให query's planner สามารถใช constraints ในการเพมประสทธภาพของ query ได

2. หลงจากนนให restart service ของ database โดยตอง log in ดวย user : root แลวใขคำาสง$ service postgresql-8.3 restart

3. สราง 'Master table' SQL > CREATE TABLE shipment ( id SERIAL PRIMARY KEY, address TEXT NOT NULL, shipping_date TIMESTAMP NOT NULL);

4. สราง 'Child tables' เพอใชเปน partition ของ Master table โดยม Contraints เปนตวขอกำาหนด column key ในการ แบง partition

SQL > CREATE TABLE shipment_part_2008 ( CHECK (shipping_date >= DATE '2008-01-01' AND shipping_date < DATE '2009-01-01') ) INHERITS (shipment);

SQL > CREATE TABLE shipment_part_pre2008 ( CHECK (shipping_date < DATE '2008-01-01') ) INHERITS (shipment);

5. สราง Index ใหแตละ child table ( โดยใช key เดยวกบ column key ของ constrains ดงตวอยาง คอ shipping_date ) SQL > CREATE INDEX shipping_date_2008 ON shipment_part_2008 (shipping_date); SQL > CREATE INDEX shipping_date_pre2008 ON shipment_part_pre2008 (shipping_date); SQL > CREATE INDEX shipping_date_post2008 ON shipment_part_post2008 (shipping_date);

6. สราง Function เพอกำาหนดใหมการจดเกบขอมลใน partition table ทถกตอง ในทนตองการแบงเปน 3 partition คอป2008 (shipment_part_2008),กอนป2008 (shipment_part_pre2008) และหลงป2008 (shipment_part_post 2008)

Copyright © 2009 by Peekanung                                                                                                     23

โดยใชฟลด shipping_date เปน keySQL > CREATE OR REPLACE FUNCTION shipment_insert()

RETURNS TRIGGER AS $$BEGIN

IF (NEW.shipping_date >= DATE '2008-01-01' AND NEW.shipping_date < DATE '2009-01-01') THEN INSERT INTO shipment_part_2008 VALUES (NEW.*); ELSIF (NEW.shipping_date < DATE '2008-01-01') THEN INSERT INTO shipment_part_pre2008 VALUES (NEW.*); ELSEIF (NEW.shipping_date > DATE '2008-12-31') THEN INSERT INTO shipment_part_post2008 VALUES (NEW.*); ELSE RAISE EXCEPTION 'Date out of range. Fix the shipment_insert() function!'; END IF; RETURN NULL;

END;$$LANGUAGE plpgsql;

7. สราง Trigger เพอเปนการสง execute function กอนมการ Insert data เขา master table ทกครงSQL > CREATE TRIGGER shipment_insert_trigger

BEFORE INSERT ON shipmentFOR EACH ROW EXECUTE PROCEDURE shipment_insert();

8. ทดสอบโดยการ Insert ขอมลเขา Master tableSQL > INSERT INTO shipment (address, shipping_date) VALUES ('Alaska', '2008-08-08');SQL > INSERT INTO shipment (address, shipping_date) VALUES ('Texas', '2007-07-07');SQL > INSERT INTO shipment (address, shipping_date) VALUES ('Alaska', '2009-08-08');

SQL > SELECT * FROM shipment ; id | address | shipping_date----+---------+--------------------- 1 | Dakota | 2008-08-08 00:00:00 2 | Texas | 2007-07-07 00:00:00 3 | Alaska | 2009-08-08 00:00:00(3 rows)

SQL > SELECT * FROM shipment_part_2008; id | address | shipping_date----+---------+--------------------- 1 | Dakota | 2008-08-08 00:00:00(1 row)

SQL > SELECT * FROM shipment_part_pre2008; id | address | shipping_date----+---------+--------------------- 2 | Texas | 2007-07-07 00:00:00(1 row)

SQL > SELECT * FROM shipment_part_post2008 ; id | address | shipping_date----+---------+--------------------- 6 | Alaska | 2009-08-08 00:00:00(1 rows) จะเหนวา ขอมลถก Insert เขา partition table ทถกตอง ตามขอกำาหนดแลว

Copyright © 2009 by Peekanung                                                                                                     24

3.9 Materialized view

Materialized view (mview) เหมอน View ตรงทม link definition อยกบ base table และเหมอน table ตรงทมนจะเกบ ขอมลไวทตวเอง DBA จะเปนผกำาหนดวาจะมการ refresh data บอยแคไหน โดยท user ไมจำาเปนตองรวาม mview อย เพราะ

สามารถ select statement ผาน base table ไดเหมอนเดม

ขอแตกตางระหวาง materialized view กบ view

View Materialized view

ไมมขอมลอยจรง มแต statement ทเอาไวเรยกขอมลจาก base table (logical representation of table)

เปนการ duplicate data จาก base table ทำาใหมขอมล จรงเกบไวท mview เลย ทำาใหการ access data เรวกวา

view

Select ไดอยางเดยว ไมสามารถใชคำาสง Insert, Update, Delete ขอมลใน view ได

นอกจาก Select แลว สามารถใชคำาสง Insert, Update, Delete ขอมลใน view ได

หมายเหต Postgresql ไมสามารถใช Insert, Update, Delete กบ view ได Oracle สามารถใชคำาสง Insert, Update, Delete ได ในกรณท view ไมไดเกดจากการ join table การคำานวณ

หรอ virtual column ตวอยาง virtual column เชนSQL > create view v1 as select id, 'abc' as name from table1;

//name เปน virtual column ไมสามารถใชคำาสง Insert, Update, Delete กบ column 'name' ได( แตใชกบ 'id' โดยไมระบ 'name'ได)

SQL > insert into v1(id,name) values (2,'name02') ;// insert ไมได เนองจาก name เปน virtual column

SQL > insert into v1(id) values (2) ;// insert ไดเนองจากระบเฉพาะ column 'id' ซงเปน column ทมอยจรง

ขนดของ materialized view 1. Snapshot

■ ขอมลจะเปลยนแปลงตาม base table เมอมการสงให refresh data (Manual)■ เหมาะสำาหรบขอมลทมการเปลยนแปลงครงละจำานวนมาก แตไมเหมาะกบขอมลทมการเปลยนแปลงบอย

2. Eager■ ขอมลจะเปลยนแปลงทก transaction เมอ base table มการเปลยนแปลง■ ถา base table มการเปลยนแปลงบอยครง จะเกดการเปลยนแปลงท mview อยเสมอ ทำาใหสนเปลอง

ทรพยากร■ เหมาะสำาหรบขอมลท base table มการเปลยนแปลงนอย แตไมเหมาะกบการ import หรอ เปลยนแปลง

ขอมลจำานวนมาก

3. Lazy■ ขอมลจะเปลยนแปลงตาม base table เมอมการ commit เทานน ดงนนขอมลจะไมมการเปลยนแปลงบอย

เทาแบบ Eager แตขอมลจะถกตองตรงกบ base table มากกวาแบบ snapshot เนองจากไมตองรอใหมการ สง refresh

■ ขอมลใน mview กบ base table อาจจะไมตรงกนชวขณะ ( ขณะทยงอยใน transaction แตยงไมได commit)

4. Very lazy■ คลายแบบ snapshot คอขอมลจะเปลยนแปลงเมอมการสง refresh data แตการ update ขอมลจะทำาไดเรว

กวา และใชทรพยากรนอยกวา

วธการทำา Materialized view 3.9.1 Snapshot

ขอมลใน materialized view จะมการเปลยนแปลง เมอถกสง refresh data เทานน1.1 สราง table matviews เพอเกบขอมลเกยวกบ materialized view

SQL > CREATE TABLE matviews ( mv_name NAME NOT NULL PRIMARY KEY, -- ชอ mveiws

v_name NAME NOT NULL, -- ชอ view ทเปน base last_refresh TIMESTAMP WITH TIME ZONE) -- วนเวลาทมการสง refresh data

Copyright © 2009 by Peekanung                                                                                                     25

WITH OIDS;

1.2 สราง Function create_matview เพอใหเกบขอมลลง table matviews ทกครงทมการสง refresh data พรอมเชควาชอ mviews ตองไมซำา

SQL > CREATE OR REPLACE FUNCTION create_matview(NAME, NAME)RETURNS VOIDSECURITY DEFINERLANGUAGE plpgsql AS 'DECLARE

matview ALIAS FOR $1; view_name ALIAS FOR $2;

entry matviews%ROWTYPE; BEGIN

SELECT * INTO entry FROM matviews WHERE mv_name = matview; IF FOUND THEN RAISE EXCEPTION ''Materialized view ''''%'''' already exists.'', matview; END IF; EXECUTE ''REVOKE ALL ON '' || view_name || '' FROM PUBLIC''; EXECUTE ''GRANT SELECT ON '' || view_name || '' TO PUBLIC''; EXECUTE ''CREATE TABLE '' || matview || '' AS SELECT * FROM '' || view_name; EXECUTE ''REVOKE ALL ON '' || matview || '' FROM PUBLIC''; EXECUTE ''GRANT SELECT ON '' || matview || '' TO PUBLIC''; INSERT INTO matviews (mv_name, v_name, last_refresh) VALUES (matview, view_name, CURRENT_TIMESTAMP); RETURN;

END ';1.3 สราง Function drop_matview เพอให ลบ materialized view ออกจาก table matviews

SQL > CREATE OR REPLACE FUNCTION drop_matview(NAME) RETURNS VOID SECURITY DEFINER LANGUAGE plpgsql AS 'DECLARE matview ALIAS FOR $1; entry matviews%ROWTYPE; BEGIN SELECT * INTO entry FROM matviews WHERE mv_name = matview; IF NOT FOUND THEN RAISE EXCEPTION ''Materialized view % does not exist.'',

matview; END IF; EXECUTE ''DROP TABLE '' || matview; DELETE FROM matviews WHERE mv_name=matview; RETURN; END';

1.4 สราง Function refresh_matview เพอสง refresh data โดยในการสง refresh data ตองมการระบชอ materialized view ดวยเสมอ

SQL > CREATE OR REPLACE FUNCTION refresh_matview(name) RETURNS VOID SECURITY DEFINER LANGUAGE plpgsql AS ' DECLARE matview ALIAS FOR $1; entry matviews%ROWTYPE;

BEGIN SELECT * INTO entry FROM matviews WHERE mv_name = matview; IF NOT FOUND THEN RAISE EXCEPTION ''Materialized view % does not exist.'',

matview; END IF;

EXECUTE ''DELETE FROM '' || matview;

Copyright © 2009 by Peekanung                                                                                                     26

EXECUTE ''INSERT INTO '' || matview || '' SELECT * FROM '' || entry.v_name;

UPDATE matviews SET last_refresh=CURRENT_TIMESTAMP WHERE mv_name=matview;

RETURN;END';

1.5 ตอไปเปนการสรางตวอยาง table และ view สำาหรบทำา materialized viewSQL > CREATE TABLE player ( pname VARCHAR(255) PRIMARY KEY ); //table เกบรายละเอยดผ

เลน

SQL > CREATE TABLE game_score ( //table เกบรายละเอยดคะแนน pname VARCHAR(255) NOT NULL, score INTEGER NOT NULL);

SQL > CREATE VIEW player_total_score_v AS //view เกบรายละเอยดคะแนนสะสมของผเลนSELECT pname, sum(score) AS total_scoreFROM game_scoreGROUP BY pname;

SQL > INSERT INTO player VALUES ('player01');SQL > INSERT INTO player VALUES ('player02');SQL > INSERT INTO game_score VALUES ('player01','20');SQL > INSERT INTO game_score VALUES ('player01','10');SQL > INSERT INTO game_score VALUES ('player02','5');SQL > INSERT INTO game_score VALUES ('player02','10');SQL > INSERT INTO game_score VALUES ('player02','5');

SQL > SELECT * from player; pname

---------- player01 player02(2 rows)

SQL > SELECT * from game_score ; pname | score

----------+------- player01 | 20 player01 | 10 player02 | 5 player02 | 10 player02 | 5(5 rows)

SQL > SELECT * from player_total_score_v ; pname | total_score----------+------------- player01 | 30 player02 | 20(2 rows)

1.6 สราง materialized views ชอ player_total_score_mv โดยใช function create_matviewSQL > SELECT create_matview('player_total_score_mv', 'player_total_score_v');

// player_total_score_mv เปนชอ materialized view ซงตองกำาหนดเองในแตละครงทสราง

Copyright © 2009 by Peekanung                                                                                                     27

// player_total_score_v เปนชอ view ทไดสรางไวตงแตแรกSQL > CREATE INDEX pname_idx ON player_total_score_mv(pname);

// สราง index ใหกบ materialized view โดยใช pname เปน key

1.7 เมอตองการ Refresh data ใช function refresh_matviews ซงการ refresh ทกครง ตอง drop index เดมกอน เพอใหการ refresh ทำาไดเรวขน แลวคอยสราง index ใหม

SQL > DROP INDEX pname_idx ON player_total_score_mv;SQL > SELECT refresh_matview('player_total_score_mv');SQL > CREATE INDEX pname_idx ON player_total_score_mv(pname);

* หมายเหต : ขอมลบน player_total_score_mv จะยงไมมการเปลยนแปลงแมวา base table มการเปลยนแปลง แลว จนกระทงมการสง refresh data เกดขน

3.9.2 Eager ขอมลของ materialized view จะเปลยนแปลงทกครงท table เปลยนแปลง โดยใชความสามารถของ trigger ทอยบน table ในการจดการ ซง table นเรยกวา 'Underlying table'

ประเภทของความสมพนธระหวาง underlying table กบ materialized view(1) One-to-one

ขอมลใน view อาจ select มาจากบางคอลมน หรอทงหมดของ underlying table rows ใน view อาจไมขนอยกบ underlying table ตวอยางเชน เมอ user 1 คนเปลยน password จะสงผลตอขอมลใน view แค 1 row เทานน

(2) Many-to-one ขอมลหลายๆ rows ใน view ขนอยกบ 1 rows บน underlying table ซงเปนแบบทเจอคอนขางบอยในการ

join table เชน ถามการเปลยน group name จะสงผลตอขอมลใน view หลาย row

(3) One-to-many ขอมลใน view 1 rows มาจากหลาย row ใน underlying table เชน ผลรวมของคะแนน ทไดมาจากคะแนนยอยในแตละครง

(4) Many-to-many เปนกรณทเจอไมบอยนก คอ หลายๆ rows ใน view มาจากหลายๆ rows ใน underlying table ซงอาจมา

จากการรวมกนของแตละ relation หลายๆแบบ

การทำา Eager materialized view 2.1 สราง function mv_refresh_row โดย ซงมขนตอนการทำางานคราวๆ ดงน

ระบ Primary key ให materialized veiw delete row ทมอยเดมใน function โดยระบจาก primary key ทไดกำาหนดไว หลงจากนน select ขอมลมาจาก base view แลว insert เขา materialized view

2.2 สราง function mv_refreshmv_refresh จะ refresh เฉพาะ row ทมการเปลยนแปลง ซงจะทำางานตามเวลาทไดกำาหนดไว

2.3 สราง trigger ซงมขนตอนการทำางาน คราวๆ ดงน ระบ Primary key ให materialized view

สำาหรบการ delete และ insert ใหเรยกใช function mv_refresh_row

สำาหรบการ update ตองมการระบ row ทจะมการเปลยนแปลงขอมลตวอยาง

SQL > CREATE TABLE a ( -- สราง table a a_id INT PRIMARY KEY, v INT) WITH OIDS;

SQL > CREATE TABLE b ( -- สราง table bb_id INT PRIMARY KEY,

a_id INT REFERENCES a, v INT,

Copyright © 2009 by Peekanung                                                                                                     28

expires TIMESTAMP ) WITH OIDS;

SQL > CREATE TABLE c ( -- สราง table c c_id INT PRIMARY KEY, b_id INT REFERENCES b, v INT) WITH OIDS;

SQL > CREATE VIEW b_v AS -- สราง view b_v ซงมาจากการ join table a, b และ cSELECT b.b_id AS b_id,

a.v AS a_v, b.v AS b_v, sum(c.v) AS sum_c_v

FROM a JOIN b USING (a_id) JOIN c USING (b_id)WHERE (b.expires IS NULL OR b.expires >= now())GROUP BY b.b_id, a.v, b.v;

SQL > SELECT create_matview('b_mv', 'b_v');// สราง materialized view โดยใช function create_matview

จากตวอยาง ขอมลใน table a 1 แถว อาจมผลกบหลายแถวใน view b_v ( 1 : m) , ใน table b 1 แถว มผลกบ 1 แถวใน view b_v (1:1) และหลาย rows ใน table c มผลกบ view b_v เพยง 1 แถว (m : 1)

สราง function b_mv_refresh_row

SQL > CREATE FUNCTION b_mv_refresh_row(b_mv.b_id%TYPE) RETURNS VOID

SECURITY DEFINER LANGUAGE 'plpgsql' AS 'BEGIN DELETE FROM b_mv WHERE b_id = $1; INSERT INTO b_mv SELECT * FROM b_v WHERE b_id = $1; RETURN;END';

สราง function b_mv_refresh

SQL > CREATE FUNCTION b_mv_refresh() RETURNS VOID SECURITY DEFINER

LANGUAGE 'plpgsql' AS 'BEGIN PERFORM b_mv_refresh_row(b_id) //calling a function that has side-effects but no useful result value

FROM b, matviews WHERE matviews.mv_name = ''b_mv'' AND b.expires >= matviews.last_refresh AND b.expires < now();

UPDATE matviews

Copyright © 2009 by Peekanung                                                                                                     29

SET last_refresh = now() WHERE mv_name = ''b_mv'';

RETURN; END ';

สราง trigger ให table a, b และ c

1. trigger ของ table a มดงน1.1 trigger b_mv_ut จะทำางานหลงจากมการ update data ใน table a โดยเรยกใช function b_mv_a_ut ( ซงจะเรยกใช function b_mv_refresh_row อกท)

SQL > CREATE FUNCTION b_mv_a_ut() RETURNS TRIGGER SECURITY DEFINER LANGUAGE 'plpgsql' AS 'BEGIN IF OLD.a_id = NEW.a_id THEN PERFORM b_mv_refresh_row(b.b_id) FROM b WHERE b.a_id = NEW.a_id; ELSE PERFORM b_mv_refresh_row(b.b_id) FROM b WHERE b.a_id = OLD.a_id; PERFORM b_mv_refresh_row(b.b_id) FROM b WHERE b.a_id = NEW.a_id; END IF; RETURN NULL;END ';

SQL > CREATE TRIGGER b_mv_ut AFTER UPDATE ON aFOR EACH ROW EXECUTE PROCEDURE b_mv_a_ut();

1.2 trigger b_mv_dt จะทำางานหลงจากมการ delete data ใน table a โดยเรยกใช function b_mv_a_dt (ซงจะ

เรยกใช function b_mv_refresh_row อกท) SQL > CREATE FUNCTION b_mv_a_dt() RETURNS TRIGGER

SECURITY DEFINER LANGUAGE 'plpgsql' AS 'BEGIN PERFORM b_mv_refresh_row(b.b_id) FROM b WHERE b.a_id = OLD.a_id; RETURN NULL;END ';

SQL > CREATE TRIGGER b_mv_dt AFTER DELETE ON a FOR EACH ROW EXECUTE PROCEDURE b_mv_a_dt();

1.3 trigger b_mv_it จะทำางานหลงจากมการ insert data ใน table a โดยเรยกใช function b_mv_a_it (ซงจะ เรยกใช function b_mv_refresh_row อกท)

SQL > CREATE FUNCTION b_mv_a_it() RETURNS TRIGGERSECURITY DEFINER LANGUAGE 'plpgsql' AS 'BEGIN PERFORM b_mv_refresh_row(b.b_id) FROM b WHERE b.a_id = NEW.a_id; RETURN NULL;END';

SQL > CREATE TRIGGER b_mv_it AFTER INSERT ON a FOR EACH ROW EXECUTE PROCEDURE b_mv_a_it();

2. trigger ของ table b มดงน2.1 trigger b_mv_ut จะทำางานหลงจากมการ update data ใน table b โดยเรยกใช function b_mv_b_ut (ซงจะ

เรยกใช function b_mv_refresh_row อกท) SQL > CREATE FUNCTION b_mv_b_ut() RETURNS TRIGGER

SECURITY DEFINER LANGUAGE 'plpgsql' AS 'BEGIN IF OLD.b_id = NEW.b_id THEN PERFORM b_mv_refresh_row(NEW.b_id);

Copyright © 2009 by Peekanung                                                                                                     30

ELSE PERFORM b_mv_refresh_row(OLD.b_id); PERFORM b_mv_refresh_row(NEW.b_id); END IF; RETURN NULL;END';

SQL > CREATE TRIGGER b_mv_ut AFTER UPDATE ON b FOR EACH ROW EXECUTE PROCEDURE b_mv_b_ut();

2.2 trigger b_mv_dt จะทำางานหลงจากมการ delete data ใน table b โดยเรยกใช function b_mv_b_dt (ซงจะ เรยกใช function b_mv_refresh_row อกท)

SQL > CREATE FUNCTION b_mv_b_dt() RETURNS TRIGGERSECURITY DEFINER LANGUAGE 'plpgsql' AS 'BEGIN PERFORM b_mv_refresh_row(OLD.b_id); RETURN NULL;END';

SQL > CREATE TRIGGER b_mv_dt AFTER DELETE ON b FOR EACH ROW EXECUTE PROCEDURE b_mv_b_dt();

2.3 trigger b_mv_it จะทำางานหลงจากมการ insert data ใน table b โดยเรยกใช function b_mv_b_it (ซงจะ เรยกใช function b_mv_refresh_row อกท)

SQL > CREATE FUNCTION b_mv_b_it() RETURNS TRIGGERSECURITY DEFINER LANGUAGE 'plpgsql' AS 'BEGIN PERFORM b_mv_refresh_row(NEW.b_id); RETURN NULL;END';

SQL > CREATE TRIGGER b_mv_it AFTER INSERT ON b FOR EACH ROW EXECUTE PROCEDURE b_mv_b_it();

3. trigger ของ table c

3.1 trigger b_mv_ut จะทำางานหลงจากมการ update data ใน table c โดยเรยกใช function b_mv_c_ut (ซงจะ เรยกใช function b_mv_refresh_row อกท)

SQL > CREATE FUNCTION b_mv_c_ut() RETURNS TRIGGERSECURITY DEFINER LANGUAGE 'plpgsql' AS 'BEGIN IF OLD.b_id = NEW.b_id THEN PERFORM b_mv_refresh_row(NEW.b_id); ELSE PERFORM b_mv_refresh_row(OLD.b_id); PERFORM b_mv_refresh_row(NEW.b_id); END IF; RETURN NULL;END';

SQL > CREATE TRIGGER b_mv_ut AFTER UPDATE ON c FOR EACH ROW EXECUTE PROCEDURE b_mv_c_ut();

3.2 trigger b_mv_dt จะทำางานหลงจากมการ delete data ใน table c โดยเรยกใช function b_mv_c_dt (ซงจะ เรยกใช function b_mv_refresh_row อกท)

SQL >CREATE FUNCTION b_mv_c_dt() RETURNS TRIGGERSECURITY DEFINER LANGUAGE 'plpgsql' AS 'BEGIN PERFORM b_mv_refresh_row(OLD.b_id);

Copyright © 2009 by Peekanung                                                                                                     31

RETURN NULL;END';

SQL > CREATE TRIGGER b_mv_dt AFTER DELETE ON c FOR EACH ROW EXECUTE PROCEDURE b_mv_c_dt();

3.3 trigger b_mv_it จะทำางานหลงจากมการ insert data ใน table c โดยเรยกใช function b_mv_c_it (ซงจะ เรยกใช function b_mv_refresh_row อกท)

SQL > CREATE FUNCTION b_mv_c_it() RETURNS TRIGGERSECURITY DEFINER LANGUAGE 'plpgsql' AS 'BEGIN PERFORM b_mv_refresh_row(NEW.b_id); RETURN NULL;END';

SQL > CREATE TRIGGER b_mv_it AFTER INSERT ON c FOR EACH ROW EXECUTE PROCEDURE b_mv_c_it();

ทดลอง Insert ขอมลเขา table a, b และ c ตามลำาดบ

SQL > INSERT INTO a VALUES (1,11);SQL > INSERT INTO a VALUES (2,22);SQL > INSERT INTO b VALUES (1,1,111,'2009-06-01');SQL > INSERT INTO b VALUES (2,2,222,'2009-06-01');SQL > INSERT INTO c VALUES (1,1,1111);SQL > INSERT INTO c VALUES (2,2,2222);SQL > INSERT INTO c VALUES(2,2,3333);

ทดลอง Select ขอมลจาก table และ viewSQL > SELECT * FROM a;

a_id | v------+---- 1 | 11 2 | 22(2 rows)

SQL > SELECT * FROM b; b_id | a_id | v | expires------+------+-----+--------------------- 1 | 1 | 111 | 2009-04-25 00:00:00 2 | 2 | 222 | 2009-04-25 00:00:00(2 rows)

SQL > SELECT * FROM c; c_id | b_id | v------+------+------ 1 | 1 | 1111 2 | 2 | 2222 3 | 2 | 3333(3 rows)

SQL > SELECT * FROM b_mv; b_id | a_v | b_v | sum_c_v------+-----+-----+--------- 1 | 11 | 111 | 1111 2 | 22 | 222 | 5555(2 rows)

Copyright © 2009 by Peekanung                                                                                                     32

3.9.3 LazyLazy materialized view จะ update เมอ transaction commit แลว ซงจะเหมาะกบกรณทขอมลในบาง row มการ

เปลยนแปลงบอย

3.9.4 Very lazyVery lazy materialized view จะ update เมอ มการสง refresh data แตการ update ขอมลจะทำาไดเรวกวา และใช

ทรพยากรนอยกวา

(1) สราง table matview_changes เพอเกบขอมลการเปลยนแปลง materialized view ซงประกอบดวยขอมล OID และ primary key ของ materialized view

SQL > CREATE TABLE matview_changes ( mv_oid OID PRIMARY KEY,

pkey INTEGER NOT NULL );

(2) สราง function matview_queue_refresh_row เพอ insert oid และ primary key เขา table matview_changes

SQL > CREATE FUNCTION matview_queue_refresh_row(NAME, INTEGER) RETURNS VOIDSECURITY DEFINER LANGUAGE 'plpgsql' AS 'DECLARE mv OID; test INTEGER;BEGIN SELECT INTO mv oid FROM matviews WHERE mv_name = $1;

SELECT INTO test pkey FROM matview_changes WHERE matview_changes.mv_oid = mv AND matview_changes.pkey = $2;

IF NOT FOUND THEN INSERT INTO matview_changes (mv_oid, pkey) VALUES (mv, $2); END IF;

RETURN ;END ';

(3) สราง function b_mv_refreshSQL > CREATE OR REPLACE FUNCTION b_mv_refresh() RETURNS VOID

SECURITY DEFINER LANGUAGE 'plpgsql' AS ' DECLARE mv OID; BEGIN SELECT INTO mv oid FROM matviews WHERE mv_name = ''b_mv'';

PERFORM b_mv_refresh_row(b_id) FROM b, matviews WHERE matviews.oid = mv AND b.expires >= matviews.last_refresh AND b.expires < now();

PERFORM b_mv_refresh_row(pkey) FROM matview_changes WHERE mv_oid = mv;

UPDATE matviews

SET last_refresh = now() WHERE mv_name = ''b_mv'';

END ';

Copyright © 2009 by Peekanung                                                                                                     33

สราง trigger ให table a, b และ c 1. trigger ของ table a มดงน

1.1 trigger b_mv_ut จะทำางานหลงจากมการ update data ใน table a โดยเรยกใช function b_mv_a_ut ( ซงจะเรยกใช function b_mv_refresh_row อกท)

SQL > CREATE OR REPLACE FUNCTION b_mv_a_ut() RETURNS TRIGGER SECURITY DEFINER LANGUAGE 'plpgsql' AS ' BEGIN IF OLD.a_id = NEW.a_id THEN PERFORM matview_queue_refresh_row(''b_mv'', b.b_id) FROM b WHERE b.a_id = NEW.a_id; ELSE PERFORM matview_queue_refresh_row(''b_mv'', b.b_id) FROM b WHERE b.a_id = OLD.a_id; PERFORM matview_queue_refresh_row(''b_mv'', b.b_id) FROM b WHERE b.a_id = NEW.a_id; END IF; RETURN NULL; END ';

SQL > CREATE TRIGGER b_mv_ut AFTER UPDATE ON a FOR EACH ROW EXECUTE PROCEDURE b_mv_a_ut();

1.2 trigger b_mv_dt จะทำางานหลงจากมการ delete data ใน table a โดยเรยกใช function b_mv_a_dt (ซงจะ เรยกใช function b_mv_refresh_row อกท)

SQL > CREATE OR REPLACE FUNCTION b_mv_a_dt() RETURNS TRIGGER SECURITY DEFINER LANGUAGE 'plpgsql' AS ' BEGIN PERFORM matview_queue_refresh_row(''b_mv'', b.b_id) FROM b WHERE b.a_id = OLD.a_id; RETURN NULL; END ';

SQL > CREATE TRIGGER b_mv_dt AFTER DELETE ON a FOR EACH ROW EXECUTE PROCEDURE b_mv_a_dt();

1.3 trigger b_mv_it จะทำางานหลงจากมการ insert data ใน table a โดยเรยกใช function b_mv_a_it (ซงจะ เรยกใช function b_mv_refresh_row อกท)

SQL > CREATE OR REPLACE FUNCTION b_mv_a_it() RETURNS TRIGGER SECURITY DEFINER LANGUAGE 'plpgsql' AS ' BEGIN PERFORM matview_queue_refresh_row(''b_mv'', b.b_id) FROM b WHERE b.a_id = NEW.a_id; RETURN NULL; END ';

SQL > CREATE TRIGGER b_mv_it AFTER INSERT ON a FOR EACH ROW EXECUTE PROCEDURE b_mv_a_it();

2. trigger ของ table b มดงน2.1 trigger b_mv_ut จะทำางานหลงจากมการ update data ใน table b โดยเรยกใช function b_mv_b_ut (ซงจะ

เรยกใช function b_mv_refresh_row อกท) SQL > CREATE OR REPLACE FUNCTION b_mv_b_ut() RETURNS TRIGGER

SECURITY DEFINER LANGUAGE 'plpgsql' AS ' BEGIN IF OLD.b_id = NEW.b_id THEN PERFORM matview_queue_refresh_row(''b_mv'', NEW.b_id); ELSE PERFORM matview_queue_refresh_row(''b_mv'', OLD.b_id); PERFORM matview_queue_refresh_row(''b_mv'', NEW.b_id); END IF; RETURN NULL; END ';

Copyright © 2009 by Peekanung                                                                                                     34

SQL > CREATE TRIGGER b_mv_ut AFTER UPDATE ON b FOR EACH ROW EXECUTE PROCEDURE b_mv_b_ut();

2.2 trigger b_mv_dt จะทำางานหลงจากมการ delete data ใน table b โดยเรยกใช function b_mv_b_dt (ซงจะ เรยกใช function b_mv_refresh_row อกท)

SQL > CREATE OR REPLACE FUNCTION b_mv_b_dt() RETURNS TRIGGER SECURITY DEFINER LANGUAGE 'plpgsql' AS ' BEGIN PERFORM matview_queue_refresh_row(''b_mv'', OLD.b_id); RETURN NULL; END ';

SQL > CREATE TRIGGER b_mv_dt AFTER DELETE ON b FOR EACH ROW EXECUTE PROCEDURE b_mv_b_dt();

2.3 trigger b_mv_it จะทำางานหลงจากมการ insert data ใน table b โดยเรยกใช function b_mv_b_it (ซงจะ เรยกใช function b_mv_refresh_row อกท)

SQL > CREATE OR REPLACE FUNCTION b_mv_b_it() RETURNS TRIGGER SECURITY DEFINER LANGUAGE 'plpgsql' AS ' BEGIN PERFORM matview_queue_refresh_row(''b_mv'', NEW.b_id); RETURN NULL; END ';

SQL > CREATE TRIGGER b_mv_it AFTER INSERT ON b FOR EACH ROW EXECUTE PROCEDURE b_mv_b_it();

3. trigger ของ table c

3.1 trigger b_mv_ut จะทำางานหลงจากมการ update data ใน table c โดยเรยกใช function b_mv_c_ut (ซงจะ เรยกใช function b_mv_refresh_row อกท)

SQL > CREATE OR REPLACE FUNCTION b_mv_c_ut() RETURNS TRIGGER SECURITY DEFINER LANGUAGE 'plpgsql' AS ' BEGIN IF OLD.b_id = NEW.b_id THEN PERFORM matview_queue_refresh_row(''b_mv'', NEW.b_id); ELSE PERFORM matview_queue_refresh_row(''b_mv'', OLD.b_id); PERFORM matview_queue_refresh_row(''b_mv'', NEW.b_id); END IF; RETURN NULL; END ';

SQL > CREATE TRIGGER b_mv_ut AFTER UPDATE ON c FOR EACH ROW EXECUTE PROCEDURE b_mv_c_ut();

3.2 trigger b_mv_dt จะทำางานหลงจากมการ delete data ใน table c โดยเรยกใช function b_mv_c_dt (ซงจะ เรยกใช function b_mv_refresh_row อกท)

SQL > CREATE OR REPLACE FUNCTION b_mv_c_dt() RETURNS TRIGGER SECURITY DEFINER LANGUAGE 'plpgsql' AS ' BEGIN PERFORM matview_queue_refresh_row(''b_mv'', OLD.b_id); RETURN NULL; END ';

SQL > CREATE TRIGGER b_mv_dt AFTER DELETE ON c FOR EACH ROW EXECUTE PROCEDURE b_mv_c_dt();

Copyright © 2009 by Peekanung                                                                                                     35

3.3 trigger b_mv_it จะทำางานหลงจากมการ insert data ใน table c โดยเรยกใช function b_mv_c_it (ซงจะ เรยกใช function b_mv_refresh_row อกท)

SQL > CREATE OR REPLACE FUNCTION b_mv_c_it() RETURNS TRIGGER SECURITY DEFINER LANGUAGE 'plpgsql' AS ' BEGIN PERFORM matview_queue_refresh_row(''b_mv'', NEW.b_id); RETURN NULL; END ';

SQL > CREATE TRIGGER b_mv_it AFTER INSERT ON c FOR EACH ROW EXECUTE PROCEDURE b_mv_c_it();

3.10 การสำารองขอมล ( Backup / Restore) การสำารองขอมล เปนสงทควรทำาอยางสมำาเสมอในการใชงานฐานขอมล ยงทำาการสำารองขอมลบอยเทาไร กจะสามา

รถปองกนความเสยหายทอาจจะเกดขนกบฐานขอมล และสามารถนำาขอมลทมความทนสมยกลบคนมาไดมากเทานน โดยมวธการ ในการสำารองขอมลได 3 วธ คอ

• SQL dump • File system level backup • On-line backup

ซงในทนจะกลาวถงเพยงวธเดยวคอ SQL dump

3.10.1 Backup คำาสง pg_dump เปนคำาสงทนำาเอาฐานขอมลทระบออกมาเปน Text File หรอรปแบบอนๆทระบ

คำาสง pg_dumpall เปนคำาสงทสำารองทกฐานขอมล ออกมาเปน Text File หรอรปแบบอนๆ ทระบ

Options: -a --data-only สำาเนาเฉพาะขอมล ไมเอาโครงสราง -b --blob สำาเนา large objects ดวย ( จะเปนคา default เมอระบ--schema, --table, or –schema-only) -c --clean กำาหนดให output สรางคำาสง drop database กอน create

( ใชไดเฉพาะกรณท output เปน plain-text format เทานน) -C --create กำาหนดให output สรางคำาสงสำาหรบสราง database ไวดวย

( ใชไดเฉพาะกรณท output เปน plain-text format เทานน) -d --insert ใหนำาขอมลเขาโดยใชคำาสง INSERT แทนคำาสง COPY ของ PostgreSQL ซงจะทำาใหนำาไปใชกบ

ระบบฐานขอมลอน เชน oracle ได -D --column-inserts เหมอน -d แตมการระบ Column ดวย -E --encoding ระบ character set encoding (default คาจะเปนคาเดยวกบ database ท dump) -f --file=file เกบขอมลลงแฟมทกำาหนด -F, format {c|t|p} เกบขอมลลงแฟมตามรปแบบทกำาหนด โดย

c (custom) : กำาหนด output เอง ( เปน default) เชน output.dmp , output.dump ,...t ( tar) : กำาหนดเปน tar archive p (plain) : เปนคา default, output เปน plain-text SQL scripts

-h --host database server host name -n --schema สำาเนาเฉพาะ schema ทกำาหนด -N --exclude schema ไมสำาเนา schema ทกำาหนด -O --no owner ไมตงคาเจาของ ใหใชเหมอนเจาของเดม -o --oids สำาเนา oids ออกมาดวย -p --port ระบหมายเลข port ของ database server -s --schema-only สำาเนาเฉพาะโครงสราง schema ไมสำาเนาขอมล -S --superuser ระบ superuser เพอใช disable trigger ( กรณทตองมการ disable trigger) -t --table สำาเนาเฉพาะ table ทกำาหนด -T --exclude table ไมสำาเนา table ทกำาหนด

$ PG_DUMP [options] dbname > outfile

$ PG_DUMPALL [options] > outfile

Copyright © 2009 by Peekanung                                                                                                     36

-U --username กำาหนดชอ user ทใชในการตดตอ -v --verbose กำาหนดให dump file แสดงรายละเอยดตางๆของการ dump ดวยเชน message , start/stop time -W --password กำาหนดใหมการใส password กอน connect เขา database -x --no privileges ไมสำาเนาคำาสงเกยวกบสทธการใชงาน (grant/revoke) -z --compress 0..9 ระบการบบอด โดย 0 คอไมมการบบอด (default คอ ไมบบอด) และ 9 คอระดบสงสด

ตวอยาง$ pg_dump pis -f /tmp/pis.dump

// dump database 'pis' ออกมาโดยเกบไวท /tmp ชอไฟล pis.dump$ pg_dump –c –Fc –Z9 pis > pis.dump

// dump database 'pis' ออกมาโดยใชชอไฟล pis.dump โดยเพมคำาสง drop database กอน สง create , กำาหนด output file แบบกำาหนดเอง และใหมการบบอดแบบสงสด

$ pg_dump –U postgres –c –Fc –Z9 pis > pis.dump// dump database 'pis' ออกมา โดยใชชอไฟล pis.dump กำาหนด username ทใชตดตอคอ postgres กำาหนด output file แบบกำาหนดเอง และใหมการบบอดแบบสงสด

3.10.2 Restore การนำาขอมลสำารองทไดจาก pg_dump ตดตงกลบเขาฐานขอมลนน ตองพจารณาใชคำาสง ทใชในการนำาเขาจากชนดของ

แฟมขอมลสำารอง คอ • ถาแฟมขอมลสำารองอยในรปบบอด( สรางจาก option –Fc –หรอ Ft) ใหใชคำาสง

• นอกจากนนใชคำาสง psql

Options:

-a --data-only restore เฉพาะขอมล ไมเอาโครงสราง-c --clean กำาหนดให drop database กอนทำาการ restore- C --create create database กอน install -d --database-name connect เขา database ทกำาหนดไวแลว restore ลงใน database นน-e --exit-on-error ออกจากการทำางานทนทเมอเกด error

(default คอ ทำางานตอไปแลวแสดง error ออกมา) -f --file ระบ output จากการ restore ออกมาเปนไฟล-F, format {c|t|} restore ขอมล ตามรปแบบทกำาหนด

ปกตถาไมกำาหนดคำาสง pg_restore จะตรวจสอบใหอตโนมต-i --ignore-version ไมตรวจสอบ version ของ database-I --index restore เฉพาะ index เทานน-l --list แสดงรายละเอยดของไฟล-n --namespace restore เฉพาะ object ทอยใน schema ทระบไว-O --no-owner ไมตองตงคาเจาของใหเหมอนเจาของเดม-h --host ระบ database server host name-p --port ระบหมายเลข port ของ database server-s --schema-only restore เฉพาะโครงสราง schema ไมสำาเนาขอมล-S --superuser ระบ superuser เพอใช disable trigger-t --table restore เฉพาะ table ทกำาหนด-U --username กำาหนดชอ user ทใชในการตดตอ

-W --password กำาหนดใหมการใส password กอน connect เขา database -x --no privileges ไม restore คำาสงเกยวกบสทธการใชงาน (grant/revoke)

ตวอยาง$ pg_restore -C -d postgres db.dump // restore database โดยสงใหมการ create database กอน restore และระบชอ database เปน postgres

ตวอยางการ backup และ restore

$ pg_dump test > /tmp/test.dump // backup database ขอ 'test' ไวท /tmp/test.dump

$ PG_RESTORE [options..] [filename]

$ psql dbname < infile

Copyright © 2009 by Peekanung                                                                                                     37

$ createdb newtest // สราง database รอไว ชอ newtest$ psql newtest < /tmp/test.dump // restore เขา database 'newtest' จากท backup ไว

3.11 Database Maintenance

การบำารงรกษา Database ดวย Routine Vacuuming มวตถประสงคดงน1. เพอให database ทำางานไดตามปกต2. เพมความเรวในการทำางานของ database

3. กคนพนท disk ทถกใชในการ Update/Delete

เมอมการ Update/Delete ขอมล postgreSQL จะยงคงเกบขอมล version เกาๆเอาไว (เปนการทำางานของ Multiversion Concurrency Control : MVCC) ขอมลเกาทถกเกบไวนจะใชพนท disk เพมขนเรอยๆ ซงจำาเปนตองมการก

พนท disk ออกมาเพอใชสำาหรบขอมลใหม และเพอปองกนการโตขนของพนท disk สามารถทำาไดโดยการรน VACUUM การรน VACUUM เหมาะสำาหรบ table ทมการ update/delete ขอมลจำานวนมาก หรอบอยครง ซงไมมความจำาเปน

นกสำาหรบ table เลกๆ หรอ table ทไมคอยมการเปลยนแปลงขอมลVACUUM แบงออกเปน 2 ประเภท คอ LAZY VACUUM และ VACUUM FULL

1. LAZY VACUUMlazy vacuum หรอ vacuum จะทำางานโดยการกำาหนด expire data เกาใน table และ index เพอใชงานใหมใน

อนาคต พนท disk จะไมถกคนใหแก OS ขอดของ vacuum คอสามารถรนไปพรอมๆกบการทำางานอนๆของ database ได vacuum จงเหมาะสำาหรบการสง run แบบ routine เพราะไมมผลกระทบตอการทำางานของ database และใขทรพยากรในการ run นอย

2. VACUUM FULL เปนการเรยกคนพนทจากการ expire row version ซงพนทจากการสง vacuum full นจะถกคนใหกบ OS ดวย แตขอ

เสยคอ table ทกำาลงทำา VACUUM FULL จะถก lock จนกวาจะทำางานเสรจ vacuum full เหมาะสำาหรบกรณทตองการคน พนทใหแก OS หรอกรณทมการ update/delete ขอมลจำานวนมาก ซงการทำา VACUUM FULL จะใชเวลาทำานานกวา

VACUUM

คำาสง

กรณทไมระบชอ table จะหมายถงสง VACUUM ทก ๆ table ใน database แตสำาหรบคำาสง VACUUM ANALYZE จะตองระบชอ table ดวยเสมอ

parameters

FREEZE เทยบเทากบการ set parameters 'vacuum_freeze_min_age' = 0 เปนการสง cutoff age ของ transaction

VERBOSE แสดงรายละเอยดการทำางานของ VACUUM ในแตละ table ANALYZE update คาสถตเพอใชในการตดสนใจเกยวกบประสทธภาพของ query

SQL > VACUUM [FULL] [FREEZE] [VERBOSE] [ tablename]SQL > VACUUM [FULL] [FREEZE] [VERBOSE] ANALYZE [ tablename] [(column [,...] )]]