You are on page 1of 162

Tomando as Rdeas do Grande Elefante dos Dados

PostgreSQL
Rev. 2

Juliano Atanazio

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

ndice 0 - So re a !"ostila 0. - Padr!es "sados # - $ %&e o PostgreSQL' . - #omo se $ala e %omo se Es%re&e .' - Limites do PostgreSQL .( - SG)D * Sistemas Geren%iadores de )an%os de Dados .+ - #luster de )an%o de Dados ., - -nstala./o do PostgreSQL .0 - Primeiro %ontato .1 - 2 3s4l .1. - #omandos internos do 3s4l .1.' - 5ari6&eis do 3s4l .1.'. - #riando uma no&a &ari6&el .1.'.' - Destruindo uma &ari6&el 2 - SQL (Str&ct&red Q&er) Lang&age * Ling&agem Estr&t&rada de +ons&lta, '. - DDL 7Data Definition Language * Linguagem de Defini./o de Dados8 '.' - D9L 7Data 9ani3ulation Language * Linguagem de 9ani3ula./o de Dados8 '.( - D#L 7Data #ontrol Language * Linguagem de #ontrole de Dados8 '.+ - #ria./o de "su6rio - - !&tentica./o de cliente e config&ra./o geral do PostgreSQL ("g01 a.conf e "ostgres%l.conf, 2 - 3m"ortando &m anco de dados 45 "ronto de &m ar%&ivo 6 - 3dentificadores 7 - 8odelos de 9anco de Dados * Tem"lates : - Ti"os de Dados 1. - :umri%os 1. . - 96s%aras 3ara formatos numri%os 1.' - De #ara%teres 1.( - 5alor nulo 7null8 1.+ - L;gi%o ou <)ooleano= 1., - Data e >ora 1.,. - 96s%aras de Data e >ora ; - $ tendo a4&da de comandos SQL dentro do "s%l < - +oment5rios do PostgreSQL #0 - +onectando-se a o&tro anco de dados dentro do "s%l ## - +riando= 8odificando e !"agando $ 4etos #2 - Ta elas '. - #ria./o de Ta?elas '.' - Ta?elas tem3or6rias '.( - E@i?indo ta?elas %riadas '.+ - E@i?indo a estrutura de uma ta?ela '., - Alterando Ta?elas '.0 - A3agando uma ta?ela

'

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

#- - Ta les"aces #2 - Restri.>es (+onstraints, +. - Ti3os de Restri.!es +. . - #>E#A +. .' - :2T :"LL +. .( * ":-Q"E +. .+ - PR-9ARB AEB +. ., - $2RE-G: AEB +. .0 - 2 9odifi%ador <DE$A"LT= #6 - Descri./o de $ 4etos #7 - $"eradores #: - SELE+T - +ons&ltas (Q&eries, 1. - 2 #omando TA)LE 1.' - SELE#T sem $R29 1.( - TC3e #asts 1.+ - #ase - "m <-$= disfar.ado 1., - #2ALES#E 1.0 - :"LL-$ 1.1 - GREATEST e LEAST 1.D - #onEuntos 1.D. - $azendo o3era.!es de %onEunto 1.D. . - ":-2: 1.D. .' - -:TERSE#T 1.D. .( - EF#EPT 1.G - E@3ress!es Regulares 1. 0 - H>ERE 1. 0. - 2RI A:DI -:I agru3amento de %om3ara.!es e )ETHEE: 1. 0.' - 2 23erador L-AE ou JJ 1. 0.( - 2 23erador -L-AE ou JJK 1. 0.+ - S-9-LAR T2 1. 0., - 2 o3erador -S :"LL 1. 0.0 - 2 o3erador :2T 1. - A #l6usula 2RDER )B 1. ' - SELE#T -:T2 1. ( - #REATE TA)LE AS 1. + - Sele%ionando dados de diferentes ta?elas 1. +. - Aliases de Ta?elas 7a3elidos de ta?elas8 1. +.' - Joins 1. +.'. - Ti3os de Joins 1. +.'. . - #R2SS J2-: 7Jun./o %ruzada8 1. +.'. .' - :AT"RAL J2-: 7Jun./o natural8 1. +.'. .( - -::ER J2-: 7Jun./o interna8 1. +.'. .+ - 2"TER J2-: 7Jun./o e@terna8 1. +.'. ., - SEL$ J2-: 1. +.( - Su?-%onsultas 1. +.(. - Su?-%onsulta no H>ERE 1. +.(.' - Su?-%onsulta no SELE#T 1. +.(.( - Su?-%onsulta no $R29 1. +.(.+ - EF-STS 1. +.(., - -: e :2T -: 1. +.(.0 - A:B ou S29E 1. +.(.1 - ALL #; - ?3E@
(

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

#< - Es%&emas (Sc1emas, 20 - A&n.>es '0. - $un.!es 9atem6ti%as '0.' - $un.!es de Data e >ora '0.'. - e@tra%t7...8 '0.( - $un.!es de Strings '0.(. - toL%Mar78 '0.+ - $un.!es de Sistema '0., - $un.!es de Agrega./o 7ou de Gru3os de Dados8 '0.0 - A #l6usula GR2"P )B '0.1 - A #l6usula >A5-:G 2# - 3BSERT * inser./o de Dados ' . - -nserindo Registros %om SELE#T ' .' - -:SERT Agru3ado 22 - Dollar Q&oting 2- - CPD!TE * !lterando Registros '(. - Atualizando 9ais de "m #am3o '(.' - Atualizando %om Su?-%onsulta 22 - DELETE * Removendo Registros 26 - TRCB+!TE * Redefinindo &ma Ta ela +omo ?aDia 27 - +$PE '0. - $ormato #S5 '0.' - -nserindo Dados %om o #2PB 3elo Te%lado 2: - SEQCEB+E * Se%&Fncia '1. - $un.!es de 9ani3ula./o de Se4uNn%ia '1.' - "sando Se4uNn%ias em Ta?elas '1.( - Alterando uma Se4uNn%ia '1.+ - Deletando uma Se4uNn%ia 2; - 3BDEG * ndice 'D. - 9todos de -nde@a./o 'D. . - )TREE 'D. .' - G-ST 'D. .( - G-: 'D. .+ - >AS> 'D.' - Ondi%es #om3ostos 'D.( - Ondi%es Par%iais 'D.+ - Antes de E@%luir um Ondi%e 'D., - E@%luindo um Ondi%e 'D.0 - Re%onstru./o de Ondi%es * RE-:DEF 'D.1 - #L"STER 2< - D$8!3B (DomHno, -0 - Transa.>es I +ontrole de Sim&ltaneidade (0. - 95## * 9ulti 5ersion #on%urren%C #ontrol 7#ontrole de #on%orrNn%ia 9ulti 5ers/o8 (0.' - "tilidade de uma transa./o (0.( - A#-D (0.+ - :P&eis de -solamento
+

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

(0.+. - :P&el de -solamento Read #ommited 7LN Efeti&ado8 (0.+.' - :P&el de -solamento Serializa?le 7Serializ6&el8 (0., - $azendo uma transa./o (0.0 - SA5EP2-:T - Ponto de Sal&amento (0.0. - R2LL)A#A T2 SA5EP2-:T (0.0.' - RELEASE SA5EP2-:T (0.1 - SELE#T Q $2R "PDATE -# - +&rsores ( . - $ET#> - Re%u3erando linMas de um %ursor ( .' - 925E * 9o&endo #ursores ( .( - #L2SE * $e%Mando #ursores -2 - 9L$9 * 9inar) Large $94ect ($ 4eto Grande 9in5rio, ('. - Remo&endo )L2)s -- - A&n.>es +riadas Pelo Cs&5rio ((. - $un.!es SQL ((. . - $un.!es %om Retorno :ulo ((. .' - $un.!es %om Retorno :/o :ulo ((. .( - A3agando uma $un./o ((. .+ - $un.!es 4ue Retornam #onEuntos ((. ., - $un.!es %om ParRmetros ((. .0 - So?re%arga de $un./o ((.' - $un.!es internas ((.( - $un.!es na linguagem # ((.+ - Linguagens 3ro%edurais ((.+. - -nstala./o de linguagem 3ro%edural ((.+.' - PLS3gSQL ((.+.'. - Estrutura PLS3gSQL ((.+.'.' - De%lara.!es ((.+.'.( - Aliases de ParRmetros de $un./o ((.+.'.+ - SELE#T -:T2 ((.+.'., - Atri?utos ((.+.'.,. - Ti3o de 5ari6&el #o3iado * &ari6&el TTBPE ((.+.'.,.' - 5ari6&el Ti3o LinMa - TR2HTBPE ((.+.'.0 - Ti3o Registro * RE#2RD ((.+.'.1 - RE:A9E ((.+.'.D - Atri?ui.!es ((.+.'.G - PER$2R9 - E@e%u./o sem Resultado ((.+.'. 0 - :"LL - :/o $azer :ada ((.+.'. - EFE#"TE - E@e%u./o DinRmi%a de #omandos ((.+.'. ' - Status de um Resultado ((.+.'. '. - U 9todo - GET D-AG:2ST-#S ((.+.'. '.' - 'U 9todo - $2":D ((.+.'. ( - Retorno de "ma $un./o ((.+.'. (. - RET"R: ((.+.'. (.' - RET"R: :EFT ((.+.'. + - #ondi%ionais ((.+.'. +. - -$-T>E: ((.+.'. +.' - -$-T>E:-ELSE ((.+.'. +.( - -$-T>E:-ELSE -$ ((.+.'. +.+ - -$-T>E:-ELS-$-ELSE ((.+.'. +., - -$-T>E:-ELSE-$-ELSE ((.+.'. , - La.os ((.+.'. ,. - L22P ((.+.'. ,.' - EF-T ((.+.'. ,.( - H>-LE ((.+.'. ,.+ - $2R 7&aria./o inteira8
,

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

((.+.'. ((.+.'. ((.+.'. ((.+.'.

((.+.'. ,., - Loo3 3or Queries 0 - $2R--:-EFE#"TE 1 - Tratamento de Erros D - 9ensagens e Erros G - #ursores em $un.!es PLS3gSQL ((.+.'. G. - A?ertura de #ursores ((.+.'. G.' - "tiliza./o e $e%Mamento de #ursores ((.+.'. G.( - $un.!es PLS3gSQL 4ue Retornam #ursores

-2 - Gatil1os * Triggers -6 - PersonaliDando $"eradores -7 - Regras * R&les (0. - Atualizando 5ieVs %om Rules (0.' - Remo&endo Rules (0.( - Rules F Trigggers -: - Jeran.a de Ta elas (1. - -nserindo Dados em uma Ta?ela-$ilMa -; - !rra) de +ol&nas (D. - -nserindo Dados em ArraCs (D.' - Sele%ionando Dados de ArraCs -< - Particionamento de Ta elas (G. - $ormas de Parti%ionamento do PostgreSQL (G.' - -m3lementa./o do Parti%ionamento 20 - !dministra./o de Cs&5rios +0. - Roles +0.' - A3agando Roles +0.( - Gru3os +0.+ - #on%edendo ou Re&ogando A%esso a 2?Eetos +0., - 5erifi%ando os Pri&ilgios de 2?Eetos +0.0 - #on%edendo ou Re&ogando Pri&ilgios em #olunas 2# - D linK * !cessando &m $&tro 9anco de Dados 22 - ?!+CC8 * !locando Es"a.os sem Des"erdHcio 2- - !B!LELE - +oleta de EstatHsticas So re &ma 9ase de Dados 22 - EGPL!3B 26 - 9acK&" M Restore +,. - )a%Wu3 SQL +,. . - 3gLdum3 +,. . . - Restaurando do 3gLdum3 e o "tilit6rio 3gLrestore +,. .' - 3gLdum3all +,.' - )a%Wu3s 3ara )an%os de Dados Grandes +,.( - )a%Wu3 em :P&el de Sistema de Ar4ui&os +,.+ - Ar4ui&amento #ontPnuo +,.+. - HAL 7Hrite-AMead-LogX Registro Pr&io de Es%rita8 +,.+. . - )enefP%ios do HAL +,.+. .' - P-TR - Point -n Time Re%o&erC +,.+. .'. - #onfigura./o do Ar4ui&amento +,.+. .'.' - $azendo um )a%Wu3 da )ase +,.+. .'.( - Re%u3era./o P-TR
0

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

+,.+. .'.+ - #onfigura./o de Restaura./o 7re%o&erC.%onf8 +,.+.' - #ronologias * Timelines +,.+.'. - Re%u3era./o P-TR 7%ontinua./o8 27 - +onfig&ra.>es de 8emNria e !4&stes de Desem"en1o +0. - SMared 9emorC +0. . - 5isualizando os 5alores de 9em;ria #om3artilMada +0. .' - 9odifi%ando os 5alores de 9em;ria #om3artilMada +0.' - #onfigura.!es de #onsumo de Re%ursos no 3ostgres4l.%onf +0.'. - Geren%iamento de Tra&a * Lo%W 9anagement +0.'. . - deadlo%WLtimeout +0.'. .' - ma@Llo%WsL3erLtransa%tion +0.'.' - 9em;ria +0.'.'. - sMaredL?uffers +0.'.'.' - tem3L?uffers +0.'.'.( - ma@L3re3aredLtransa%tions +0.'.'.+ * VorWLmem +0.'.'., - maintenan%eLVorWLmem +0.'.'.0 - ma@Lsta%WLde3tM +0.'.( - "so de Re%ursos do Aernel +0.'.(. - ma@LfilesL3erL3ro%ess +0.'.(.' - sMaredL3reloadLli?raries +0.'.+ - #usto )aseado no Tem3o de 5A#""9 +0.'.+. - &a%uumL%ostLdelaC +0.'.+.' - &a%uumL%ostL3ageLMit +0.'.+.( - &a%uumL%ostL3ageLmiss +0.'.+.+ - &a%uumL%ostL3ageLdirtC +0.'.+., - &a%uumL%ostLlimit +0.'., - )a%Wground Hriter +0.'.,. - ?gVriterLdelaC +0.'.,.' - ?gVriterLlruLma@3ages +0.'.,.( - ?gVriterLlruLmulti3lier +0.'.0 - #om3ortamento AssPn%rono +0.'.0. - effe%ti&eLioL%on%urren%C +0.'.1 - #onstantes de #usto do PlaneEador +0.'.1. - se4L3ageL%ost +0.'.1.' - randomL3ageL%ost +0.'.1.( - %3uLtu3leL%ost +0.'.1.+ - %3uLinde@Ltu3leL%ost +0.'.1., - %3uLo3eratorL%ost +0.'.1.0 - effe%ti&eL%a%MeLsize 2: - nstala./o a Partir do +Ndigo Aonte +1. - -nstalando 2; - 3nstala./o do PostgreSQL no @indoOs EPtras #;digo do )an%o de Dados "sado %omo E@em3lo 7#o3ieI %ole e sal&e8 Di%as 9i liografia

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

0 - So re a !"ostila
Esta a3ostila tem %omo o?Eeti&o e@3li%ar de forma sim3les e o?Eeti&a %on%eitos do ?an%o de dados o3en sour%e PosrgreSQL. Pode ser ?ai@ada 3elo site Mtt3XSSe@%elsis.%om.?rSdoVnloadsS3ostgres4l.3df e redistri?uPda li&remente. 0.# - Padr>es Csados Para fa%ilitar a leitura e fazer uma melMor organiza./oI de a%ordo %om o ti3o de te@to s/o adotados os seguintes 3adr!esX
Cdigos SQL Mensagens geradas por comandos SQL Comandos do sistema operacional (shell) Mensagens geradas por comandos do sistema operacional Nomes de objetos Palavras em desta%&e e novos termos

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

# - $ %&e o PostgreSQL'
PostgreSQL um sistema geren%iador de ?an%o de dados o?Eeto-rela%ional ?aseado no P2STGRESI 5ers/o +.'I desen&ol&ido na "ni&ersidade da #alifornia no De3artamento de #iNn%ias da #om3uta./o em )erWeleCI o 4ual foi 3ioneiro em muitos %on%eitos 4ue &ieram a estar dis3onP&eis em alguns ?an%os de dados %omer%iais mais tarde. 2 PostgreSQL um des%endente o3en-sour%e do %;digo original de )erWeleC %ode. Su3orta uma grande 3arte do 3adr/o SQL standard e ofere%e muitas %ara%terPsti%as modernasX #onsultas %om3le@asY #Ma&es estrangeiras 7foreign WeCs8Y GatilMos 7triggers8Y 5is!es 7&ieVs 8Y -ntegridade transa%ional

2 PostgreSQL 3ode tam?m ser estendido 3elo usu6rio 3ara muitos 3ro3;sitosI 3or e@em3lo adi%ionando no&osX ti3os de dadosY fun.!esY o3eradoresY fun.!es agregadasY mtodos de inde@a./oY linguagens 3ro%edurais

De&ido Z sua li%en.a li?eralI o PostgreSQL 3ode ser usadoI modifi%adoI e distri?uPdo 3or 4ual4uer um gratuitamente 3ara 4ual4uer 3ro3;sitoI seEa 3ri&adoI %omer%ialI ou a%adNmi%o. 2 PostgreSQL um ?an%o de dados o?Eeto-rela%ional 7nada a &er %om linguagens de 3rograma./o orientadas a o?Eetos8I em 4ue %ada %oisa %riada tratada %omo um o?EetoI tais %omo ?an%os de dadosI ta?elasI &ieVsI triggersI et%. 2s o?Eetos 3odem ter rela%ionamento entre si. #.# - +omo se Aala e como se Escreve "ma d[&ida %omum ao PostgreSQL seu nome. As formas %orretas s/o as duas seguintesX PostgresI 3ronun%ia-se <3ostPgres= 7sim o <s= 3ronun%iado\8Y PostgreSQLI 3ronun%ia-se <3ostgres s 4uiu el=.

:un%aI EamaisI em Mi3;tese nenMuma es%re&er <3ostgree= ou dizer <3ostgrP=. -nfelizmente ainda M6 fontes na -nternet %om o nome do Postgres es%rito erroneamenteI o 4ue le&a muita gente tam?m a falar errado.

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

#.2 - Limites do PostgreSQL


Limite TamanMo m6@imo de um ?an%o de dados TamanMo m6@imo de uma ta?ela TamanMo m6@imo de uma linMa 7registro8 TamanMo m6@imo de um %am3o 7%oluna8 :[mero m6@imo do linMas 3or ta?ela :[mero m6@imo de %olunas 3or ta?ela :[mero m6@imo de Pndi%es 3or ta?ela ?alor -limitado (' T) .0 T) G) -limitado ',0 - 000 de3ende do ti3o de %oluna -limitado

#.- - SG9D * Sistemas Gerenciadores de 9ancos de Dados ] o %onEunto de softVares 7ser&er8 4ue geren%iam um ?an%o de dadosI o 4ual dis3oni?iliza interfa%e 3ara geren%iamento atra&s de a3li%a.!es %lientes 3ara mani3ula./o dos dados. E@em3los de SG)DsX PostgreSQLI 2ra%leI 9CSQLI D)'I $ire?irdI et%. A3li%a.!es %lientes ^ SG)D ^ )ase de Dados #.2 - +l&ster de 9anco de Dados 2u sim3lesmente <%luster= onde est/o os ar4ui&os fPsi%os de um sistema de ?an%o de dadosI os 4uais %ontm os o?EetosI tais %omo ?an%os de dadosI ta?elas e et%. #.6 - 3nstala./o do PostgreSQL A?ra algum terminal de sua 3referNn%ia e torne-se rootI no Linu@I dN o K%omandoX
sudo su

ou
su

KDe3ende %omo o sistema foi %onfigurado 9ande instalar o PostgreSQLX


apt-get -y install postgresql

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

#.7 - Primeiro contato Para fins de a3rendizagemI nosso usu6rio do sistema o3era%ional ser6 <aluno= e ent/oI %omo root dN o seguinte %omandoX
su postgres

<3ostgres= o usu6rio administrador do ?an%o de dados e agora o 3rom3t do %onsole mostra 4ue <&iramos= esse usu6rio. E %omo 3ostgres dN o %omandoX
psql

Entramos na ferramenta %liente do PostgreSQLI o 3s4l e 3or ele faremos todo o geren%iamento de nosso ?an%o de dados. Seu 3rom3t mudar6 3araX <3ostgres_`=I o 4ue indi%aX <3ostgres= ^ nome do ?an%o de dados 74uando n/o se de%lara e@3li%itamenteI o 3s4l entende 4ue de&e se %one%tar a um ?an%o de dados de mesmo nome do usu6rio8Y <_= 7igual8^ indi%a 4ue est6 3ronto 3ara se re%e?er algum %omando no&oY <`= 7sustenido8 ^ indi%a 4ue o usu6rio 4ue est6 o3erando o ?an%o de dados no momento um <su3eruser=I no %aso de ser um usu6rio %omum <a= 7maior 4ue8. 2?s.X 9uitas &ezes no lugar do <_= 3oder6 %onter algum outro %ara%tereI tal %omo um <7< 73arNnteses a?erto8I o 4ual indi%a 4ue de&er6 ser de&idamente fe%Mado. #.: - $ "s%l ] o terminal interati&o do PostgreSQLI um a3li%ati&o %lienteI 4ue 3ermite a %one@/o a um ?an%o de dados. "soX psql
[OPES]... [NOMEBD [USURIO]]

Dentre suas o3.!es mais usadasX


-M -P -" -H Most 3ort user m64uina do ser&idor de ?an%o de dados ou diret;rio do so4uete 73adr/oX bS&arSrunS3ostgres4lb8 3orta do ser&idor de ?an%o de dados 73adr/oX b,+('b8 nome de usu6rio do ?an%o de dados 73adr/oX b3ostgres4lb8 3ergunta senMa 73ode o%orrer automati%amente8

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

#.:.# - +omandos internos do "s%l DN o seguinte %omando 3ara e@i?ir aEuda dos %omandos internosX Q'
+omando c%donne%te c%d c%o3CrigMt cen%oding cM c3rom3t c3assVord c4 cset ctiming cunset c\ d:29Ee d#29A:D2e d:29E d5AL2Ree d#2D-$-#Aij2e d#29A:D2 SQLe dTEFT2e :29E d"S"gR-2e ParRmetros d:29E)Df- "S"gR-2f- 9gQ"-:Af- P2RTAf-e dD-REThR-2e Descri./o %one%ta a um outro ?an%o de dados 7atual b3ostgresb8 muda o diret;rio de tra?alMo atual mostra termos de uso e distri?ui./o do PostgreSQL mostra ou define %odifi%a./o do %liente mostra sinta@e dos %omandos SQLI K 3ara todos os %omandos 3ergunta o usu6rio ao definir uma &ari6&el interna muda a senMa de um usu6rio sair do 3s4l define &ari6&el interna ou lista todos %aso n/o tenMa 3arRmetros alterna 3ara dura./o da e@e%u./o de %omandos 7atualmente desa?ilitado8 a3aga 7e@%lui8 &ari6&el interna e@e%uta %omando na sMell ou ini%ia sMell iterati&a

)uffer de %onsulta ce cg c3 cr cs cV EntradaSSaPda ce%Mo ci co c4e%Mo -nformati&o cd cd cda cd? cd% cd# cdd cdD cdf cd$ cd$d cd$t d92DEL2e d92DEL2e d92DEL2e d92DEL2e d92DEL2e d92DEL2e d:29Ee ktfifsf&fSl d92DEL2e d92DEL2e d92DEL2e d92DEL2e des%re&e ta?elaI Pndi%eI se4uNn%ia ou &is/o 7adi%ione bmb 3ara o?ter mais detalMe8 lista ta?elasSPndi%esSse4uNn%iasS&is!esSta?elas do sistema lista fun.!es de agrega./o lista ta?les3a%es 7adi%ione bmb 3ara o?ter mais detalMe8 lista %on&ers!es lista %on&ers!es de ti3os mostra %oment6rio do o?Eeto lista domPnios lista fun.!es 7adi%ione bmb 3ara o?ter mais detalMe8 lista %onfigura.!es de ?us%a te@tual 7adi%ione bmb 3ara o?ter mais detalMes8 lista di%ion6rios de ?us%a te@tual 7adi%ione bmb 3ara o?ter mais detalMes8 lista modelos de ?us%a te@tual dSTR-:Ge dARQ"-52e dARQ"-52e dSTR-:Ge es%re&e %adeia de %ara%teres na saPda 3adr/o e@e%uta %omandos de um ar4ui&o en&ia todos os resultados da %onsulta 3ara ar4ui&o ou f3i3e es%re&e %adeia de %ara%teres 3ara saPda da %onsulta 7&eEa co8 dARQ"-52e dARQ"-52e dARQ"-52e dARQ"-52e edita o ?uffer de %onsulta 7ou ar4ui&o8 %om um editor e@terno en&ia o ?uffer de %onsulta 3ara o ser&idor 7e os resultados 3ara ar4ui&o ou <f= 73i3e88 mostra o %onte[do do ?uffer de %onsulta reini%ia 7a3aga8 o ?uffer de %onsulta mostra Mist;ri%o ou gra&a-o em um ar4ui&o es%re&e o ?uffer de %onsulta 3ara ar4ui&o

'

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

+omando cd$3 cdg cdn cdo cdl cd3 cdT cdu cl cz $ormata./o ca c# cf c> c3set

ParRmetros d92DEL2e d92DEL2e d92DEL2e d:29Ee

Descri./o lista analisadores de ?us%a te@tual 7adi%ione bmb 3ara o?ter mais detalMe8 lista gru3os lista es4uemas 7adi%ione bmb 3ara o?ter mais detalMe8 lista o3eradores lista o?Eetos grandesI mesmo 4ue cloLlist

d92DEL2e d92DEL2e d92DEL2e

lista 3ri&ilgios de a%esso de ta?elasI &is!es e se4uNn%ias lista ti3os de dado 7adi%ione bmb 3ara o?ter mais detalMe8 lista usu6rios lista todos os ?an%os de dados 7adi%ione bmb 3ara o?ter mais detalMe8

d92DEL2e

lista 3ri&ilgios de a%esso de ta?elasI &is!es e se4uNn%ias 7mesmo 4ue cd38

alterna entre modo de saPda desalinMado e alinMado dSTR-:Ge dSTR-:Ge define o tPtulo da ta?elaI ou a3aga %aso nada seEa es3e%ifi%ado mostra ou define se3arador de %am3os 3ara saPda de %onsulta desalinMada alterna 3ara modo de saPda em >T9L 7atual desa?ilitado8 :29E d5AL2Re define o3./o de saPda da ta?ela 7:29E X_ kformatf?orderfe@3andedffieldse3ffooterfnullf numeri%lo%alefre%ordse3ftu3lesLonlCftitlefta?leattrf3agerl8 mostra somente registros 7atual desa?ilitado8 dSTR-:Ge define atri?utos do mar%ador >T9L nta?lea ou a3aga %aso nada seEa es3e%ifi%ado alterna 3ara saPda e@3andida 7atual desa?ilitado8

ct cT c@ #;3iaI 2?Eetos Grandes c%o3C cloLe@3ort cloLim3ort cloLlist cloLunlinW 2-DL2) 2-DL2) ARQ"-52 ARQ"-52 d#29E:TgR-2e

realiza %omando SQL #2PB dos dados 3ara m64uina %liente

o3era.!es %om o?Eetos grandes

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

#.:.2 - ?ari5veis do "s%l Dentro do 3s4l 3odemos a%essar &ari6&eis de sistema e tam?m %riar nossas 3r;3rias &ari6&eis. Para e@i?ir todas as &ari6&eis e seus res3e%ti&os %onte[dosX
\set AUTOCOMMIT = 'on' PROMPT1 = '%/%R%# ' PROMPT2 = '%/%R%# ' PROMPT3 = '>> ' VERBOSITY = 'default' VERSION = 'PostgreSQL 8.4.2 on i486-pc-linux-gnu, compiled by GCC gcc-4.3.real (Ubuntu 4.3.21ubuntu11) 4.3.2' DBNAME = 'postgres' USER = 'user' HOST = '/var/run/postgresql' PORT = '5432' ENCODING = 'UTF8'

A%essando o %onte[do de uma determinada &ari6&elX


\echo :USER

#.:.2.# - +riando &ma nova vari5vel


\set nova_variavel valor

Se dermos o %omando \set no&amente 3oderemos &er 4ue a &ari6&el %riada se en%ontrar6 na [ltima linMa. #.:.2.2 - Destr&indo &ma vari5vel
\unset nova_variavel

Digitando o %omando \set &erifi%amos 4ue ela dei@ou de e@istir.

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

2 - SQL (Str&ct&red Q&er) Lang&age * Ling&agem Estr&t&rada de +ons&lta,


] a linguagem usada nos SG)Ds 3or 3adr/oI no entanto %ada um tem suas 3arti%ularidades dentro da 3r;3ria linguagemI tendo im3lementa.!es diferentes. 2 mesmo o?Eeti&o 3ode ser feito de formas SQL diferentes de um SG)D 3ra outro. Assim %omo em linguagens de 3rograma./o <%omuns=I e@istem 3ala&ras reser&adasI as 4uais n/o 3odem ser usadas %omo identifi%adores. :o PostgreSQL os %omandos SQL s/o finalizados %om 3onto e &Prgula 7Y8 e seus %omandos n/o s/o case sensitive. 2.# - DDL (Data Definition Lang&age * Ling&agem de Defini./o de Dados, ] a 3arte da Linguagem SQL 4ue trataI %omo o 3r;3rio nome dizI da defini./o da estrutura dos dadosI %uEos efeitos se d/o so?re o?Eetos. #ria./o de ?an%os de dadosI ta?elasI &ieVsI triggersI et%... E@em3losX CREATE 7%ria./o8I ALTER 7altera./o8I DROP 7remo./o8I et%. 2.2 - D8L (Data 8ani"&lation Lang&age * Ling&agem de 8ani"&la./o de Dados, ] a 3arte da Linguagem SQL 4ue n/o altera a estrutura e sim os registros de uma ?ase de dadosI %uEos efeitos se d/o so?re registros. S/o %omandos 4ue fazem %onsultasI inseremI alteram ou a3agam registros. E@em3losX SELECT 7%onsulta8I INSERT 7inser./o8I UPDATE 7altera./o8I DELETE 7remo./o8I et%. 2.- - D+L (Data +ontrol Lang&age * Ling&agem de +ontrole de Dados, ] a 3arte da linguagem SQL referente ao %ontrole de a%esso a o?Eetos 3or usu6rios e seus res3e%ti&os 3ri&ilgios. 2s 3rin%i3ais %omandos SQL s/oX
GRANTX

Garante direitos a um usu6rioY REVOKEX Re&oga 7retira8 direitos dados a um usu6rio. 2s direitos dados a um usu6rio 3odem serX ALLI et%.
CREATEI EXECUTEI REFERENCESI SELECTI TRIGGERI USAGEI

CONNECTI DELETEI INSERTI RULEI TEMPORARYI UPDATEI

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

2.2 - +ria./o de Cs&5rio


CREATE USER aluno

na3erte a te%la ta? 'Fa

2 3s4l tem uma %ara%terPsti%a muito interessanteI a 4ual te aEuda a %om3letar um %omando ou mostrar outras o3.!es 3ossP&eis a3ertando a te%la ta?. :o %aso do %omando a%imaI e@i?ir6 na sua telaX
AD9-: #REATER2LE #2::E#T-2: L-9-T #REATE"SER E:#RBPTED L2G-: -: :2#REATED) -:>ER-T :2#REATER2LE :2#REATE"SER :2S"PER"SER :2-:>ER-T :2L2G-: SBS-D R2LE S"PER"SER

":E:#RBPTED #REATED)

Essas s/o o3.!es 4ue s/o e@i?idas 3ara %om3letarmos nosso %omando. :o %aso o faremos assimX
CREATE USER aluno NOSUPERUSERY

#riamos o usu6rio 4ue ir6 me@er no nosso ?an%o de dadosI 4ue 3or %on&eniNn%ia o mesmo nome do usu6rio do sistema 7Linu@8. 9as o mesmoI 3or en4uanto tem a.!es muito limitadasI 3ois n/o um <su3eruser=. Para sair do 3s4lX
\q

5oltamos ao 3rom3t do %onsoleI %omo o usu6rio 3ostgres e ent/o &oltaremos a ser rootX
exit

Agora de&emos &oltar a ser o usu6rio alunoI a3enas re3ita o %omando a%imaX
exit

2 usu6rio root tem o 3oder de se <mutar= 3ara 4ual4uer usu6rio do sistemaI nosso usu6rio aluno n/o tem tais 3oderes e 3re%isa&a se transformar no usu6rio 3ostgresI 4ue %omo E6 foi dito o su3er usu6rio do PostgreSQL 3ara adi%ionar usu6rios no&os ao SG)DI no %aso adi%ionamos o usu6rio <aluno=. #om o usu6rio alunoI 3ara fins de testeI tente %one%tar-se ao ?an%o de dados 3ostgresX
psql postgres

#aso re%e?er a seguinte mensagemX


psql: FATAL: autenticao do tipo Ident falhou para usurio configurao de autenticao de cliente PostgreSQL dever ser configurado. "aluno", o arquivo de

2 3r;@imo t;3i%o trata do assunto.

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

- - !&tentica./o de cliente e config&ra./o geral do PostgreSQL ("g01 a.conf e "ostgres%l.conf,


Para 3odermos %one%tar ao PostgreSQLI nosso usu6rio tem 4ue estar autorizado. #omo rootI editaremos o ar4ui&o /etc/postgresql/8.4/main/pg_hba.conf e de&em ser adi%ionadas as seguintes linMas em seu finalX
lo%al all Most all aluno aluno ident sameuser G'. 0D.0. S'+ md,

2?s.X :o lugar de < G'. 0D.0.0S'+= ada3te %onforme sua m64uina na rede. Ao editarmos o ar4ui&o pg_hba.conf demos a de&ida 3ermiss/o 3ara 4ue o usu6rio 3ossa a%essar. :o entantoI seria ?om tam?m fazer %om 4ue o ser&idor a?ra a 3orta do PostgreSQL 7,+('8 em todas as interfa%es. Edite tam?m o ar4ui&o /etc/postgresql/8.4/main/postgresql.confX 9ude a linMa
`listenLaddresses _ olo%alMosto

3ara
listenLaddresses _ oKo

Efeti&e as altera.!esI a3;s sal&ar dando o %omando no 3rom3t do sistemaX


/etc/init.d/postgresql restart

Le&ando-se em %onta 4ue agora somos o usu6rio rootI mudemos 3ara 3ostgresX
su postgres

Entre no 3s4l e nele %rie uma senMa 3ara alunoX


ALTER USER aluno password '123456';

#om o usu6rio alunoI digite no 3rom3tX


psql -h 192.168.0.1 -d postgres

$oi soli%itada uma senMaI a4uela 4ue foi %riada 3elo administrador do 3ostgres4l. A3;s a senMa ter sido a%eita %om su%esso o 3rom3t do 3s4l fi%ou da seguinte formaX 3ostgres_a #omo E6 foi %omentado no inP%ioI o sinal <a= indi%a 4ue o usu6rio <aluno= limitado. Ent/oI 3or fimI mudaremos seu status 3ara <su3eruser=. $aremos isso atra&s do at ent/oI [ni%o administrador do ?an%o de dadosI o usu6rio <3ostgres=I dentro 3s4lX
ALTER USER aluno SUPERUSER;

De agora em diante s; usaremos o usu6rio <aluno=I 3ois at a4ui esse rodPzio de usu6rios foi ne%ess6rioI mas agora 4ue tem-se o 3oder de <su3eruser=I s; ele far6 os %omandos.

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

2 - 3m"ortando &m anco de dados 45 "ronto de &m ar%&ivo


:os e@tras &o%N en%ontra-se o %;digo do ar4ui&o <%urso.s4l=I %o3ie e sal&e-o no diret;rio <Stm3=. Agora &amos rod6-loX
\i /tmp/curso.sql

A3esar de estarmos %riando um no&o ?an%o de dados %Mamado <%urso=I de&emos tem3orariamente nos %one%tar ao ser&idor e 3ra isso ne%ess6rio es3e%ifi%ar algum ?an%o de dados 3r e@istenteI no %aso o <3ostgres= 4ue assim %omo o usu6rio de mesmo nome %riado na instala./o do SG)D. PoderPamos ter feito de maneira diferenteI no 3rom3t do sistema o3era%ionalI %om o 3s4lX
psql -f /tmp/curso.sql postgres

AgoraI 3ra entrar no ?an%o de dados usaremos no sMellX


psql curso -h 192.168.7.2

#omo definimos no ar4ui&o <3gLM?a.%onf=I ser6 3edida uma senMa. Saia do 3s4lX
\q

DN o %omandoX
psql curso

Dessa &ez n/o foi 3edida uma senMa. Pedimos a %one@/o na m64uina lo%al 7lo%alMost8. Sugest/o de estudoX ar4ui&os pg_hba.conf e postgresql.conf.

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

6 - 3dentificadores
Para nomearmos identifi%adores de&emos usar letras ou <L= 7underline8X #ertoX
CREATE DATABASE abc;

ErradoX
CREATE DATASE 123;

Se 3or a%aso fosse %riado um ?an%o usando letras mai[s%ulasX


CREATE DATABASE ABC;

2 mesmo seria %onsiderado %omo <a?%= e fa%ilmente a3agado %omo se ti&esse sido %riado %om letras min[s%ulasX
DROP DATABASE abc;

>6 uma maneira de fazer %om os identifi%adores %riados seEam <%ase-sensiti&e=I 3ara isso de&emos %riar os nomes de identifi%adores entre as3as du3as 7< =8. -n%lusi&eI 3ode-se at %riar identifi%adores ini%iando %om %ara%teres numri%osX
CREATE DATABASE ABc; CREATE DATABASE 123tEste;

Liste os ?an%os de dados %omX


\l

p Letra <L= min[s%ula

Essa n/o uma ?oa 3r6ti%a e faz %om 4ue toda &ez 4ue for 3re%iso mani3ul6-losI de&er/o ser referen%iados tam?m entre as3asX
DROP DATABASE Abc; DROP DATABASE 123tEste;

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

7 - 8odelos de 9anco de Dados - Tem"lates


2 %omando b#REATE DATA)ASEb fun%iona %o3iando um ?an%o de dados e@istente. Por 3adr/oI ele %o3ia o ?an%o de dados de sistema %Mamado btem3late bI deste modo modelo 3ara %ria./o de outros ?an%o de dados. Se forem adi%ionados o?Eetos no btem3late bI esses o?Eetos ser/o %o3iados 3ara ?an%os %riados 3osteriormente. Por e@em3loI se for instalada uma linguagem 3ro%edural %omo a PLS3gSQL no btem3late bI estar6 automati%amente dis3onP&el em ?ases de dados %riadas 3osteriormente. >6 um outro ?an%o de dados 3adr/o do sistema %Mamado btem3late0b. Esse ?an%o %ontm os mesmos dados 4ue o %onte[do ini%ial de btem3late bI 4ue I a3enas os o?Eetos 3adr!es 3r definidos 3ela &ers/o do PostgreSQL. ] uma ?ase de dados imut6&el e 4ue n/o a%eita %one@!es. Quando se %ria um ?an%o %o3iando btem3late0b ao in&s de btem3late b %riado um ?an%o de dados b&irgemb 4ue n/o %ontm nada do 4ue foi adi%ionado a btem3late b. Sinta@eX
CREATE DATABASE nome_do_banco_de_dados TEMPLATE banco_modelo;

E@em3losX
/* Conexo ao banco padro template1 */ \c template1 /* Criao de uma simples tabela dentro de template1 */ CREATE TABLE tb_exemplo (campo int); /* Insero de valores na tabela criada dentro de template1 */ INSERT INTO tb_exemplo VALUES (1),(2),(3),(4),(5); /* Criao de um novo banco de dados */ CREATE DATABASE xyz; /* Conectando ao novo banco de dados */ \c xyz /* Visualizando a existncia de tabelas dentro do banco recm criado */ \d /* Consulta na tabela existente */ SELECT * FROM tb_exemplo;

A 3artir de agora todos os ?an%os no&os %riados no sistema ter/o a ta?ela tb_exemplo %om seus &alores 4ue foram inseridos dentro do ?an%o <tem3late =. #omo 3qde ser %om3ro&adoI ao se %riar o?Eetos dentro de template1I esses o?Eetos ser/o retransmitidos 3ara ?an%os de dados 4ue forem %riados 3osteriormente a n/o ser 4ue se 4ueira um outro ?an%o de dados %omo modeloI ou mesmo um ?an%o de dados &irgemI %omo no e@em3lo a seguirX
CREATE DATABASE novo_banco TEMPLATE template0;

2 ?an%o de dados %riado a%ima um ?an%o de dados <&irgem=I 3ois n/o M6 4ual4uer o?Eeto no mesmoI 3ois seu modelo foi o <tem3late0=. Se for 3re%iso %riar um no&o ?an%o de dados tomando outro %omo modelo tam?m 3osssP&elX
CRATE DATABASE curso2 TEMPLATE curso;

'0

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

Ao se %one%tar nesse ?an%o de dados 3oder6 ser %onstatado 4ue 3ossui os mesmos o?Eetos e registros 4ue seu modelo 7<%urso=8. Para 3rosseguir %om o a3rendizado do PostgreSQLI a3;s as de&idas &erifi%a.!es de resultados at a4ui a3resentados serem %om3ro&adasI re%omend6&el fazer uma <lim3eza= do 4ue foi feito 3ara fins de e@em3losX
/* Conectando novamente a template1 */ \c template1 /* Apagando a tabela criada */ DROP TABLE tb_exemplo; /* Apagando o banco criado */ DROP DATABASE xyz;

'

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

: - Ti"os de Dados
:.# - B&mricos
Bome smallint integer ?igint !lias int' -ntI int+ intD AaiPa -('10D at m('101 -' +1+D(0+D m' +1+D(0+1 -G''((1'0(0D,+11,D0D at mG''((1'0(0D,+11,D01 Sem limite 0 dPgitos de%imais de 3re%is/o , dPgitos 3re%is/o de%imais Taman1o ' ?Ctes at + ?Ctes D ?Ctes Descri./o integer de ' ?Ctes %om sinal integer de + ?Ctes %om sinal integer de D ?Ctes %om sinal

K numeri% d 73Is8 e real

de%imal73Is8 float+

&ari6&el + ?Ctes

n[mero e@ato %ustomiz6&el

%om

3re%is/o

3re%is/o [ni%a de 3onto flutuante 3re%is/o du3la de 3onto flutuante auto in%remento inteiro de + ?Ctes auto in%remento inteiro de D ?Ctes

dou?le 3re%ision floatD serial ?igserial serial+ serialD

de D ?Ctes + ?Ctes D ?Ctes

at ' +1+D(0+1 at G''((1'0(0D,+11,D01

K 3 _ 3re%is/oX 4uantidade de dPgitos 7antes do 3onto flutuante m de3ois do 3onto flutuante8 s _ es%alaX 4uantidade de dPgitos a3;s o 3onto flutuante :.#.# - 85scaras "ara formatos n&mricos
8odelo G 0 . 73onto8 PR S L D G 9PL SG R: dae T> ou tM 5 EEEE Descri./o &alor %om o n[mero es3e%ifi%ado de dPgitos &alor %om zeros Z es4uerda 3onto de%imal &alor negati&o entre n e a sinal 3reso ao n[mero 7utiliza o idioma8 sPm?olo da moeda 7utiliza o idioma8 3onto de%imal 7utiliza o idioma8 se3arador de gru3o 7utiliza o idioma8 sinal de menos na 3osi./o es3e%ifi%ada 7se n[mero n 08 sinal de mais na 3osi./o es3e%ifi%ada 7se n[mero a 08 sinal de maisSmenos na 3osi./o es3e%ifi%ada algarismos romanos 7entrada entre sufi@o de n[mero ordinal deslo%a o n[mero es3e%ifi%ado de dPgitos 7&eEa as notas so?re utiliza./o8 nota./o %ientPfi%a 7ainda n/o im3lementada8 e (GGG8

I 7&Prgula8 se3arador de gru3o 7milMares8

:otasX a. R: r roman numerals.

''

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

:.2 - De +aracteres
Bome %Mara%ter7n8 %Mara%ter &arCing7n8 te@t !lias %Mar7n8 &ar%Mar7n8 Descri./o tamanMo fi@o e n/o &ari6&el de %ara%teres tamanMo &ari6&el de %ara%teres %om limite tamanMo &ari6&el e sem limite

:.- - ?alor n&lo (n&ll, "m &alor nulo sim3lesmente um &alor n/o 3reen%Mido. :.2 - LNgico o& S9ooleanoT
Bome ?oolean !lias ?ool Descri./o logi%al )oolean 7trueSfalse8

Admite a3enas dois estados <true= ou <false=. "m ter%eiro estadoI <unWnoVn=I re3resentado 3elo &alor nulo 7null8. 5alores literais &6lidos 3ara o estado <true=X TRUEI tI trueI yI yesI 1. Para o estado <false=I os seguintes &alores 3odem ser usadosX FALSEI fI falseI nI noI 0. :.6 - Data e Jora
Bome date inter&al d 738 e time d 738 e d VitMout time zone e time d 738 e VitM time zone timestam3 d 738 e dVitMout time zone e timestam3 d 738 e VitM time zone timestam3tz timetz !lias Descri./o %alendar date 7CearI montMI daC8 inter&alo de tem3o Moras Moras fuso Mor6rio data e Moras Data e Moras %om fuso Mor6rio

Alguns ti3os de data e Mora a%eitam um &alor %om uma 3re%is/o <3= 4ue es3e%ifi%a a 4uantidade de dPgitos fra%ionais retidos no %am3o de segundos. Por e@em3loX Se um %am3o for es3e%ifi%ado %omo do ti3o inter&al7+8I se no mesmo for inserido um registro %om &alor <00X00X((.'(+(G=I o mesmo ter6 seu &alor arredondado 3ara <00X00X((.'(++=I de&ido Z %ustomiza./o da 3re%is/o 3ara + dPgitos. A fai@a de 3re%is/o a%eita de 0 a 0. Alm de todos os ti3os de dados a3resentados a4ui e@istem outrosI 3orm n/o s/o t/o usados. A &ariedade muito grande. Para maiores informa.!esI no 3s4l digite o %omandoX
\dT+

2?s.X 2 <m= 7mais8 nos %omandos do 3s4lI d6 mais informa.!es 4uando inserido ao final de um %omando.

'(

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

:.6.# - 85scaras de Data e Jora


Aormato >> >> ' >>'+ 9SS SSSS A9 ou P9 BBBB BB B )# ou AD 92:T> 99 DAB DD D DDD HH Descri./o >ora do dia 7De 0 a '8 >ora do dia 7De 0 a '8 >ora do dia 7De 00 a '(8 9inuto 7De 00 a ,G8 Segundo 7De 00 a ,G8 Segundo do dia 7De 0 a D0(GG8 9eridiano Ano 7+ dPgitos8 Ano 7' dPgitos8 Ano 7[ltimo dPgito8 Era :ome do mNs 9Ns 7De 0 a '8 :ome do dia da semana Dia do mNs 7De 0 a ( 8 Dia da semana 7De Dia do ano 7De Semana do ano 7De a 1Y Domingo _ 8 a ,(8 a (008

'+

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

; - $ tendo a4&da de comandos SQL dentro do "s%l


2 utilit6rio %liente do PostgreSQLI o 3s4lI dentre suas fun.!esI 3ossui um sistema de auto aEuda 3ara o usu6rio 3ara %omandos SQL. Para aEuda geralX
\h

S/o mostrados os %omandos SQL. 9as se 3or a%aso ne%essitar de uma e@3li%a./o maior so?re um determinado %omandoX
\h <comando> [opes]

E@em3losX
\h CREATE

S/o mostradas todas as formas do %omando SQL <#REATE=.


\h CREATE TABLE

E@i?e a3enas informa.!es de %ria./o de ta?elas.


\h CREATE DATABASE

E@i?e a3enas informa.!es de %ria./o de ?an%o de dados.

',

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

< - +oment5rios do PostgreSQL


Assim %omo os %omandos SQLI de&em terminar %om 3onto e &PrgulaI 3odem serX
CREATE DATABASE db_teste; --nica linha

ou
CREATE DATABASE db_teste; /* mltiplas linhas */

'0

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

#0 - +onectando-se a o&tro anco de dados dentro do "s%l


Estamos no ?an%o de dados <%urso= agoraI 3ara nos %one%tarmos ao ?an%o de dados <3ostgres=X
\c postgres

Para &oltar ao <%urso=X


\c curso

'1

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

## - +riando= 8odificando e !"agando $ 4etos


De a%ordo %om o tPtuloI temos res3e%ti&amente os seguintes %omandosX #REATEI ALTER e DR2P. 5eEamos agora alguns e@em3los dos mesmos %om o ti3o de o?Eeto DATA)ASE 7?an%o de dados8X
CREATE DATABASE db_teste; Banco de dados db_teste foi criado!; ALTER DATABASE db_teste RENAME TO db_teste2; /* Banco de dados db_teste foi alterado, seu novo nome agora db_teste2 */ ; DROP DATABASE db_teste2; Banco de dados db_teste2 foi apagado;

] im3ortante lem?rar 4ue 4uando o o?Eeto em 4uest/o est6 sendo a%essado no momentoI n/o se 3ode alter6-lo.

'D

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

#2 - Ta elas
] a estrutura %uEa fun./o guardar dados. Possui %olunas 7%am3os8 e linMas 7registros8. #ada %oluna tem sua estrutura da seguinte formaI na se4uNn%iaX nomeI ti3o e modifi%adores. #2.# - +ria./o de Ta elas
CREATE TABLE nome_tabela( nome_campo tipo_dado [DEFAULT expressao_padrao] [CONSTRAINT nome_restricao restricao], );

#2.2 - Ta elas tem"or5rias S/o ta?elas 4ue s; 3odem ser a%essadas diretamente 3elo usu6rio 4ue a %riou e na sess/o %orrente. Assim 4ue o usu6rio %riador da mesma se des%one%tar da sess/o em 4ue ela foi %riadaI a ta?ela tem3or6ria dei@ar6 de e@istir. A sinta@e de %ria./o igual Z de uma ta?ela normalI a3enas a%res%enta-se a 3ala&ra <TE9P2RARB= a3;s CREATEX
CREATE TEMPORARY TABLE tabela_tmp( );

#2.- - EPi indo ta elas criadas


\d

#2.2 - EPi indo a estr&t&ra de &ma ta ela


\d nome_da_tabela

#om detalMesX
\d+ nome_da_tabela

'G

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

#2.6 - !lterando Ta elas ss &ezes 3ode a%onte%er de a3;s termos %riado algumas ta?elasI Ma&er a ne%essidade de modifi%6las. 2 4uadro a?ai@o %ontm de maneira resumida e o?Eeti&a os meios 3ara se fazer as altera.!es de a%ordo %om o 4ue for 3re%isoX
ADD d #2L"9: e %oluna ti3o d restri./oL%oluna d ... e e restri./oLta?ela TBPE ti3o d "S-:G e@3ress/o e SET DE$A"LT e@3ress/o ALTER d #2L"9: e %oluna DR2P DE$A"LT k SET f DR2P l :2T :"LL SET STAT-ST-#S inteiro SET ST2RAGE k PLA-: f EFTER:AL f EFTE:DED f 9A-: l #L"STER 2: nomeLPndi%e DR2P d #2L"9: e %oluna d RESTR-#T f #AS#ADE e #2:STRA-:T nomeLrestri./o d RESTR-#T f #AS#ADE e TR-GGER d nomeLgatilMo f ALL f "SER e R"LE nomeLregraLrees%rita TR-GGER d nomeLgatilMo f ALL f "SER e ALTER TA)LE nomeLta?ela E:A)LE REPL-#A TR-GGER nomeLgatilMo ALHABS TR-GGER nomeLgatilMo R"LE nomeLregraLrees%rita REPL-#A R"LE nomeLregraLrees%rita ALHABS R"LE nomeLregraLrees%rita -:>ER-T ta?elaLan%estral :2 -:>ER-T ta?elaLan%estral 2H:ER T2 no&oLdono RE:A9E T2 no&oLnomeLdaLta?ela #2L"9: nomeLdaL%oluna T2 no&oLnomeLdaL%oluna

D-SA)LE

RESET 7 3arRmetroLarmazenamento dI ... e 8 H-T>2"T SET #L"STER 2-DS

7 3arRmetroLarmazenamento _ &alor dI ... e 8 TA)LESPA#E nomeLta?les3a%e S#>E9A nomeLes4uema

E@em3losX Antes e a3;s %ada %omando SQL a?ai@o dN o %omando <cd %ola?oradores= 3ara &erifi%ar as altera.!esX - Adi%ionando um no&o %am3oX
ALTER TABLE colaboradores ADD COLUMN nova_coluna int2;

- 9udando o ti3o de dados de um %am3oX


ALTER TABLE colaboradores ALTER nova_coluna TYPE numeric(7,2);

(0

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

- Alterando o nome de um %am3oX


ALTER TABLE colaboradores RENAME COLUMN nova_coluna TO ultima_coluna;

- Alterando o nome de uma ta?elaX


ALTER TABLE pedido RENAME TO pedidos;

- A3agando um %am3o de uma ta?elaX


ALTER TABLE colaboradores DROP COLUMN ultima_coluna;

#2.7 - !"agando &ma ta ela 2 %omando <DR2P=I %omo E6 foi men%ionadoI ser&e 3ra eliminar o?EetosI tais %omo uma ta?ela. 2 %omando mais sim3les 3ra se deletar umaX
DROP TABLE nome_da_tabela;

Se a mesma for referen%iada 3or outra ta?elaI n/o 3oder6 ser a3agada. A n/o ser 4ueX
DROP TABLE nome_da_tabela CASCADE;

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

#- - Ta les"aces
Ta?les3a%es no PostgreSQl 3ermitem a administradores de ?an%os de dados definirem onde os ar4ui&os fPsi%os 4ue re3resentam os o?Eetos do ?an%o de dados ser/o gra&ados. 2u seEaI 3ossP&el definir o diret;rio onde os o?Eetos ser/o armazenados. A3;s a %ria./o de um ta?les3a%eI o mesmo 3ode ser referen%iado 3elo nome ao %riar os o?Eetos 4ue ser/o gra&ados no lo%al deseEado. Sinta@eX
CREATE TABLESPACE nome [ OWNER usurio ] LOCATION 'diretrio';

E@em3losX Primeiro &amos %riar um diret;rio 3ara ser o ta?les3a%e 7%omo root8X
mkdir /tbs

Dando a 3ro3riedade do diret;rio 3ara o usu6rio 3ostgres e o gru3o de usu6rios 3ostgresX


chown -R postgres:postgres /tbs

#riando o ta?les3a%eX
CREATE TABLESPACE ts_tmp LOCATION '/tbs';

#riando uma ta?ela no ta?les3a%e <tsLtm3=X


CREATE TABLE tb_ts( cod serial PRIMARY KEY, nome varchar(15) ) TABLESPACE ts_tmp;

2?s.X :o diret;rio do %lusterI M6 um su?diret;rio %Mamado <3gLt?ls3%=I o 4ual %ontm linWs 4ue a3ontam 3ara o lo%al de %ada ta?les3a%e %riado.

('

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

#2 - Restri.>es (+onstraints,
S/o regras 4ue inserimos 3ara 4ue uma %oluna n/o re%e?a dados indeseEados. Por e@em3loX imagine uma ta?ela de 3rodutos 4ue tem dentre seus %am3os um 4ue se refere ao 3re.o. Se n/o for %olo%ada uma restri./oI ser/o a%eitos &alores negati&os 7n08. #2.# - Ti"os de Restri.>es

#2.#.# - +JE+U A mais genria das restri.!esI 3ermite es3e%ifi%ar 4ue &alorI em uma determinada %olunaI de&e satisfazer uma e@3ress/o ?ooleana. E@em3loX
CREATE TABLE produtos( cod_prod int2, preco numeric(7,2) CHECK(preco>0) );

:esse e@em3lo e&ita 4ue no %am3o <3re%o= seEa inserido 4ual4uer &alor 4ue n/o seEa maior 4ue zero. #2.#.2 - B$T BCLL $az %om 4ue a %oluna n/o a%eite &alores nulosI ou seEaI a 3artir do momento em 4ue for inserido um no&o registro a7s8 %oluna7s8 %om a restri./o :2T :"LL de&er6 re%e?er algum &alor. #2.#.- - CB3QCE Assegura 4ue todos os registrosI na %oluna es3e%ifi%ada n/o ter/o &alores re3etidos. #2.#.2 - PR38!RE UEE Tam?m %onMe%ida %omo +1ave Prim5ria. Seus &alores s/o [ni%os 7":-Q"E8 e n/o nulos 7:2T :"LL8I te%ni%amente 3odemos dizer 4ueX PR-9ARB AEB _ :2T :"LL m ":-Q"E Toda &ez 4ue %riamos uma %Ma&e 3rim6ria um Pndi%e 7-:DEF8 atri?uPdo 3ara a mesma. E@em3losX
CREATE TABLE produtos( cod_prod int2 UNIQUE NOT NULL, preco numeric(7,2) CHECK(preco>0) );

Tem o mesmo efeito deX


CREATE TABLE produtos( cod_prod int2 PRIMARY KEY, preco numeric(7,2) CHECK(preco>0) );

((

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

Pode tam?m ser da seguinte maneiraX


CREATE TABLE produtos( cod_prod int2, preco numeric(7,2) CHECK(preco>0), PRIMARY KEY(cod_prod) );

9ais estaX
CREATE TABLE produtos( cod_prod int2 CONSTRAINT pk_produtos PRIMARY KEY, preco numeric(7,2) CHECK(preco>0) );

E estaX
CREATE TABLE produtos( cod_prod int2, preco numeric(7,2) CHECK(preco>0), CONSTRAINT pk_produtos PRIMARY KEY(cod_prod) );

:estas duas [ltimas demos um nome Z %Ma&e 3rim6ria. #2.#.6 - A$RE3GB UEE Tam?m %onMe%ida %omo +1ave Estrangeira. Es3e%ifi%a 4ue os &alores em uma %oluna 7ou gru3o de %olunas8 de&e %orres3onder aos &alores 4ue est/o em um %am3o ou outra ta?ela. Quando entre ta?elas %Mamamos de integridade relacional entre ta elas. 2s &alores dos %am3os referen%iados de&em ser [ni%os.
"rod&tos %odL3roduto 73W 3WL3rodutos8 3re%o vendas %odL&endas 73W 3WL&endas8 3roduto 7fW 3WL3rodutos8

A%ima est6 re3resentado o rela%ionamento de <&endas= %om <3rodutos=I &eEamos %omo a ta?ela <&endas= foi %riadaX
CREATE TABLE vendas( cod_vendas int2 PRIMARY KEY, produto int2 REFERENCES produtos (cod_prod) );

2 %am3o <3roduto=I faz referNn%ia Z %Ma&e 3rim6ria da ta?ela <3rodutos=. Assim %omo a%onte%e %om %Ma&es 3rim6riasI tam?m 3odemos nomear %Ma&es estrangeirasX
CREATE TABLE vendas( cod_vendas int2 PRIMARY KEY, produto int2, CONSTRAINT fk_prod FOREIGN KEY (produto) REFERENCES produtos (cod_prod) );

(+

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

#2.#.7 - $ 8odificador SDEA!CLTT Quando uma estrutura de uma ta?ela %onstruPdaI 3ode se definir a determinados %am3osI %aso os mesmos n/o forem 3reen%Midos 7&alores nulos8I ter um &alor atri?uPdo automati%amente. 2u seEaI se nada for atri?uPdo a ele 3elo usu6rioI o sistema o far6X
CREATE TABLE tb_teste_default( nome varchar(15), uf char(2) DEFAULT 'SP' );

2 e@em3lo de %ria./o de ta?ela a%imaI mostra o %am3o <uf=I o 4ual se n/o for inserido algum &alorI o sistemaI 3or 3adr/o o 3reen%Mer6 %om o &alor <SP=.

(,

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

#6 - Descri./o de $ 4etos
Tam?m %onMe%ido %omo <#oment6rio de 2?Eetos=. E@em3lo de %omo se insere uma des%ri./o em uma ta?elaX
COMMENT ON TABLE colaboradores IS 'Funcionrios da empresa';

Para &isualizarX
\dt+ colaboradores

Para e@%luirX
COMMENT ON TABLE colaboradores IS NULL;

(0

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

#7 - $"eradores
$"eradorIElemento . XX de t fS ffS u K S T m -S -S:"LL :2T:"LL -: )ETHEE: 25ERLAPS L-AE -L-AE S-9-LAR n a _ na a_ n_ :2T A:D 2R ff \_ JJ JJK -S :"LL :2T :"LL Descri./oICso se3arador de nome de ta?elaS%oluna tC3e%ast estilo PostgreSQL sele./o de elemento de arraC menos un6rio e@3onen%ia./o raiz 4uadrada raiz %[?i%a &alor a?soluto multi3li%a./o di&is/o resto de di&is/o adi./o su?tra./o -S TR"EI -S $ALSEI -S ":A:2H:I -S :"LL teste 3ara nulo teste 3ara n/o nulo <em= <entre= so?re3osi./o de inter&alo de tem3o %om3ara./o de string case sensitive %om3ara./o de string case insensitive %om3ara./o de string 3or similaridade menor 4ue maior 4ue igualdadeI atri?ui./o diferente maior ou igual 4ue menor ou igual 4ue <:j2= l;gi%o <E= l;gi%o <2"= l;gi%o %on%atena strings

(1

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

#: - SELE+T - +ons&ltas (Q&eries,


#onsultar ou fazer uma <4uerC= em um ?an%o de dadosI 3ode ser sim3lesmente dito %omo selecionar os dados. "m sim3les SELE#TX
SELECT 5+2; ?column? ---------7 (1 registro)

Podemos melMorar um 3ou%oX


SELECT 5+2 AS "Resultado"; Resultado ---------7 (1 registro)

"ma o3era./o matem6ti%a 4ue retorna o &alor a?soluto 7n/o negati&o8I usando o o3erador <u=X
SELECT @ 3-10 AS "Resultado"; Resultado ---------7 (1 registro)

2 3arRmetro <AS= usado 3ara dar um r;tulo Z %olunaI na ausNn%ia dele usado o nome do %am3o da ta?ela. :o %aso a%imaI o resultado e@i?ido n/o foi retirado de uma ta?ela e sim de uma sim3les o3era./o matem6ti%a. $oram inseridas as as3as 3ara 4ue a 3ala&ra <Resultado= n/o a3are%esse a3enas %om letras min[s%ulas. Geralmente 3u@amos dados de ta?elas e a forma mais sim3les 3ra isso a seguinteX
SELECT campoX,campoY,...,campoN FROM nome_da_tabela;

Em nosso ?an%o de dados de e@em3loI M6 uma ta?ela %Mamada <%ola?oradores=. 5amos fazer uma 4uerC sele%ionando todos os dados da mesmaX
SELECT * FROM colaboradores;

2?ti&emos ent/o todos os registros de todos os %am3os. :o %omando a%ima o asteris%o <K= re3resenta todos os %am3os da ta?ela. Agora &amos somente sele%ionar alguns %am3osX
SELECT nome,snome FROM colaboradores;

Dessa &ez sele%ionamos a3enas os %am3os nome e snome. 9odifi%ando um 3ou%o o %omandoX
SELECT nome||' '||snome AS "Nome completo" FROM colaboradores;

(D

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

#om o uso o3erador de %on%atena./o de stringsI o 3i3e du3lo <ff=I Euntamos os &alores de duas %olunas em uma s; inter%alados %om um es3a.o 7um es3a.o entre as as3as sim3les8. Podemos misturar %on%atena.!es tam?mX
SELECT nome||' '||snome AS "Nome completo", cidade||' - '||uf AS "Cidade - UF" FROM colaboradores;

$azer o3era.!es matem6ti%as %om os &alores dos %am3os um re%urso interessante tam?m. Su3onMamos 4ue 3re%iso %al%ular o &alor do 5ale Trans3orte 74ue de 0T do sal6rio83ara %ada em3regadoX
SELECT nome||' '||snome AS "Nome completo", salario*0.06 AS "Vale Transporte" FROM colaboradores;

Se for ne%ess6rio sa?er 4uais s/o as %idades 4ue se en%ontram na ta?elaI de forma 4ue n/o MaEa re3eti./oX
SELECT DISTINCT cidade FROM colaboradores;

A 3ala&ra %Ma&e <D-ST-:#T= faz %om 4ue seEa e@i?ida a3enas uma o%orrNn%ia dos &alores da ta?ela sele%ionada. 9as 3ossP&el fazer a distin./o a&aliando mais de um %am3oX
SELECT DISTINCT cidade,uf FROM colaboradores;

Se ti&er %idades %om nomes iguaisI mas de diferentes estadosI as duas seriam %onstadasI o %am3o <uf= seria o diferen%ial. 2 re%urso de 3agina./o muito [til 4uando n/o 4ueremos &er todos os resultados. Se for o3tado 3or e@i?ir a3enas os 1 3rimeiros registrosX
SELECT * FROM colaboradores LIMIT 7;

2u ainda e@i?ir 3or fai@a de registros. Do d%imo 3rimeiro ao d%imo stimoI 3or e@em3loX
SELECT * from colaboradores LIMIT 7 OFFSET 10;

"ma tradu./o 3ara a 4uerC a%imaX sele%ionar todos os %am3os da ta?ela <%ola?oradores=I limitando a e@i?i./o a 1 registros e dis3ensando os 0 3rimeiros. Sem limitesI mas <%ortando= os 0 3rimeirosX
SELECT * from colaboradores OFFSET 6;

#:.# - $ +omando T!9LE 2 %omando TA)LE tem o mesmo efeito 4ue SELE#T K $R29I ou seEaX
TABLE

_ SELECT

* FROM

LogoI se fizermosX
TABLE colaboradores;

a mesma %oisa 4ueX

(G

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

SELECT * FROM colaboradores;

#:.2 - SELE+T sem AR$8 >6 uma forma de se fazer %onsultas usando o SELE#T sem o $R29 da seguinte formaX
SELECT tabela.coluna;

E@em3loX
SELECT colaboradores.*;

Erro\ Para 4ue a omiss/o da 3ala&ra <$R29= dN %erto ne%ess6rio Ma?ilitar. >6 duas formasX Por se./oX
SET add_missing_from TO ON;

De forma definiti&aX Edite o ar4ui&o 3ostgres4l.%onf 7/etc/postgresql/8.4/main/postgresql.conf8 e mude a linMaX


`addLmissingLfrom _ off

3ara
addLmissingLfrom _ on

E 3or fim mande o ser&i.o %arregar as no&as %onfigura.!esX


/etc/init.d/postgresql reload

:/o 3re%iso reini%iar 7restart8 #:.- - T)"e +asts $az uma %on&ers/o de um ti3o de dado 3ara outroX
CAST ( expresso AS tipo )

ou
expresso::tipo E@em3losX SELECT CAST (('7'||'0') AS int2)+7 AS "Resultado"; SELECT (('7'||'0')::int2)+7 AS "Resultado";

2?s.X CAST est6 %onforme o 3adr/o SQL e o o3erador <XX= 3r;3rio do PostgreSQL.

+0

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

#:.2 - +ase - Cm S3AT disfar.ado

2 %omando CASEI 3ara 4uem %onMe%e linguagens de 3rograma./oI 3ode ser %om3arado ao <-$=. Ao in&s de usarmos a se4uNn%ia <-$I T>E:I ELSE<I usamos <CASEI WHENI THENI ELSE= e finalizamos %om um <END=.
SELECT nome||' '||snome AS "Nome Completo", CASE uf WHEN 'SP' THEN 'So Paulo' WHEN 'MG' THEN 'Minas Gerais' ELSE 'Rio de Janeiro' END AS "Origem" FROM colaboradores;

#aso uf for igual a SPY retorna So


Janeiro.

PauloI

igual a MGY retorna Minas

GeraisI

sen/oY retorna Rio

de

#:.6 - +$!LES+E Em %ertas situa.!esI 4uando M6 &alores nulos em uma ta?ela ne%ess6rio 3reen%MN-los 3ro&isoriamente %om algum &alor. 2 %omando COALESCE faz essa fun./o. #omo e@em3loI a ta?ela <%ola?oradores= ser6 usada. A mesma n/o tem &alores nulos. 2 %omando INSERT ser6 e@3li%ado mais adianteI mas 3or Mora nos ser6 [tilX
INSERT INTO colaboradores (mat_id,nome,snome) VALUES (00020,'Z','Ningum');

Quando for feita uma 4uerC na ta?elaI %onstar6 a3enas &alores 3ara os %am3os e uf.

mat_idI nomeI snome

2s o?ser&adores mais atentos notar/o 4ue no INSERT n/o %onsta uma referNn%ia ao %am3o ufI no entantoI se olMarmos o ane@o 4ue %ontm todo o %;digo SQL de %omo foi feita a estrutura da ta?elaI &er6 4ue M6 um &alor 3adr/o DEFAULT asso%iado. "ma 4uerC na ta?ela <%ola?oradores=I mostra 4ue o [ltimo registro agora tem &alores nulos. Para e@em3loI um dos %am3os nulos ser6 usado %om o %omando <#2ALES#E=I o %am3o <setor=X
SELECT nome,snome,COALESCE(setor,'inexistente') as setor FROM colaboradores;

#:.7 - BCLL3A ] uma fun./o 4ue retorna um &alor nulo se o 3rimeiro &alor for igual ao segundo &alorI %aso %ontr6rio retornar6 o 3rimeiro &alor. -sso 3ode ser usado 3ara fazer a o3era./o in&ersa de #2ALES#EX E@em3losX
SELECT SELECT SELECT SELECT NULLIF(1,1); NULLIF(7,7); NULLIF(9,1); NULLIF(3,3); --Retorna --Retorna --Retorna --Retorna Null Null 9 Null

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

#:.: - GRE!TEST e LE!ST As fun.!es GREATEST e LEAST sele%ionam res3e%ti&amente o maior ou menor &alor de uma lista de 4ual4uer n[mero de e@3ress!es. As e@3ress!es de&em ser todas %om3atP&eis %om o ti3o de dados %omumI 4ue ser6 o ti3o de resultado. 5alores nulos na lista ser/o ignorados. 2 resultado ser6 nulo a3enas se todas as e@3ress!es a&aliadas forem tam?m nulas. Essas fun.!es n/o fazem do 3adr/o SQLI mas s/o uma e@tens/o %omum. Alguns outros ?an%os de dados far/o o retorno nulo se 4ual4uer argumento for nuloI ao in&s de somente 4uanto todos forem nulos. E@em3losX
SELECT SELECT SELECT SELECT GREATEST(2,1,-9,55,20); --Retorna 55 LEAST(2,1,-9,55,20); --Retorna -9 GREATEST(NULL,5); --Retorna 5 LEAST(NULL,3); --Retorna 5

#:.; - +on4&ntos Relem?rando a teoria de %onEuntos de matem6ti%aX

2s dois %onEuntos re3resentamI res3e%ti&amente as ta?elas ta?Lmult' e ta?Lmult(. :o PostgreSQL fun%ionam de a%ordo %om a %orres3ondNn%ia ou n/o de %olunas sele%ionadas entre uma ta?ela e outra. 2s %omandos a?ai@o %riar/o as ta?elas %itadas e as 3reen%Mer/oX
CREATE TEMP TABLE tab_mult2( valor int2 ); CREATE TEMP TABLE tab_mult3( valor int2 ); INSERT INTO tab_mult2 VALUES (2),(4),(6),(8),(10),(12); INSERT INTO tab_mult3 VALUES (3),(6),(9),(12),(15);

+'

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

#:.;.# - AaDendo o"era.>es de con4&nto Temos "ni/o 7UNION8I -nterse%./o 7INTERSECT8 e E@%e./o 7EXCEPT8.

#:.;.#.# - CB3$B ] a uni/o de todos os &alores das %olunas das ta?elas en&ol&idas. Por 3adr/o %ada &alor e@i?ido somente uma &ezI mas se for usado o 3arRmetro <ALL=I &alores 4ue e@istem em mais de uma ta?ela e@i?ido de a%ordo %om a o%orrNn%ia.
SELECT campo1,campo2,...,campoN FROM tabelaX UNION [ALL] SELECT campo1,campo2,...,campoN FROM tabelaY;

E@em3loX
SELECT valor FROM tab_mult2 UNION SELECT valor FROM tab_mult3;

#:.;.#.2 - 3BTERSE+T S; retorna &alores em %omum entre as ta?elasX


SELECT valor FROM tab_mult2 INTERSECT SELECT valor FROM tab_mult3;

#:.;.#.- - EG+EPT ] a diferen.a da ta?ela da es4uerda menos a da direitaX


SELECT valor FROM tab_mult2 EXCEPT SELECT valor FROM tab_mult3;

S; foram retornados os &alores 4ue s; e@istem em <ta?Lmult'=.

+(

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

#:.< - EP"ress>es Reg&lares Tem grande utilidade em o3era.!es 4ue re4uerem mani3ula./o %om3le@a de strings.
$"erador J JK \J \JK t v de d-e td-e f SintaPe J ostringo JK ostringo \J ostringo \JK ostringo J otstringo J ostringvo J d@Cze J d0-,e J tda-ze string fstring' Retorna a string e@ata Retorna a string de modo insensiti&e Retorna o 4ue n/o for a string e@ata Retorna o 4ue n/o for a string e@ata de modo insensiti&e Retorna o 4ue %ome.a %om a string Retorna o 4ue a%a?a %om a string Retorna o 4ue %onti&er algum dos %ara%teres de%larados entre os %ol%Metes Retorna o 4ue %onti&er o inter&alo de %ara%teres 4ue se3arado 3elo MPfen Retorna o 4ue %ome.a %om o algum dos %ara%teres do inter&alo Retorna se alguma das strings %oin%ide Descri./o

E@em3losX
SELECT * from colaboradores where nome ~ 'Chiquinho'; /* Procura pelo nome Chiquinho */; SELECT * from colaboradores where nome ~* 'chiquinho'; /* Procura pelo nome chiquinho (insensitive) */; SELECT * from colaboradores where uf !~ 'SP'; /* Retorna o que no tem SP em uf */;

#:.#0 - @JERE A %l6usula H>ERE usada 3ara fazer filtragem nas %onsultas. A 3ala&ra <VMere= traduzida signifi%a <onde=. :a linguagem SQL ela 3ode ser inter3retada %omo 3or e@em3lo <sele%ionar as %olunas de uma determinada ta?elaI onde atenda a esta7s8 %ondi./o7!es8X n%ondi./o7!es8a=. Para determinar uma %ondi./o usamos o3eradoresI e@em3losX Sele%ionar todos os %am3os da ta?ela %ola?oradoresI onde o setor <9arWeting= e 4ue n/o seEa do estado de SPX
SELECT * FROM colaboradores WHERE setor='Marketing' AND uf!='SP';

)us%ar dentre os registros a4ueles em 4ue o %am3o <%argo= n/o foi 3reen%MidoX
SELECT * FROM colaboradores WHERE cargo IS NULL;

++

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

#:.#0.# - $R= !BD= 3B= agr&"amento de com"ara.>es e 9ET@EEB E@em3losX #onsultar os %ola?oradores 4ue s/o do setor de <9arWeting= o& de <Pu?li%idade=X
SELECT * FROM colaboradores WHERE setor = 'Marketing' OR setor = 'Publicidade';

2 %omando a%ima n/o fi%ou de uma forma inteligente e eleganteI soou re3etiti&o. Podemos melMorar isso %om o o3erador INX
SELECT * FROM colaboradores WHERE setor IN ('Marketing','Publicidade');

Des%o?rir 4uem tem o %argo de diretor e de SP e do setor de <9arWeting=X


SELECT * FROM colaboradores WHERE cargo = 'Diretor' AND uf = 'SP' AND setor = 'Marketing';

2 %omando anterior outro e@em3lo 4ue 3odemos melMorar a sinta@eI atra&s do agr&"amento de com"ara.>esI em %asos 4ue o o3erador o mesmo 7no %aso e@3ostoI de igualdade8I em 4ue de um lado se %olo%am os %am3os e no outro seus res3e%ti&os &aloresX
SELECT * FROM colaboradores WHERE (cargo,uf,setor) = ('Diretor','SP','Marketing');

#omo fazer uma %onsulta 3or fai@a salarialw Quem ganMa entre Rv 000I00 e Rv '000I00w
SELECT * from colaboradores WHERE salario BETWEEN 1000 AND 2000;

2 %omando a%ima o e4ui&alente aX


SELECT * from colaboradores WHERE salario >=1000 AND salario<=2000;

:o entantoI usando BETWEEN mais f6%il de se entender e de3endendo do %aso 3ode e%onomizar digita./o de forma inteligente. #:.#0.2 - $ $"erador L3UE o& VV Tanto faz usar a 3ala&ra <L-AE= ou <JJ=I 3ois o efeito ser6 o mesmo. A finalidade fazer %onsultas case sensitive tomando %omo ?ase uma string ou 3arte dela atra&s de %ara%teres %uringasX
SHm olo T L cc A&n./o Por%entagemX sim?oliza umI &6rios ou nenMum %ara%tere na 3osi./o. "nderlineX sim?oliza um [n%io %ara%tere na 3osi./o. )arra in&ertida du3laX Es%a3eI faz %om 4ue se inter3rete literalmente os %ara%teres <T= e <L=.

E@em3losX )us%ar %ola?oradores 4ue seu nome ini%ia %om a letra <A=X
SELECT * FROM colaboradores WHERE nome ~~ 'A%';

Sele%ionar %ola?oradores 4ue a segunda letra de seu nome <a=X


SELECT * FROM colaboradores WHERE nome LIKE '_a%';

+,

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

#:.#0.- - $ $"erador 3L3UE o& VVW Sua [ni%a diferen.a %om o L-AE o fato de ser case insensitiveI ou seEaI n/o %onsidera letras mai[s%ulas ou min[s%ulas. PortantoI %omo e@em3losI 3odem ser tomados os do L-AEI s; 4ueI logi%amenteI tro%ando as 3ala&ras <L-AE= 3or <-L-AE= e in&ertendo na string da %ondi./o mai[s%ulas 3or min[s%ulas e &i%e-&ersa. #:.#0.2 - S383L!R T$ Re%urso 3are%ido %om o o3erador L-AEI 3orm 3ossui mais re%ursos de 3es4uisa de strings atra&s do uso de %ara%teres %uringa.
+&ringa T dA-Je dFBxe dtFBxe f ff L Descri./o S/o os mesmos %uringas usados no L-AE. Qual4uer %ara%tere entre <A= e <J= na 3osi./o <F=I <B= ou <x= na 3osi./o Qual4uer %ara%tereI e@%eto <F=I <B= ou <x= 23erador 2R #on%atena./o

E@em3losX Todos os nomes de %ola?oradores 4ue a segunda letra uma &ogal sem a%entua./oX
SELECT * FROM colaboradores WHERE nome SIMILAR TO '_[aeiou]%';

Todos os nomes de %ola?oradores 4ue a segunda letra n/o uma &ogal sem a%entua./oX
SELECT * FROM colaboradores WHERE nome SIMILAR TO '_[^aeiou]%';

)us%a de registros %uEa uf n/o seEa <SP= ou <9G=X


SELECT * FROM colaboradores WHERE uf NOT SIMILAR TO '(SP|MG)';

:omes %uEa 3rimeira letra de <S= Z <x=X


SELECT * FROM colaboradores WHERE nome SIMILAR TO '[S-Z]%';

#:.#0.6 - $ o"erador 3S BCLL 5alores nulos signifi%am n/o 3reen%Mimento. 9uitas &ezesI e4ui&o%adamente 3ara fazer uma %onsulta em 4ue se ?us%am &alores nulos usa-se o sinal de igualdade <_=. Ao in&s dissoI o %orreto usar o3erador ISX E@em3losX $azer uma %onsulta 3ara a%Mar registros onde o %am3o <%argo= n/o foi 3reen%MidoX $orma erradaX
SELECT * FROM colaboradores WHERE cargo = NULL;

+0

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

$orma %orretaX
SELECT * FROM colaboradores WHERE cargo IS NULL;

#:.#0.7 - $ o"erador B$T Signifi%a nega./o de algo. E@em3loX $iltrando resultados sem &alores nulos em <%argo=X
SELECT * FROM colaboradores WHERE cargo IS NULL;

#:.## - ! +l5&s&la $RDER 9E Quando feita uma %onsulta sem se es3e%ifi%ar um %ritrio de ordena./oI os registros s/o e@i?idos 3or ordem de inser./o ou atualiza./o. Atra&s da %l6usula ORDER BY ordena-se %onsultas de a%ordo %om os &alores de uma determinada %oluna. E@em3losX #onsultar todos os fun%ion6rios ordenando 3ela data de admiss/o 7 campo
SELECT * FROM colaboradores ORDER BY dt_admis; dt_admis8X

Por 3adr/o %onsultas %om a %l6usula ORDER BY s/o e@i?idas em ordem as%endente 7ASC8. 2 %omando anterior tam?m 3oderia ser dado desta maneiraI es3e%ifi%ando 4ue a ordem %res%enteX
SELECT * FROM colaboradores ORDER BY dt_admis ASC;

2u %olo%ar em ordem de%res%ente 7DESC8X


SELECT * FROM colaboradores ORDER BY dt_admis DESC;

] 3ossP&el tam?m es3e%ifi%armos mais de uma %oluna e ti3os de ordem diferentes 3ra %adaI %omo 3or e@em3lo %onsultar 3rimeiramente 3ela data de admiss/o de%res%ente e nome %res%enteX
SELECT * FROM colaboradores ORDER BY dt_admis DESC, nome ASC ;

Ao in&s dos nomes das %olunas 3odemos usar a %lassifi%a./o 3osi%ional. Le&ando-se em %onta 4ue os %am3os s/o numerados da es4uerda 3ra direita e ini%iando 3or I temos nome=2 e snome=3. "ma %onsulta le&ando-se em %onta 3rimeiro o so?renome 7snome8 e de3ois o nomeX
SELECT * FROM colaboradores ORDER BY 3,2;

#lassifi%ando 3or a3elido de %olunaX


SELECT nome||' '||snome AS "Nome Completo",setor,cidade||' - '||uf AS "Localidade" FROM colaboradores ORDER BY "Nome Completo";

+1

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

"sando %olunas in&isP&eis... #olunas in&isP&eis s/o assim %Mamadas a4uelas 4ue s/o usadas %omo %ritrio de %lassifi%a./oI mas n/o a3are%em no resultadoX
SELECT nome||' '||snome AS "Nome Completo",setor,cidade||' - '||uf AS "Localidade" FROM colaboradores ORDER BY dt_admis DESC;

A %oluna dt_admis n/o a3are%e no resultado. #:.#2 - SELE+T 3BT$ #ria uma no&a ta?ela %om os resultados da %onsulta. Diferente de um SELECT %on&en%ionalI os resultados n/o s/o mostrados e sim inseridos na no&a ta?ela. E@em3loX #riar uma ta?ela idNnti%a Z ta?ela <%ola?oradores=I a3enas 4uando
uf = SPX

SELECT * INTO colaboradores_sp FROM colaboradores WHERE uf='SP';

A3;s uma ta?ela ser %riada no PostgreSQLI n/o se 3ode mais alterar a ordem das %olunas %om o %omando ALTER TABLE. "ma solu./o 3ara isso usar o SELECT INTO 3ara %riar uma no&a ta?elaI %om os mesmos dados da antigaI a3agar a ta?ela %uEa ordem n/o interessante e renomear a no&a ta?ela 3ara o nome da antiga. :a ta?ela colaboradores I a %oluna cargo &em antes de setorI ent/o &amos tro%6-las de lugarX
SELECT mat_id,nome,snome,setor,cargo,uf,cidade,salario,dt_admis INTO colaboradores_tmp FROM colaboradores; Nova tabela criada, na ordem de colunas desejada; DROP TABLE colaboradores; Tabela antiga apagada; ALTER TABLE colaboradores_tmp RENAME TO colaboradores; Tabela nova renomeada;

#:.#- - +RE!TE T!9LE !S Assim %omo SELECT E@em3loX


CREATE TABLE diretores AS SELECT * FROM colaboradores WHERE cargo='Diretor'; --Nova tabela diretores criada a partir de uma consulta em colaboradores; INTOI

tam?m %ria uma no&a ta?ela %om os resultados da %onsulta.

#:.#2 - Selecionando dados de diferentes ta elas #:.#2.# - !liases de Ta elas (a"elidos de ta elas, Ao usarmos mais de uma ta?ela em uma %onsulta 3ode Ma&er nomes de %olunas idNnti%os nas ta?elas en&ol&idas. Tal in%on&eniente 3ode ser resol&ido %olo%ando o nome da ta?ela e um 3onto antes do nome da %oluna. :o entantoI muitas &ezes isso 3ode se tornar um tanto %ansati&o de&ido ao fato de se digitar %oisas a mais.

+D

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

"ma saPda 3ra isso usar um a3elido 3ara a ta?ela antes do 3onto e do nome da %oluna e dizer a 4uem 3erten%e o a3elidoX Pose se usar <AS=X
SELECT c.nome||' '||c.snome AS "Funcionrio contemplado",p.premio_id AS "Prmio" FROM colaboradores AS c, funcionarios_premiados AS p WHERE c.mat_id = p.mat_id;

2u omitir <AS=X
SELECT c.nome||' '||c.snome AS "Funcionrio contemplado",p.premio_id AS "Prmio" FROM colaboradores c, funcionarios_premiados p WHERE c.mat_id = p.mat_id;

#:.#2.2 - Xoins Em 3ortuguNsI Eun./oI uma J2-: re[ne registros de ta?elas diferentes em uma mesma %onsulta. #:.#2.2.# - Ti"os de Xoins #:.#2.2.#.# - +R$SS X$3B (X&n./o cr&Dada, Retorna uma %onEunto de informa.!es o 4ual resultante de todas as %om?ina.!es 3ossP&eis entre os registros das ta?elas en&ol&idasX
SELECT c.nome||' '||c.snome AS "Funcionrio contemplado",p.premio_id AS "Prmio" FROM colaboradores c CROSS JOIN funcionarios_premiados p;

#:.#2.2.#.2 - B!TCR!L X$3B (X&n./o nat&ral, $az a Eun./o tomando %omo ?ase as %olunas de mesmo nome nas ta?elas en&ol&idasX
SELECT c.nome||' '||c.snome AS "Funcionrio contemplado",p.premio_id AS "Prmio" FROM funcionarios_premiados p NATURAL JOIN colaboradores c;

#:.#2.2.#.- - 3BBER X$3B (X&n./o interna, Retorna as informa.!es a3enas de a%ordo %om as linMas 4ue o?ede.am as defini.!es de rela%ionamento. E@iste uma liga./o l;gi%a 3ara se fazer a Eun./oX
SELECT c.nome||' '||c.snome AS "Funcionrio contemplado",p.premio_id AS "Prmio" FROM funcionarios_premiados p INNER JOIN colaboradores c ON c.mat_id = p.mat_id; SELECT c.nome||' '||c.snome AS "Funcionrio contemplado",p.premio_id AS "Prmio" FROM funcionarios_premiados p INNER JOIN colaboradores c USING (mat_id);

+G

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

#:.#2.2.#.2 - $CTER X$3B (X&n./o ePterna, Assim %omo na INNER JOINI e@iste uma liga./o l;gi%aI mas n/o retorna a3enas as informa.!es 4ue satisfa.am a regra da Eun./o. OUTER JOINs 3odem ser dos ti3osX LE$T 2"TER J2-:X retorna todos os registros da ta?ela Z es4uerdaY R-G>T 2"TER J2-:X retorna todos os registros da ta?ela Z direitaY $"LL 2"TER J2-:X retorna todos os registros de am?os os lados. 2?s.X ] de uso o3%ional a 3ala&ra OUTER.
/* LEFT OUTER JOIN */; SELECT c.nome||' '||c.snome AS "Funcionrio contemplado",p.premio_id AS "Prmio" FROM funcionarios_premiados p LEFT OUTER JOIN colaboradores c USING (mat_id); SELECT c.nome||' '||c.snome AS "Funcionrio contemplado",p.premio_id AS "Prmio" FROM funcionarios_premiados p LEFT OUTER JOIN colaboradores c ON c.mat_id = p.mat_id; /* RIGHT OUTER JOIN */; SELECT c.nome||' '||c.snome AS "Funcionrio contemplado",p.premio_id AS "Prmio" FROM funcionarios_premiados p RIGHT OUTER JOIN colaboradores c USING (mat_id); SELECT c.nome||' '||c.snome AS "Funcionrio contemplado",p.premio_id AS "Prmio" FROM funcionarios_premiados p RIGHT OUTER JOIN colaboradores c ON c.mat_id = p.mat_id; /* FULL OUTER JOIN */; SELECT c.nome||' '||c.snome AS "Funcionrio contemplado",p.premio_id AS "Prmio" FROM funcionarios_premiados p FULL OUTER JOIN colaboradores c USING (mat_id); SELECT c.nome||' '||c.snome AS "Funcionrio contemplado",p.premio_id AS "Prmio" FROM funcionarios_premiados p FULL OUTER JOIN colaboradores c ON c.mat_id = p.mat_id;

#:.#2.2.#.6 - SELA X$3B :em sem3re J2-:s s/o usadas 3ara unir dados de duas ou mais ta?elas. >6 um %aso es3e%ial 4ue se faz uma auto Eun./o. 2u seEaI feita uma Eun./o de uma ta?ela %onsigo mesma. Para e&itar %onflitosI usa-se aliases. E@em3loX Des%o?rir o nome e so?renome do %Mefe direto de %ada fun%ion6rioX
SELECT c2.nome||' '||c2.snome AS "Colaborador",c1.nome||' '||c1.snome AS "Chefe Direto" FROM colaboradores AS c1 JOIN colaboradores c2 ON (c1.mat_id = c2.chefe_direto);

,0

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

#:.#2.- - S& -cons&ltas Tam?m %onMe%idas %omo subquerriesI s/o SELE#Ts em?utidos dentro de outro SELE#T tNm 3or finalidade fle@i?ilizar %onsultas. Esse re%urso est6 dis3onP&el no PostgreSQL desde a &ers/o 0.(. #:.#2.-.# - S& -cons&lta no @JERE
SELECT nome,snome,salario FROM colaboradores WHERE salario=(SELECT min(salario) FROM colaboradores);

#:.#2.-.2 - S& -cons&lta no SELE+T


SELECT nome,snome,salario-(SELECT salario*0.06) AS "salario bruto" FROM colaboradores WHERE salario < 3000;

#:.#2.-.- - S& -cons&lta no AR$8 Su?%onsultas no $R29 re4uerem um aliasX


SELECT * FROM (SELECT * FROM colaboradores WHERE cidade='So Paulo') AS colab_cid_sp;

#:.#2.-.2 - EG3STS Se a su?-%onsulta 4ue ele ante%ede retornar 3elo menos uma linMa seu resultado < true=X E@em3losX $or.ando um retorno &erdadeiroX
SELECT nome,snome,salario FROM colaboradores WHERE EXISTS (SELECT * FROM colaboradores WHERE salario<9000); Forando um retorno falso: SELECT nome,snome,salario FROM colaboradores WHERE EXISTS (SELECT * FROM colaboradores WHERE salario=9000);

#:.#2.-.6 - 3B e B$T 3B Retorna &erdadeiro 3ara os &alores 4ue %asem %om o re4uisito. E@em3loX 9ostrar todos os %ola?oradores 4ue n/o tNm o sal6rio m6@imoX
SELECT nome,snome,salario FROM colaboradores WHERE salario NOT IN (SELECT max(salario) FROM colaboradores);

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

#:.#2.-.7 - !BE o& S$8E Tanto faz es%re&er um ou outroI 3ois o efeito o mesmo. Retorna &erdadeiro 3ara 4ual4uer &alor da su?-%onsulta 4ue satisfa.a a %ondi./oX E@em3loX Retornar a3enas os sal6rios 4ue esti&erem entre Rv '000I00 e Rv ,000I00X
SELECT nome,snome,salario FROM colaboradores WHERE salario = SOME (SELECT salario FROM colaboradores WHERE salario BETWEEN 2000 AND 5000);

#:.#2.-.: - !LL Retorna somente se todos &alores %asarem %om a su?-%onsulta. E@em3loX Retornar todos os sal6rios 4ue esti&erem fora da fai@a Rv '000I00 a Rv ,000I00X
SELECT nome,snome,salario FROM colaboradores WHERE salario!=ALL (SELECT salario FROM colaboradores WHERE salario BETWEEN 2000 AND 5000);

,'

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

#; - ?3E@
5ieV 7ou &is/o8 uma %onsulta armazenadaI a 4ual a%essada %omo uma ta?ela &irtual. "sa-se &is!es 3ara fa%ilitar o geren%iamento e dei@ar o design do ?an%o de dados %om um as3e%to melMor e assim en%a3sulando os detalMes estruturais de ta?elas. #omo o 3r;3rio nome dizI uma &is/o a3enas e@i?e informa.!esI nela n/o s/o inseridos dados. Pode-se in%lusi&e %onstruir &ieVs ?aseando-se em outras &ieVs. E@em3loX
CREATE OR REPLACE VIEW vw_teste AS SELECT * FROM colaboradores WHERE uf='SP' AND nome ~* '^c';

,(

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

#< - Es%&emas (Sc1emas,


] uma forma de organizar o?Eetos dentro de um ?an%o de dadosI 3ermitindo um mesmo ti3o de o?Eeto seEa %riado mais de uma &ez %om nome igualI mas em es4uemas diferentes. Por 3adr/oI 4uando %riamos o?EetosI os mesmos 3erten%em ao es4uema 3[?li%o 73u?li%8. Sendo assim 4uando fazemos uma %onsultaI n/o 3re%isamos es3e%ifi%ar o es4uemaX
SELECT * FROM colaboradores;

-sto tam?m 3roduz o mesmo resultado at ent/oX


SELECT * FROM public.colaboradores; esquema.nome_do_objeto

Para um melMor entendimentoI %riaremos um es4uema %Mamado 3araleloX


CREATE SCHEMA paralelo;

#riando um o?Eeto dentro do no&o es4uemaX


CREATE TABLE paralelo.tabela_teste( campo1 int, campo2 int ); CREATE tipo_de_objeto nome_do_esquema.nome_do_objeto ;

A%essando dados de uma ta?ela %riada em um determinado es4uemaX


SELECT * FROM paralelo.tabela_teste;

Listando todas as ta?elas dentro do es4uema 3araleloX


\dt paralelo.*

2?s.X -sso &ale 3ra outros ti3os de o?EetosI ?asta tro%ar o <t= 3ela letra %orres3ondente ao ti3o de o?EetoI %onforme 3ode ser %onferido na aEuda de %omandos internos do 3s4l 7cw8. Alterando o es4uema de uma ta?elaX
ALTER TABLE colaboradores SET schema paralelo;

#omo a ta?ela %ola?oradores fazia 3arte do es4uema 3[?li%oI o mesmo n/o 3re%isou ser men%ionadoI mas 3ara fazN-la &oltar 3ara o es4uema 3[?li%o ser6 3re%iso men%ionar o es4uemaX
ALTER TABLE paralelo.colaboradores SET schema public;

,+

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

20 - A&n.>es
2 PostgreSQL forne%e um grande n[mero de fun.!es nati&as 3ara &6rias finalidadesI as 4uais s/o e@e%utadas dentro de um %omando SQL. 20.# - A&n.>es 8atem5ticas S/o fun.!es %uEo o?Eeti&o fa%ilitar determinados ti3os de %6l%ulos.

A&n./o 3oV7?Ie8 log7@8 mod7@IC8 s4rt7@8 %eil7@8 floor7@8 round7@8 3i78

Descri./o PotNn%iaX Ele&a um n[mero de uma ?ase 7?8 a um e@3oente 7e8 Logaritmo de <@= Resto de di&is/oX Retorna o resto da di&is/o de <@= 3or <C= Raiz 4uadrada de <@= Arredondamento 3ara %ima de <@= Arredondamento 3ara ?ai@o de <@= Arredondamento 3adr/o de <@= Pi

EPem"lo SELE#T 3oV7'I(8Y SELE#T log7 008Y SELE#T mod7 GI,8Y SELE#T s4rt7+G8Y SELE#T %eil7G. 8Y SELE#T floor7G.GGG8Y SELE#T round7G.,8Y SELE#T 3i78Y

Res&ltado D ' + 1 0 G 0 (. + ,G'0,(,DG1G

20.2 - A&n.>es de Data e Jora


A&n./o %urrentLdate %urrentLtime %urrentLtimestam3 toL%Mar7dtImasW8 Data atual >ora atual Data e Mora #on&erte a data de a%ordo %om a m6s%ara definida Descri./o EPem"lo SELE#T %urrentLdate m 0Y SK Da4ui a 0 diasKS SELE#T %urrentLtimeY SELE#T %urrentLtimestam3Y ou SELE#T noV78Y SELE#T toL%Mar7noV78IobDataX b DDS99SBBBB b>oraXb >>'+X9-XSSo8Y

20.2.# - ePtract(..., Tem %omo o?Eeti&o 3egar um dado de current_timestamp tais %omoX
Descri./o Dia 9Ns Ano >ora 9inuto Segundos D%ada Dia da semana Dia do ano ]3o%a EPem"lo SELE#T e@tra%t7daC from noV788Y SELE#T e@tra%t7montM from noV788Y SELE#T e@tra%t7Cear from noV788Y SELE#T e@tra%t7Mour from noV788Y SELE#T e@tra%t7minute from noV788Y SELE#T e@tra%t7se%ondfrom noV788Y SELE#T e@tra%t7de%ade from noV788Y SELE#T e@tra%t7doV from noV788Y SELE#T e@tra%t7doC from noV788Y SELE#T e@tra%t7e3o%M from noV788Y

,,

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

20.- - A&n.>es de Strings


A&n./o trim7stringIo@o8 ltrim7stringIo@o8 rtrim7stringIo@o8 loVer7string8 u33er7string8 init%a37string8 lengtM7string8 su?str7stringInI@8 translate7stringIoIn8 str3os7stringI%8 l3ad7stringI@I%8 Descri./o Retira o %ara%tere <@= da stringsel Retira o %ara%tere <@= da string Z es4uerda Retira o %ara%tere <@= da string Z direita E@i?e a string em letras min[s%ulas E@i?e a string em letras mai[s%ulas E@i?e a string %om a 3rimeira letra mai[s%ula -nforma a 4uantidade de %ara%teres da string Retorna uma su?-string da 3osi./o <n= de %om3rimento <@= Su?stitui os %ara%teres originais 7<o=8 3ara os no&os 7<n=8I de a%ordo %om a 3osi./o -nforma a 3osi./o da 3rimeira o%orrNn%ia do %ara%tere <%= na string EPem"lo SELE#T trim7o@@@@A)#@@@@oIo@o8Y SELE#T ltrim7o@@@@A)#@@@@oIo@o8Y SELE#T rtrim7o@@@@A)#@@@@oIo@o8Y SELE#T loVer7otEsTeo8Y SELE#T u33er7otEsTeo8Y SELE#T init%a37otEsTeo8Y SELE#T lengtM7otEsTeo8Y SELE#T su?str7otEsTeoI I(8Y SELE#T translate7oMa%WeroIoaeoIo+(o8Y SELE#T str3os7ogoia?aoIoao8Y

Define o tamanMo 7<@=8 m6@imo 4ue a string ser6 e@i?ida e 3reen%Me %om o %ara%tere <%= Z es4uerda 4uando for SELE#T l3ad7oLinu@ rulz\\oI'0Io-o8Y menor 4ue <@=. Define o tamanMo 7<@=8 m6@imo 4ue a string ser6 e@i?ida e 3reen%Me %om o %ara%tere <%= Z direita 4uando for SELE#T r3ad7oLinu@ rulz\\oI'0Io-o8Y menor 4ue <@=. Retorna o %am3o <n= tomando %omo referNn%ia o delimitador <d= SELE#T s3litL3art7oSte&e >arrisoIo oI'8 AS bSo?renomebY

r3ad7stringI@I%8 s3litL3art7stringIdIn8

20.-.# - to0c1ar(, Essa fun./o t/o [tilI mere%e at tratamento es3e%ial 3ara falar dela. #omo entrada 3ode-se %olo%ar n[meros ou datas e de a%ordo %om a m6s%ara inserida o?tm-se interessantes resultados. Para &er a aEuda de sinta@e da fun./o digiteX cdf toL%Mar Sendo 4ue do 4ue foi a3resentado %omo segundo argumento tudo textI uma m6s%ara 3ara modelar a %on&ers/o deseEada. E@em3losX #on&erter o n[mero '00G 3ara algarismos romanosX
SELECT to_char(2009,'RN');

A3resentar a data e Mora atual no formato ddSmmSCCCC * MMXmmX


SELECT to_char(now(),'dd/mm/yyyy hh:mm');

Determinar 4ue um %;digo ser6 %om3osto 3or , algarismosI 3reen%Midos 3or zeros Z es4uerdaX
SELECT to_char(53,'00000');

At G 7no&e8 algarismos m ' 7duas8 %asas de%imaisI 3reen%Midos %om zeros e se3arador de milMarX
SELECT to_char(29535.21,'000G000G000D00');

:[mero de at G 7no&e8 algarismos m ' 7duas8 %asas de%imaisI n/o 3reen%Midos %om zeros e se3arador de milMarX
SELECT to_char(29535.21,'999G999G999D99');

,0

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

20.2 - A&n.>es de Sistema


A&n./o %urrentLdata?ase78 %urrentLuser &ersion78 %urrentLs%Mema78 %urrentLs%Memas7?ool8 %urrentLsetting7string8 inetLser&erLaddr78 inetLser&erL3ort78 Descri./o )an%o de dados em uso -nforma 4ual o atual usu6rio 5ers/o do PostgreSQL Es4uema %orrente Es4uemas no %aminMo de 3ro%ura in%luindoI o3%ionalmente 7true8I os es4uemas im3lP%itos -nforma uma %onfigura./o de sistema Retorna o endere.o -P do ser&idor Retorna a 3orta do ser&idor PostgreSQL EPem"lo SELE#T %urrentLdata?ase78Y SELE#T %urrentLuserY ou SELE#T userY SELE#T &ersion78Y SELE#T %urrentLs%Mema78Y SELE#T %urrentLs%Memas7true8Y SELE#T %urrentLsetting7odatestCleo8Y SELE#T inetLser&erLaddr78Y SELE#T inetLser&erL3ort78Y

20.6 - A&n.>es de !grega./o (o& de Gr&"os de Dados,


A&n./o a&g7e@3ress/o8 Descri./o 9dia aritmti%a dos &alores de entrada

SELECT avg(salario) FROM colaboradores; %ount7K8 A 4uantidade de &alores de entrada

SELECT cont(*) FROM colaboradores; %ount7e@3ress/o8 A 4uantidade de &alores de entrada em 4ue o &alor da e@3ress/o n/o nulo

SELECT count(setor) FROM colaboradores; ma@7e@3ress/o8 Retorna o &alor m6@imo dentre todos os &alores de entrada

SELECT nome,snome,salario FROM colaboradores WHERE salario=(SELECT max(salario) FROM colaboradores); min7e@3ress/o8 Retorna o &alor mPnimo dentre todos os &alores de entrada

SELECT nome,snome,salario FROM colaboradores WHERE salario=(SELECT min(salario) FROM colaboradores); sum7e@3ress/o8 -nforma a soma dos &alores de entrada da e@3ress/o

SELECT sum(salario) FROM colaboradores; stdde&7e@3ress/o8 Des&io 3adr/o

SELECT stddev(salario) FROM colaboradores; &arian%e7e@3ress/o8 5ariRn%ia estatPsti%a

SELECT variance(salario) FROM colaboradores;

,1

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

20.7 - ! +l5&s&la GR$CP 9E

A %l6usula GR2"P )B %on%entra em a3enas uma linMa todos os registros %uEo &alor o mesmo da %oluna GR2"P )B. ] im3ortante lem?rar 4ue todas as %olunas rela%ionadas no SELE#T 4ue n/o esteEam nas fun.!es de gru3o de&em estar tam?m na %l6usula GR2"P )B.
E@em3losX Sele%ionar 4uantos %ola?oradores M6 3or "$X
SELECT uf,count(uf) FROM colaboradores GROUP BY uf;

#onsultar 4uantos %ola?oradores ganMam 3elo menos Rv '.,00I00 agru3ando 3elo estado de origemX
SELECT uf,count(uf) FROM colaboradores WHERE salario >= 2500 GROUP BY uf;

20.: - ! +l5&s&la J!?3BG Tem 3or finalidade filtrar os dados agru3ados im3ondo uma %ondi./o. Tal %ondi./o de&e ter alguma das %olunas do SELECT. E@em3loX #onsultar 4uantos %ola?oradores ganMam 3elo menos Rv '.,00I00 agru3ando 3elo estado de origemI mas a3enas 4uando o estado 3ossuir mais 4ue ( 7trNs8 %ola?oradores 4ue atendam ao re4uisitoX
SELECT uf,count(uf) FROM colaboradores WHERE salario >= 2500 GROUP BY uf HAVING count(uf)>3;

,D

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

2# - 3BSERT * inser./o de Dados


2 %omando -:SERT %ria no&os registros em uma ta?ela. Sinta@e geralX
INSERT INTO tabela (coluna1,coluna2,...,colunaN) VALUES (valor1,valor2,...,valorN);

#omo e@em3loI &amos inserir um no&o fun%ion6rio na ta?ela %ola?oradoresI men%ionando todos os %am3osX
INSERT INTO colaboradores (mat_id,nome,snome,cargo,setor,uf,cidade,salario,dt_admis,chefe_direto) VALUES ('00036','Teobaldo','Melo','Diretor','Financeiro',DEFAULT,'So Paulo',4523.75,'09/06/2009','00001');

Analisando o %;digo a%ima 3odemos notar 4ue logo a3;s o nome da ta?ela a?re-se 3arNnteses e &em a se4uNn%ia de nomes de %olunas se3arados 3or &Prgulas e a3;s o nome da [ltima M6 o fe%Mamento de 3arNnteses. A 3ala&ra %Ma&e VALUES anun%ia os &alores 4ue ser/o inseridos de a%ordo %om a 3osi./o do nome de %oluna. Para &alores de ti3os n/o numri%osI datas ou tem3o usa-se as3as sim3les 3ara delimitar. Ti3os numri%osI 3ala&ras %Ma&eI %Mamada de fun.!es ou identifi%adores n/o s/o en&ol&idos 3or as3as sim3les. "m dos &alores a ser inserido usa a 3ala&ra %Ma&e <DE$A"LT=I %uEoI na estrutura da ta?ela <%ola?oradores= foi de%larado %omo &alor 3adr/o igual a <SP=. Quando &ai inserir &alores 3ara todos os %am3os de uma ta?elaI n/o 3re%iso de%larar os nomes das %olunasI 3odendo assim ganMar agilidade. Ent/o o %omando a%ima 3oderia ser feito da seguinte formaX
INSERT INTO colaboradores VALUES ('00036','Teobaldo','Melo','Diretor','Financeiro',DEFAULT,'So Paulo',4523.75,'09/06/2009','00001');

Adi%ionando a3enas alguns &aloresX


INSERT INTO colaboradores (mat_id,nome,snome,dt_admis) VALUES ('00037','Hugo','Nbrega',now());

$oram usados a3enas os %am3os referentes Z matrP%ulaI ao nomeI ao so?renome e Z data de admiss/o do fun%ion6rio inseridoI os outros %am3os 7os n/o de%larados8I ou fi%aram nulos ou %om algum &alor 3adr/o. :esse %asoI 3ara o %am3o dt_admisI usamos a fun./o now() 4ue 3reen%Meu %om a data atual. 5ale lem?rar 4ue 3ara %olunas do ti3o NOT NULL o 3reen%Mimento o?rigat;rio.

,G

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

2#.# - 3nserindo Registros com SELE+T 9todo similar ao SELECT INTO e CREATE TABLE ASI uma forma de 3assarmos dados de uma ta?ela 3ara outra. Para e@em3loI &amos 3rimeiro %riar uma ta?ela tem3or6riaI %om 3ou%os %am3os. %uEa finalidade ser6 %onter a3enas os fun%ion6rios amazonensesX
CREATE TEMP TABLE "colaboradores_AM" ( mat_id CHAR(5) PRIMARY KEY, nome VARCHAR(15), snome VARCHAR(15) );

-nserindo os dados na no&a ta?ela atra&s de uma %onsulta filtrada em <%ola?oradores=X


INSERT INTO "colaboradores_AM" SELECT mat_id,nome,snome FROM colaboradores WHERE uf='AM';

2#.2 - 3BSERT !gr&"ado Se for ne%ess6rio inserir mais de um registroI n/o ne%ess6rio fazer &6rios -:SERTs. Pode ser feito se3arando %ada %onEunto de &alores dos registros 7delimitados 3or 3arNnteses8I se3arados 3or &Prgulas e a3;s o [ltimo ao in&s da &PrgulaI 3onto e &PrgulaX
INSERT INTO colaboradores (mat_id,nome,snome) VALUES ('00038','teste','insert_1'), ('00039','tEsTe','insert_2'), ('00040','TEste','insert_3');

00

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

22 - Dollar Q&oting
Dollar Quoting uma forma alternati&a de inserir strings sem usar as as3as sim3es e de es%a3ar %ara%teres dando uma maior seguran.a 3ara o ?an%o de dadosI um grande aliado %ontra um ti3o de ata4ue %onMe%ido %omo <SQL -nEe%tion=. 2 dollar 4uoting se a3li%a a stringsI sendo 4ue 3ode ser feito de duas formasX
$$sua string$$

ou
$marcador$sua string$marcador$

Sendo 4ue <mar%ador= 3ode ser 4ual4uer string 4ue &o%N 4uiser es%olMer 3ara denominar. E@em3loX
INSERT INTO tabela (campo_string) VALUES ($dfghjkliu$teste teste teste$dfghjkliu$);

2 &alor inserido foi <teste teste teste= 7sem as as3as8I usamos %omo mar%ador <vdfgMEWliuv=. 2 uso de dollar 4uoting nos 3ermite inserir strings %om %ara%teres es3e%iasI tais %omo a 3r;3ria as3as sim3lesX
INSERT INTO tabela (campo_string) VALUES ($outro_marcador$'teste'$outro_marcador$);

:esse %asoI o &alor inserido foiX


'teste'

Sim\ #om o uso de dollar 4uoting o insert %onsiderou as as3as sim3les %omo um %ara%ter %omum. 2?s.X A3esar dos e@em3lo dos e@em3los terem sido %om -:SERTI 3oderiam ser de a%ordo %om o %onte@to usando outros %omandos D9L 7SELECTI UPDATE e DELETE8.

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

22 - CPD!TE * !lterando Registros


2 %omando UPDATE utilizado 3ara mudar registros de uma ta?ela. Sinta@e geralX
UPDATE tabela SET coluna = valor WHERE condio ;

5amos usar o %omando "PDATE 3ara atualizar a ta?ela <%ola?oradores=I le&ando-se em %onta 4ue os tra?alMadores 4ue ganMam menos ou igual a Rv .'00I00 e s/o do estado de S/o Paulo re%e?eram um aumento de 0T no sal6rioX
UPDATE colaboradores SET salario = salario*1.1 WHERE salario<=1200 AND uf ILIKE 'sp';

:ota-se 4ue ao fazer uma %onsulta dos registrosI a3;s a atualiza./oI os registros afetados saPram de sua ordem original 3assando agora 3ara o final de todos os registros. 2-.# - !t&aliDando 8ais de Cm +am"o Podemos tam?m fazer atualiza./o de registros referen%iando mais de um %am3o. 5amos su3or 4ue 3or um moti&o 4ual4uer a unidade de 9anaus te&e 4ue mudar 3ara )elmX
UPDATE colaboradores SET (uf,cidade) = ('PA','Belm') WHERE uf='AM';

Para &oltar ao normalX


UPDATE colaboradores SET (uf,cidade) = ('AM','Manaus') WHERE uf='PA';

Poderia ser feito tam?m da seguinte formaX


UPDATE colaboradores SET uf='RN',cidade='Natal' WHERE (uf,cidade) = ('SP','So Paulo');

5oltando ao 4ue era antesX


UPDATE colaboradores SET uf='SP',cidade='So Paulo' WHERE uf='RN' AND cidade='Natal';

2-.2 - !t&aliDando com S& -cons&lta Todos os tra?alMadores 4ue ganMam menos ou igual a Rv .0,0I00 ter/o seus sal6rios reaEustados 3ara o &alor igual Z mdia da4ueles 4ue ganMam menos 4ue Rv '.000I00X
UPDATE colaboradores SET salario = (SELECT avg(salario) FROM colaboradores WHERE salario<2000) WHERE salario<=1050;

0'

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

22 - DELETE * Removendo Registros


Para a3agar linMas de uma ta?ela usa-se o %omando DELETE. Sinta@e geralX
DELETE FROM tabela WHERE coluna condio;

A3agando todos os registros %uEa %oluna <%argo= tem &alor nuloX


DELETE FROM colaboradores WHERE cargo IS NULL;

Assim %omo em outros e@em3losI 3ode-se usar su?-%onsultas 3ara tam?m deletar dados.

0(

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

26 - TRCB+!TE * Redefinindo &ma Ta ela +omo ?aDia


2 %omando TR":#ATE a3aga todos os registros de uma ta?elaI 3ortanto de&e ser usado %om %autela. A3esar de a3agar todos os dados de uma ta?ela um %omando de defini./o e n/o de mani3ula./oI ou seEaX DDL. Sinta@e geralX
TRUNCATE tabela [CASCADE];

5amos tentar fazer o %omando TRUNCATE na ta?ela <%ola?oradores=X


TRUNCATE colaboradores;

Erro\ :/o foi 3ossP&elI 3ois a mesma referen%iada 3or outra ta?elaI sendo ent/o ne%ess6rio fazer a remo./o em cascataI usando o 3arRmetro CASCADEX
TRUNCATE colaboradores CASCADE;

Todos os dados foram 3erdidos\ 9as 3ara %ontinuarmos o %urso sim3lesmente %o3ie a 3arte de -:SERTS do ar4ui&o %urso.s4l e %ole no 3rom3t do 3s4l.

0+

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

27 - +$PE
2 %omando COPY %o3ia registros entre um ar4ui&o e uma ta?elaI ou de uma ta?ela 3ara STDOUT 7standard out3ut ^ saPda 3adr/o8 ou de STDIN 7standard in3ut ^ entrada 3adr/o8 3ara uma ta?ela. Para se ter uma idia de %omo fun%iona o %omando
COPY colaboradores TO stdout; COPYI

&amos 3rimeiro %o3iar os dados 3ara a telaX

Podemos o?ser&ar 4ue o resultado o?tido similar a mandar sele%ionar todos os dados. #ada %am3o se3arado 3or es3a.oI mas 3odemos usar outro delimitador %omo a &PrgulaI 3or e@em3loX
COPY colaboradores TO stdout DELIMITER ',';

2 delimitador determinado 3elo %ara%tere entre as as3as sim3les. Para 3rosseguirmos nossos e@em3los %om #2PB &amos %riar uma ta?ela tem3or6ria %ontendo a3enas os fun%ion6rios de S/o PauloX
CREATE TEMP TABLE colab_sp AS SELECT * FROM colaboradores WHERE uf='SP';

#om o %omando #2PB en&iaremos os dados dessa ta?ela 3ara o ar4ui&o <Stm3S?a%Wu3Ls3.t@t=I usando %omo delimitador o %ara%tere 3i3e 7<f=8X
COPY colab_sp TO '/tmp/backup_sp.txt' DELIMITER '|';

"sando o %omando TR":#ATE 3ara redefinir a ta?ela <%ola?Ls3= %omo uma ta?ela &aziaX
TRUNCATE colab_sp ;

E re%u3eramos os dados 4ue nela esta&am usando #2PBX


COPY colab_sp FROM '/tmp/backup_sp.txt' DELIMITER '|';

27.# - Aormato +S? #S5 signifi%a #omma Se3areted 5alues 75alores Se3arados 3or 5Prgula8I 4ue no %aso s/o os &alores res3e%ti&os aos %am3os de uma ta?ela. Para gerarmos um #S5X
COPY colab_sp TO '/tmp/backup_sp.csv' CSV;

#om o 3arRmetro #S5 o ar4ui&o resultante gerado automati%amente %om &Prgulas %omo delimitadores de %olunasI mesmo as 4ue est/o nulas.

0,

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

Para re%u3erar dados de um ar4ui&o #S5 3ara uma ta?elaX


COPY colab_sp FROM '/tmp/backup_sp.csv' CSV;

27.2 - 3nserindo Dados com o +$PE "elo Teclado "ma alternati&a 3ara inserir dados diferente do %omando <-:SERT=X
COPY colab_sp FROM stdin CSV;

A3are%er6 uma mensagem na telaX -nforme os dados a serem %o3iados seguido 3elo %ara%tere de no&a linMa. $inalize %om uma ?arra in&ertida e um 3onto na linMa.
>>

2s dois sinais <maior 4ue= indi%am a linMa %orrente 3ara se inserir dados. :o e@em3lo foi determinado o formato CSV e ent/o %omo e@em3lo digitaremosX
00032,Paula,Franco,Programador,TI,SP,Jundia,2100,2007-09-30,00003

nE:TERa
00030,Martina,Santos,An. de Sistemas,TI,SP,Jundia,4200,2007-09-30,00003

nE:TERa
\.

00

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

2: - SEQCEB+E * Se%&Fncia
"ma se4uNn%ia usada 3ara determinar &alores automati%amente 3ara um %am3o. 5eEamos %omo se %ria umaX
CREATE SEQUENCE nome_da_sequencia [INCREMENT incremento] [ MINVALUE valor_mnimo | NO MINVALUE ] [ MAXVALUE valor_mximo | NO MAXVALUE ] [ START [ WITH ] incio ] [ CACHE cache ] [ [ NO ] CYCLE ] ;

2s 3arRmetrosX 3B+RE8EBTX 5alor de in%remento. 83B?!LCEX 5alor mPnimo. B$ 83B?!LCEX :este %aso usado os &alores mPnimos 3adr!esI sendo 4ue e -' 0(- 3ara se4yNn%ias as%endentes e des%endentesI res3e%ti&amente. 8!G?!LCEX 5alor m6@imo. B$ 8!G?!LCEX Ser6 usado os &alores m6@imos 3adr!esX '0(- e - 3ara se4yNn%ias as%endentes e des%endentesI res3e%ti&amente. ST!RT Y @3TJ ZX 5alor ini%ial. +!+JEX Quantos n[meros da se4yNn%ia de&em ser 3r-alo%ados e armazenados em mem;ria 3ara a%esso mais r63ido. 2 &alor mPnimo 7somente um &alor gerado de %ada &ezI ou seEaI sem %a%Me8I e este tam?m o &alor 3adr/o. +E+LEX $az %om 4ue a se4yNn%ia re%ome%e 4uando for atingido o &alorLm6@imo ou o &alorLmPnimo 3or uma se4yNn%ia as%endente ou des%endenteI res3e%ti&amente. Se o limite for atingidoI o 3r;@imo n[mero gerado ser6 o &alorLmPnimo ou o &alorLm6@imoI res3e%ti&amente. B$ +E+LEX Seu efeito se d6 a toda %Mamada a ne@t&al a3;s a se4yNn%ia ter atingido seu &alor m6@imo retornar6 um erro. Se n/o for es3e%ifi%ado nem #B#LE nem :2 #B#LEI :2 #B#LE o 3adr/o. E@em3loX #riar uma se4uen%ia 4ue se dN de , em ,I &alor mPnimo ,I &alor m6@imo ,00I %om '0 n[meros da se4uNn%ia 3r alo%ados na mem;ria e sem %i%loX
CREATE SEQUENCE sq_teste INCREMENT 5 MINVALUE 15 MAXVALUE 500 CACHE 20 NO CYCLE;

01

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

2:.# - A&n.>es de 8ani"&la./o de Se%&Fncia ne@t&al7ose4uen%iao8X Pr;@imo &alor e in%rementa. %urr&al7ose4uen%iao8X 5alor atual. Quando a se4uNn%ia ainda n/o foi usada retornar6 erro. set&al7ose4uen%iaoI&alor8X Determina um no&o &alor atual. Damos inP%io Z se4uNn%ia manualmenteX
SELECT nextval('sq_teste');

7Re3ita trNs &ezes8 2?ser&amos seu &alor %orrenteX


SELECT currval('sq_teste');

9udamos seu &alor 3ara '0X


SELECT setval('sq_teste',20);

2:.2 - Csando Se%&encias em Ta elas Dentre os ti3os de dados 4ue foram &istosI o <serial= nada mais do 4ue uma se4uNn%ia %riada na MoraI de a%ordo %om o nome da ta?ela. 5eEamos este e@em3loX
CREATE TEMP TABLE tb_teste( cod serial, nome VARCHAR(15) );

] e@i?ida uma notaX


CREATE TABLE criar sequncia implcita "tb_teste_cod_seq" para coluna serial "tb_teste.cod"

5amos fazer no&amente a ta?elaI mas %om a se4uNn%ia <s4Lteste=X


CREATE TABLE tb_teste( cod int DEFAULT nextval('sq_teste'), nome VARCHAR(15) );

TestandoX
INSERT INTO tb_teste (nome) VALUES ('nome1'),('nome2'),('nome3'),('nome4'); SELECT * FROM tb_teste ;

0D

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

#omo 3qde ser o?ser&adoI o 3r;@imo &alor de <s4Lteste= foi tomado %omo um &alor 3adr/o 3ara o %am3o <%od=. "m %am3o auto in%remental.

2:.- - !lterando &ma Se%&Fncia "sando o %omando <cM ALTER SEQ"E:#E= 3odemos &er o 4ue 3ode ser mudado na se4uNn%ia deseEadaI 4uase igual a %riar uma. #omo e@em3lo &amos &oltar o &alor 3ara ,X
ALTER SEQUENCE sq_teste RESTART WITH 15;

De agora em diante os &alores ser/o a 3artir do , em <s4Lteste=. 2:.2 - Deletando &ma Se%&Fncia Podemos a3agar uma ou mais se4uNn%ias usando a seguinte sinta@eX
DROP SEQUENCE [ IF EXISTS ] nome [, ...] [ CASCADE | RESTRICT ]

E@em3loX
DROP SEQUENCE sq_teste ;

Erro\ Pois <s4Lteste= est6 &in%ulada Z ta?ela <t?Lteste=I ent/o de&emos fazer a remo./o em %as%ataX
DROP SEQUENCE sq_teste CASCADE;

2 &alor 3adr/o da ta?ela <t?Lteste= foi remo&ido.

0G

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

2; - 3BDEG - ndice
"m Pndi%e 7-:DEF8 um re%urso 4ue agiliza ?us%as de informa.!es em ta?elas. -nde@amos %am3os usados %omo %ritrios de filtragem numa %onsulta 7%l6usula H>EREI 3or e@em3lo8 e a4ueles %uEos &alores s/o mais restriti&os %om3arados a outros &alores da ta?ela. Seu fun%ionamento %onsiste em %riar 3onteiros 3ara dados gra&ados em %am3os es3e%Pfi%os. Quando n/o e@iste Pndi%e num %am3o usado %omo %ritrio de filtragemI feita uma &arredura em toda a ta?elaI de maneira 4ue Ma&er6 e@e%u.!es de entrada e saPda 7-S28 de dis%o desne%ess6riasI alm de tam?m des3erdi.ar 3ro%essamento. 2?s.X Ao se %riar %Ma&es 3rim6riasI automati%amente um Pndi%e %riado. Sinta@e geralX
CREATE [UNIQUE] INDEX nome_do_index ON tabela [USING mtodo] (campo);

2 3arRmetro <":-Q"E= faz %om 4ue a %oluna inde@ada s; a%eite &alores [ni%os. :o entantoI se a ta?ela E6 esti&er %om &alores du3li%ados na %oluna deseEada n/o ser6 3ossP&el %riar o Pndi%e %omo <":-Q"E=. E@em3loX
CREATE INDEX idx_colab_nome ON colaboradores USING BTREE (nome);

2;.# - 8todos de 3ndePa./o 2 PostgreSQL forne%e 4uatro ti3os de Pndi%esX )TREE 73adr/o8I G-STI G-: e >AS>. #ada ti3o de Pndi%e usa um algoritmo diferenteI %ada 4ual se en%ai@a melMor em algum ti3o de %onsulta.

2;.#.# - 9TREE Podem lidar %om %onsultas de fai@as ou igualdades em dados 4ue 3odem ser organizados ordenadamente. Este ti3o de Pndi%e de&e ser6 %onsiderado 3elo 4uerC 3lanner 4uando a %oluna inde@ada en&ol&e %om3ara.!es usando algum desses o3eradoresX [I [\I \I \] e ]. 2;.#.2 - G3ST

:/o s/o ti3os singulares de Pndi%esI mas sim dentro de uma infra-estrutura 4uem muitas diferentes
10

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

estratgias de inde@a./o 3odem ser im3lementadas. AssimI os o3eradores %om os 4uais um Pndi%e G-ST 3ode ser usado &aria de3endendo da estratgia de inde@a./o 7a %lasse de o3erador8. Por e@em3loI a distri?ui./o 3adr/o do PostgreSQL in%lui %lasses de o3eradores G-ST 3ara &6rios ti3os de dados geomtri%os ?i-dimensionaisI 4ue su3orta %onsultas usando estes o3eradoresX [[I M[I M]I ]]I [[^I M[^ I ^ M]I ^]] I _] I [_ I V\ e MM.

2;.#.- - G3B S/o Pndi%es in&ertidos 4ue 3odem lidar %om &alores 4ue %ontenMam mais de uma %Ma&eIarraCs 3or e@em3lo. #omo o G-STI 3ode su3ortar muitas estratgias diferentes de inde@a./o definidas 3or usu6rios e os o3eradores 3arti%ulares %om 4ue um Pndi%e G-: 3ode ser usado de3endendo da estratgia de inde@a./o. 2 PostgreSQL 3or 3adr/o in%lui %lasses de o3eradores G-: 3ara arraCs uni-dimensionaisI 4ue su3ortam %onsultas usando estes o3eradoresX [_I _]I \I MM. 2;.#.2 - J!SJ Lidam a3enas %om %om3ara.!es sim3les. 2 4uerC 3lanner %onsiderar6 o Pndi%e MasM sem3re 4ue uma %oluna inde@ada esti&er en&ol&ida em uma %om3ara./o %om o o3erador \. Ondi%es do ti3o MasM n/o su3ortam %onsultas IS NULL.
2?s.X Testes demonstram 4ue Pndi%es MasM do PostgreSQL n/o tem 3erforman%e melMor 4ue Pndi%es do ti3o )TREE e o tamanMo e tem3o 3ara %onstruir ?em 3ior. 2 uso do Pndi%e MasM desen%oraEado.

2;.2 - ndices +om"ostos


S/o a4ueles 4ue %ontm em sua %om3osi./o mais de um %am3oI sendo 4ue 3ara um melMor desem3enMo de&e-se de%larar na %ria./o do Pndi%e os %am3os %om &alores mais distri?uPdos no inP%io. E@em3loX #REATE -:DEF nomeLdoLinde@ 2: nomeLdaLta?ela 7%am3oFI%am3oBI%am3ox8Y

2;.- - ndices Parciais


Quando se tem uma ta?ela %om muitos registrosI um Pndi%e %omum 3ode n/o ofere%er um desem3enMo n/o t/o ?om. $elizmente o Postgres tem um re%urso 4ue 3ermite 4ue seEam %riados Pndi%es de a%ordo %om uma %ondi./o esta?ele%ida na sua %ria./o. E@em3loX
--Criao da tabela de teste CREATE TABLE tb_teste_index( campo1 INT ); --Insero de 2 milhes de registros INSERT INTO tb_teste_index VALUES (generate_series(1,2000000)); --Anlise sem ndices de valores mltiplos de 19 (sem ndice) EXPLAIN ANALYZE SELECT * FROM tb_teste_index WHERE campo1%19=0; QUERY PLAN ----------------------------------------------------------------------------------------------------------------------Seq Scan on tb_teste_index (cost=0.00..40710.00 rows=10620 width=4) (actual time=0.132..1009.375 1

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

rows=105263 loops=1) Filter: ((campo1 % 19) = 0) Total runtime: 1144.964 ms (3 rows) --Criao de ndice total CREATE INDEX idx_teste_index_total ON tb_teste_index (campo1); --Criao de ndice parcial mltiplos de 19 CREATE INDEX idx_teste_index_19 ON tb_teste_index (campo1) WHERE campo1%19=0;

--Anlise sem ndices de valores mltiplos de 19 (COM NDICE) EXPLAIN ANALYZE SELECT * FROM tb_teste_index WHERE campo1%19=0; QUERY PLAN -----------------------------------------------------------------------------------------------------------------------------------------------Index Scan using idx_teste_index_19 on tb_teste_index (cost=0.00..1892.58 rows=10000 width=4) (actual time=0.286..292.026 rows=105263 loops=1) Total runtime: 430.361 ms (2 rows)

Pelo e@em3lo a%ima 3udemos %onstatar o 4ue foi dito na teoriaY antes da %ria./o dos Pndi%es a ?us%a foi se4uen%ialI demorando ++.G0+ ms. A3;s a %ria./o dos Pndi%esI o 3laneEador de %onsultas E6 3odia %ontar %om elesI o3tando 3or usar o Pndi%e %om maior restri./o de &alores le&ando +(0.(0 msI usufruindo de uma ?us%a agora inde@ada 3or um Pndi%e 3ar%ial.

2;.2 - !ntes de EPcl&ir &m ndice


:/o remo&a um Pndi%e de seu ?an%o sem antes sa?er o 4u/o [til ele .
SELECT indexrelname,relname,idx_scan,idx_tup_read,idx_tup_fetch FROM pg_stat_user_indexes ;

Sendo 4ue %ada %am3o signifi%aX

indePrelname` :ome do Pndi%eY relname` :ome da ta?ela Z 4ual o Pndi%e 3erten%eY idP0scan` Quantas &ezes o Pndi%e foi usadoY idP0t&"0read` Quantas tu3las o Pndi%e leuY idP0t&"0fetc1` Quantas tu3las o Pndi%e re%u3erou.

2u seEaI se um Pndi%e E6 e@iste M6 um %erto tem3o e n/o tem sido usadoI ser6 ne%ess6rio re3laneEar o mesmoI de&ido Z sua inutilidade.

2;.6 - EPcl&indo &m ndice


SPnta@eY
DROP INDEX [ IF EXISTS ] nome [, ...] [ CASCADE | RESTRICT ]

E@em3loY
DROP INDEX idx_colab_nome;

1'

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

2;.7 - Reconstr&./o de ndices * RE3BDEG


2 %omando RE-:DEF faz a re%onstru./o de um Pndi%e utilizando os dados guardados na ta?ela do mesmo e su?stitui a %;3ia antiga do Pndi%e. 2 %omando RE-:DEF utilizado nas seguintes situa.!esX Ondi%e %orrom3ido e n/o %ontm mais dados &6lidos. Em?ora teori%amente isso nun%a de&a a%onte%erI na 3r6ti%a os Pndi%es 3odem se %orrom3er de&ido a erros de 3rograma./o ou falMas de MardVare. 2 %omando RE-:DEF forne%e um mtodo de re%u3era./o. Ondi%e <dilatado=. #ontm muitas 36ginas &azias ou 4uase &azias. Tal situa./o 3ode a%onte%er %om Pndi%es )Tree so? usos fora do %omum. 2 %omando RE-:DEF forne%e uma maneira 3ara diminuir o %onsumo de es3a.o do Pndi%e atra&s da es%rita de uma no&a &ers/o sem as 36ginas mortas. Sinta@eX
REINDEX { INDEX | TABLE | DATABASE | SYSTEM } nome

-:DEFX Ondi%e es3e%Pfi%oY TA)LEX Todos os Pndi%es da ta?ela es3e%Pfi%aY DATA)ASEX Todos os Pndi%es do ?an%o de dados es3e%Pfi%oY SBSTE9X Todos os Pndi%es em todos os %at6logos no Rm?ito do atual ?an%o de dadosY nomeX -dentifi%ador de -:DEFI TA)LEI DATA)ASE ou SBSTE9 E@em3loX
REINDEX TABLE colaboradores ;

2 %omando a%ima reinde@ou todos Pndi%es da ta?ela <%ola?oradores=.

2;.: - +LCSTER
2 %omando CLUSTER agru3a uma ta?ela de a%ordo %om um Pndi%e de modo a aumentar a 3erforman%e no ?an%o de dados. A ta?ela fisi%amente reordenada ?aseando-se na informa./o do Pndi%e. 2 agru3amento feito somente uma &ezX a3;s ser atualizada I as atualiza.!es feitas nas linMas da ta?ela n/o seguir/o o agru3amentoI ou seEaI n/o ser6 feita nenMuma tentati&a 3ara armazenar as linMas no&as ou atualizadas na ordem do Pndi%e. Se for deseEadoI a ta?ela 3ode ser reagru3ada 3eriodi%amente e@e%utando este %omando no&amente. Sinta@eX
CLUSTER nome_tabela [ USING nome_ndice ]

E@em3loX
CLUSTER colaboradores USING colaboradores_pkey ;

1(

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

2< - D$8!3B (DomHno,


DomPnio um ti3o de dado 3ersonalizado em 4ue se 3ode definir %omo os dados ser/o inseridos de a%ordo %om restri.!es definidas o3%ionalmente. Sinta@eX
CREATE DOMAIN nome [ AS ] tipo_dado [ DEFAULT expresso ] [ restrio [ ... ] ]

onde restri./o X
[ CONSTRAINT nome_restrio ] { NOT NULL | NULL | CHECK (expresso) }

E@em3loX #ria./o de um domPnioI %uEa finalidade &alidar #EPs no formato <`````-```=X


CREATE DOMAIN dom_cep AS char(9) CONSTRAINT chk_cep CHECK (VALUE ~ E'^\\d{5}-\\d{3}$');

2 domPnio %riado de nome <domL%e3= do ti3o %Mar7G8I 3ois re%e?e , 7%in%o8 dPgitosI um <-= 7MPfen8 e 3or [ltimo mais ( 7trNs8 dPgitos. Possui uma restri./o denominada <%MWL%e3=I a 4ual &erifi%a se o &alor inserido estar6 de a%ordo %om a e@3ress/o regular se o &alor inserido est6 no &alor determinado 7, dPgitos m <-= m ( dPgitos8. #ria./o de uma ta?ela 4ue usar6 o domPnio %riado %omo ti3o de dado 3ara uma %olunaX
CREATE TEMP TABLE endereco( cep dom_cep, logradouro text, numero varchar(6), cidade varchar(20), uf char(2) );

"m e@em3lo de inser./o na ta?ela %om o domPno %riadoX


INSERT INTO endereco VALUES ('01001-000','Pa. da S','s/n','So Paulo','SP');

1+

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

-0 - Transa.>es I +ontrole de Sim&ltaneidade


Transa./o uma forma de se e@e%utar uma se4uNn%ia de %omandos indi&isi&elmente 3ara fins de altera.!esI inser.!es ou remo.!es de registros. -0.# - 8?++ * 8&lti ?ersion +onc&rrenc) +ontrol (+ontrole de +oncorrFncia 8&lti ?ers/o, De maneira diferente de outros SG)Ds tradi%ionaisI4ue usam ?lo4ueios 3ara %ontrolar a simultaneidadeI o PostgreSQL mantm a %onsistNn%ia dos dados utilizando o modelo multi&ers/o 795##X 9ulti 5ersion #on%urren%C #ontrol. Signifi%a 4ueIao %onsultar o ?an%o de dadosI %ada transa./o en@erga um instantRneo 7sna3sMot8 dos dados 7uma &ers/o do ?an%o de dados8 %omo esses eram antesI sem %onsiderar o atual estado dos dados su?Ea%entes. Esse modelo e&ita 4ue a transa./o en@ergue dados in%onsistentesI o 4ue 3oderia ser originado 3or atualiza.!es feitas 3or transa.!es simultRneas nos mesmos registrosI forne%endo um isolamento da transa./o 3ara %ada sess/o. A 3rin%i3al &antagem de utilizar o modelo 95## em ?lo4ueios 3elo fato de os ?lo4ueios o?tidos 3ara %onsultar os dados 7leitura8 n/o entram em %onflito %om os ?lo4ueios de es%ritaI ent/oI a leitura nun%a ?lo4ueia a es%rita e a es%rita nun%a ?lo4ueia a leitura. -0.2 - Ctilidade de &ma transa./o Por 3adr/oI o PostgreSQL <auto %ommit=I 4ue signifi%a efeti&ar as altera.!es nos ?an%os de dados de forma autom6ti%aI 3ois %ada %omando e@e%utado e logo a3;s a altera./o feita. :o entantoI M6 %asos 4ue e@ige-se uma maior seguran.aI %omo 3or e@em3loI %ontas ?an%6rias. -magine uma transferNn%ia de uma %onta <A= 3ara uma %onta <)= de um &alor 4ual4uer. :o ?an%o de dadosI a %onta <A= ter6 de seu saldo su?traPdo o &alor da transferNn%ia e na %onta <)= adi%ionado. 2u seEaI na 3rimeira o3era./o retira-se de uma e na segunda a%res%enta-se a outra. E se logo a3;s o &alor ser su?traPdo de <A= Mou&er algum 3ro?lemaw A %onta <)= fi%aria sem o &alor a%res%entado e <A= fi%aria %om um saldo menor sem a transferNn%ia ter sido realmente feita... Seria um grande 3ro?lema 3ara a institui./o finan%eira\ Se no %aso %itado ti&esse sido feito de forma a usar transa./o n/o Ma&eria tal transtornoI 3ois numa transa./o ou todos %omandos s/o de&idamente efeti&ados ou n/o Ma&er6 altera./o alguma. Altera.!es feitas durante uma transa./o s; 3odem ser &istas 3or 4uem est6 fazendoI os outros usu6rios s; 3oder/o &er de3ois da transa./o ser efeti&ada. "m ?an%o de dados rela%ional de&e ter um me%anismo efi%az 3ara armazenar informa.!es 4ue esteEam de a%ordo %om o %on%eito A#-D. -0.- - !+3D !tomicidadeX Relem?rando as aulas de 4uPmi%aI a 3ala&ra <6tomo=I 4ue &em do gregoI signifi%a
1,

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

indi&isP&el. Quando se e@e%uta uma transa./o n/o M6 3ar%ialidade. 2u todas altera.!es s/o efeti&adas ou nenMuma. +onsistFnciaX #ertifi%a 4ue o ?an%o de dados 3ermane%er6 em um estado %onsistente antes do inP%io da transa./o e de3ois 4ue a transa./o for finalizada 7?em su%edida ou n/o8. 3solamentoX #ada transa./o des%onMe%e outras transa.!es %on%orrentes no sistema. D&ra ilidadeX A3;s o trmino ?em su%edido de uma transa./o no ?an%o de dadosI as mudan.as 3ersistem.

-0.2 - BHveis de 3solamento 2 3adr/o SQL define 4uatro nP&eis de isolamento de transa./o em termos de trNs fenqmenos 4ue de&em ser e&itados entre transa.!es simultRneas. 2s fenamenos n/o dese4ados s/oX Dirt) Read (Leit&ra S&4a,X "ma transa./o lN dados gra&ados 3or outra transa./o %on%orrente n/o efeti&adaY Bonre"eata le Read (Leit&ra %&e n/o se re"ete, X A transa./o relN dados 4ue foram 3re&iamente lidos e des%o?re 4ue os dados foram modifi%ados 3or outra transa./o 7efeti&ados desde a 3rimeira leitura8Y P1antom Read (Leit&ra Aantasma,X A transa./o e@e%uta no&amente uma %onsulta e des%o?re 4ue os registros mudaram de&ido a outra transa./o ter sido efeti&adaY
Dirt) Read PossP&el -m3ossP&el -m3ossP&el -m3ossP&el Bonre"eat le Read PossP&el PossP&el -m3ossP&el -m3ossP&el P1antom Read PossP&el PossP&el PossP&el -m3ossP&el

BHvel de 3solamento Read "n%ommited Read #ommited 73adr/o PostgreSQL8 Re3eata?le Read Serializa?le

:o PostgreSQL 4ual4uer um dos nP&eis de isolamento 3adr/o 3ode ser es%olMidoI mas internamente s; M6 dois nP&eis de isolamento distintos 4ue s/o Read Commited e Serializable. Quando sele%ionado Read Uncommited na &erdade o?tm-se Read Commited e 4uando se es%olMe Repeteatable Read o?tm-se Serializable. Ent/oI o nP&el de isolamento real 3ode ser mais estrito do 4ue o es%oolMido. $ "adr/o SQL "ermite %&e os %&atro nHveis de isolamento a"enas definem %&ais fenamenos n/o "odem acontecerI n/o definem 4uais fenqmenos de&em a%onte%er. Podemos definir o nP&el de isolamento da transa./o usando o %omando SET TRA:SA#T-2:. Sinta@eX
SET TRANSACTION modo_transao [, ...] SET SESSION CHARACTERISTICS AS TRANSACTION modo_transao [, ...]

onde modoLtransa./o um dosX


ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED } READ WRITE | READ ONLY

E@em3loX Definindo 3ara a transa.aoX


SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

5erifi%andoX
SHOW TRANSACTION ISOLATION LEVEL;

10

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

Definindo 3ara a sess/o a?ertaX


SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL READ COMMITTED;

-0.2.# - BHvel de 3solamento Read +ommited (LF Efetivado, ] o nP&el de isolamento 3adr/o do PostgreSQL. Em uma transa./o so? este nP&elI o %omando SELE#T en@erga a3enas os dados efeti&ados antes da %onsulta e nun%a dados n/o efeti&ados ou as altera.!es efeti&adas 3or transa.!es simultRneas durante a e@e%u./o da %onsulta 73ormI o SELE#T en@erga os efeitos das atualiza.!es anteriores e@e%utadas dentro da sua 3r;3ria transa./oI mesmo 4ue ainda n/o tenMam sido efeti&adas8. 2 %omando SELE#TI na &erdadeI en@erga um instantRneo do ?an%o de dadosI %omo era no momento em 4ue a %onsulta %ome.ou. De&e ser notado 4ue dois %omandos SELE#T su%essi&os 3odem en@ergar dados diferentes mesmo dentro da mesma transa./oI se outras transa.!es efeti&arem altera.!es durante a e@e%u./o do 3rimeiro SELE#T. -0.2.2 - BHvel de 3solamento SerialiDa le (SerialiD5vel, ] o nP&el de isolamento mais rigorosoI o 4ual emula a e@e%u./o em srie das transa.!esI %omo se fossem e@e%utadas uma a3;s a outraI ao in&s de ao mesmo tem3o. PormI os a3li%ati&os 4ue utilizemeste nP&el de isolamento de&em estar 3re3arados 3ara tentar e@e%utar as transa.!es no&amenteI de&ido Z falMas de serializa./o. Em uma transa./o %ontida nesse nP&el de isolamentoI o %omando SELE#T en@erga a3enas os dados efeti&ados antes da transa./o %ome.ar e nun%a os n/o efeti&ados ou altera.!es efeti&adas durante a e@e%u./o da transa./o 3or transa.!es simultRneas 7PormI o SELE#T en@erga os efeitos das atualiza.!es anteriores e@e%utadas dentro da sua 3r;3ria transa./oI mesmo 4ue ainda n/o tenMam sido efeti&adas8. Se difere do Read 3elo fato de o SELE#T en@ergar um instantRneo do momento de inP%io da transa./oI n/o do momento de inP%io do %omando %orrente dentro da transa./o. PortantoI SELE#Ts su%essi&os dentro de uma mesma transa./o sem3re en@ergam os mesmos dados. -0.6 - AaDendo &ma transa./o "ma transa./o de&e %ome.ar %om o %omando )EG-:X Sinta@eX
BEGIN [ WORK | TRANSACTION ] [ modo_transao [, ...] ]

2nde modoLtransa./o um dosX


ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED } READ WRITE | READ ONLY

As 3ala&ras WORK e TRANSACTION 3odem ser omitidas. A3;s o BEGINI 4ue de%lara 4ue a transa./o foi ini%iada tem se a se4uen%ia de %omandos deseEadaX
comando_SQL_1; comando_SQL_n;

E de3ois dos %omandosI se 3or algum moti&o 4uiser desfazN-los usa-se o %omando R2LL)A#AX
ROLLBACK;

11

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

:os e@em3los a seguir so?re transa./oI mesmo 4ue os %omandos seEam %o3iados e %oladosI de&em ser feitos um 3or um de modo 4ue se o?ser&e seu %om3ortamento e suas relati&as altera.!es. ] tam?m a%onselM6&el a?rir uma outra sess/o no mesmo ?an%o de dados 3ara o?ser&ar o 4ue a%onte%e 4uando sess!es diferentes tentam alterar o mesmo registro. E@em3loX
BEGIN ; -- Incio da transao; DELETE FROM colaboradores WHERE mat_id = '00035'; -- Remoo de um registro dentro da transao; SELECT * FROM colaboradores ; -- Em uma transao podemos ver dados ainda no efetivados; ROLLBACK ; -- Agora vamos fazer o banco de dados voltar ao estado anterior;

2 %omando ROLLBACK desfaz todas as altera.!es feitas 3elos %omandos a3;s o )EG-:. 9as se as altera.!es 4ue os %omandos fizeram de&em ser efeti&adasI usa-se o %omando #299-TX
COMMIT;

E@em3loX
BEGIN ; DELETE FROM colaboradores WHERE mat_id = '00035'; SELECT * FROM colaboradores ; COMMIT ; -- Agora efetivar as alteraes;

#olo%ando de forma geral uma transa./o tem o seguinte %or3oX


BEGIN; comando_SQL_1; comando_SQL_n; [COMMIT | ROLLBACK]

-0.7 - S!?EP$3BT - Ponto de Salvamento Define um no&o 3onto de sal&amento na transa./o atual. 2 3onto de sal&amento uma mar%a es3e%ial dentro da transa./o 4ue 3ermite desfazer todos %omandos e@e%utados a3;s a %ria./o do SAVEPOINTI dessa forma &oltando ao estado antes da %ria./o do 3onto de sal&amento. Sinta@eX
SAVEPOINT nome_savepoint;

1D

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

-0.7.# - R$LL9!+U T$ S!?EP$3BT ] usado 3ara desfazer at o 3onto de sal&amento. Sinta@eY


ROLLBACK TO [SAVEPOINT] nome_savepoint;

2?s.X A 3ala&ra <SAVEPOINT= 3ode ser omitida. E@em3loX


BEGIN ; DELETE FROM colaboradores WHERE mat_id = '00034'; SELECT * FROM colaboradores ; SAVEPOINT sp1; -- Criao do ponto de salvamento; UPDATE colaboradores SET salario = 600 WHERE mat_id = '00033'; SELECT * FROM colaboradores ; ROLLBACK TO sp1; SELECT * FROM colaboradores ; COMMIT ; -- Agora efetivar as alteraes antes de sp1 que no tiveram ROLLBACK TO;

-0.7.2 - RELE!SE S!?EP$3BT Destr;i um 3onto de sal&amento definido anteriormenteI mas mantm os efeitos dos %omandos e@e%utados a3;s a %ria./o do SA5EP2-:T. Sinta@eX
RELEASE [ SAVEPOINT ] nome_savepoint

E@em3loX
BEGIN ; DELETE FROM colaboradores WHERE mat_id = '00034'; SELECT * FROM colaboradores ; SAVEPOINT sp1; -- Criao do ponto de salvamento; UPDATE colaboradores SET salario = 600 WHERE mat_id = '00033'; SELECT * FROM colaboradores ; RELEASE sp1; -- O ponto de salvamento foi destrudo; SELECT * FROM colaboradores ; COMMIT; -- Mesmo com o ponto de salvamento destrudo, as alteraes podem ser efetivadas;

2s 3ontos de sal&amento somente 3odem ser esta?ele%idos dentro de um ?lo%o de transa./o. Podem Ma&er &6rios 3ontos de sal&amento definidos dentro de uma transa./o.

1G

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

-0.: - SELE+T b A$R CPD!TE Dentro de uma transa./oI atra&s dos registros sele%ionados ?lo4ueia os mesmos 3ara 4ue outras sess!es n/o os a3aguem ou alterem en4uanto a transa./o n/o for finalizada. E@em3loX Sess/o X
BEGIN; SELECT * FROM colaboradores WHERE cargo IS NULL FOR UPDATE; -- Todos os registros exibidos esto travados enquanto a transao no acabar;

Sess/o 'X
DELETE FROM colaboradores WHERE cargo IS NULL;

Sess/o X
COMMIT;

A3;s a efeti&a./o dos dados 3ela sess/o deseEa&a.

a sess/o ' 3qde finalmente fazer as altera.!es 4ue

D0

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

-# - +&rsores
#ursores s/o &ari6&eis 4ue a3ontam 3ara %onsultasI armazenam os resultadosI e%onomizam mem;ria n/o retornando todos os dados de uma s; &ez em %onsultas 4ue retornam muitas linMas. Para usu6rios da linguagem PLS3gSQLI normalmente n/o M6 ne%essidade de se 3reo%u3arem %om issoI E6 4ue os la.os b$2Rb utilizam internamente um %ursor 3ara e&itar 3ro?lemas %om mem;ria. "ma interessante utiliza./o retornar a referNn%ia a um %ursor %riado 3ela fun./oI 4ue 3ermite a 4uem e@e%utou ler as linMas. Assim 3ro3or%iona uma maneira efi%iente 3ara a fun./o retornar grandes %onEuntos de linMas. #ursores 3odem retornar dados no formato te@to ou no formato ?in6rio 3elo %omando $ET#>. Por 3adr/o retornam dados no formato te@toI assim %omo os 3roduzidos 3elo %omando SELE#T. Sinta@e de %ria./o de um %ursorX
DECLARE nome [ BINARY ] [ INSENSITIVE ] [ [ NO ] SCROLL ] CURSOR [ { WITH | WITHOUT } HOLD ] FOR comando [ FOR { READ ONLY | UPDATE [ OF coluna [, ...] ] } ]

ParRmetrosX
nome )-:ARB -:SE:S-T-5E :ome do %ursorY Retorna os dados no formato ?in6rio ao in&s do formato te@to. -ndi%a 4ue os dados retornados 3elo %ursor n/o de&em ser afetados 3elas atualiza.!es feitas nas ta?elas su?Ea%entes ao %ursorI en4uanto o %ursor e@istir. :o PostgreSQL todos os %ursores s/o -:SE:S-T-5E. Atualmente esta 3ala&ra %Ma&e n/o 3roduz efeitoI estando 3resente 3or moti&o de %om3ati?ilidade %om o 3adr/o SQL. Es3e%ifi%a 4ue o %ursor 3ode ser utilizado 3ara retornar linMas de uma maneira n/o se4uen%ial 73or e@em3loI 3ara tr6s8. De3endendo da %om3le@idade do 3lano de e@e%u./o do %omandoI es3e%ifi%ar S#R2LL 3ode im3or uma 3enalidade de desem3enMo no tem3o de e@e%u./o do %omando. $az %om 4ue o %ursor n/o retorne linMas de uma maneira n/o se4yen%ial. ] re%omendado usar essa o3./o 3ara fins de desem3enMo e e%onomia de mem;ria 4uando 3re%iso 4ue as linMas a serem retornadas seEam se4uen%iais. Es3e%ifi%a 4ue o %ursor 3ode %ontinuar sendo utilizado a3;s a transa./o 4ue o %riou ter sido efeti&ada %om su%esso ou at mesmo %riar um %ursor sem estar dentro de uma transa./o. Es3e%ifi%a 4ue o %ursor n/o "ode ser utilizado fora da transa./o 4ue o %riou. Quando n/o es3e%ifi%ado nem H-T>2"T >2LD nem H-T> >2LDI o 3adr/o H-T>2"T >2LD. A %onsulta feita 3ara o %ursor retornar.

S#R2LL 7rolar8

:2 S#R2LL

H-T> >2LD H-T>2"T >2LD %omando

$2R READ 2:LB -ndi%a 4ue o %ursor ser6 utilizado no modo somente 3ara leitura. $2R "PDATE -ndi%a 4ue o %ursor ser6 utilizado 3ara atualizar ta?elas. "ma &ez 4ue as atualiza.!es 3or %ursor n/o s/o su3ortadas atualmente 3elo PostgreSQLI es3e%ifi%ar $2R "PDATE 3ro&o%a uma mensagem de erroI e es3e%ifi%ar $2R READ 2:LB n/o 3roduz efeito. As %olunas a serem atualizadas 3elo %ursor. "ma &ez 4ue as atualiza.!es 3or %ursor n/o s/o su3ortadas atualmente 3elo PostgreSQLI a %l6usula $2R "PDATE 3ro&o%a uma mensagem de erro.

%oluna

2?ser&a.!esX As 3ala&ras %Ma&e BINARYI INSENSITIVE e SCROLL 3odem estar em 4ual4uer ordem. Se WITH HOLD n/o for es3e%ifi%adoI o %ursor %riado 3or este %omando 3oder6 ser utilizado somente dentro da transa./o %orrente. E se a efeti&a./o da transa./o 4ue %riou o %ursor for ?em-su%edidaI o %ursor 3oder6 %ontinuar sendo a%essado 3elas transa.!es seguintes na mesma sess/o 79as se a transa./o 4ue %riou o %ursor for interrom3idaI o %ursor ser6 remo&ido8. 2 %ursor %riado %om WITH HOLD fe%Mado 4uando su?metido um %omando #L2SE e@3lP%ito 3ara o %ursorI ou 4uando a sess/o termina. Se for es3e%ifi%ado NO SCROLLI retornar linMas 3ara tr6s n/o ser6 3ermitido em nenMum %aso. 2 3adr/o SQL somente trata de %ursores na linguagem SQL in%or3orada. 2 ser&idor PostgreSQL n/o im3lementa o %omando 2PE: 3ara %ursoresY o %ursor %onsiderado a?erto ao ser de%larado. Entretanto o E#PGI o 3r-3ro%essador do PostgreSQL 3ara a linguagem SQL in%or3oradaI su3orta as %on&en.!es de %ursor do 3adr/o SQLI in%luindo as 4ue en&ol&em os %omandos DECLARE e OPEN.
D

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

E@em3losX #riando um %ursor dentro de uma transa./oX


BEGIN; DECLARE cursor1 CURSOR FOR SELECT * FROM colaboradores; COMMIT;

#riando um %ursor fora de uma transa./oX


DECLARE cursor2 CURSOR WITH HOLD FOR SELECT * FROM colaboradores;

-#.# - AET+J - Rec&"erando lin1as de &m c&rsor Para tal tarefa usado o %omando Sinta@eX
FETCH [ direo { FROM | IN } ] nome_cursor FETCHI

4ue em inglNs signifi%a ?us%arI trazerI al%an.ar...

2nde dire./o 3ode ser &azio ou um dosX


:EFT PR-2R $-RST LAST A)S2L"TE n Pr;@ima linMa. Este o 3adr/o 4uando a dire./o omitida. LinMa anterior. Primeira linMa da %onsulta 7o mesmo 4ue A)S2L"TE 8. zltima linMa da %onsulta 7o mesmo 4ue A)S2L"TE - 8. A n-sima linMa da %onsultaI ou a a?s7n8-sima linMa a 3artir do fim se o n for negati&o. Posi%iona antes da 3rimeira linMa ou a3;s a [ltima linMa se o n esti&er fora do inter&aloY em 3arti%ularI A)S2L"TE 0 3osi%iona antes da 3rimeira linMa. A n-sima linMa Z frenteI ou a a?s7n8-sima linMa atr6s se o n for negati&o. RELAT-5E 0 retorna no&amente a linMa %orrenteI se Mou&er. As 3r;@imas n linMas 7o mesmo 4ue $2RHARD n8. ] uma %onstante inteiraI 3ossi&elmente %om sinalI 4ue determina a 3osi./o ou o n[mero de linMas a serem retornadas. Para os %asos $2RHARD e )A#AHARDI es3e%ifi%ar um n negati&o e4ui&alente a mudar o sentido de $2RHARD e )A#AHARD. Todas as linMas restantes 7o mesmo 4ue $2RHARD ALL8. Pr;@ima linMa 7o mesmo 4ue :EFT8. As 3r;@imas n linMas. $2RHARD 0 retorna no&amente a linMa %orrente. Todas as linMas restantes. LinMa anterior 7o mesmo 4ue PR-2R8. As n linMas anteriores 7&arrendo 3ara tr6s8. )A#AHARD 0 retorna no&amente a linMa %orrente. Todas as linMas anteriores 7&arrendo 3ara tr6s8.

RELAT-5E n n

ALL $2RHARD $2RHARD n $2RHARD ALL )A#AHARD )A#AHARD n )A#AHARD ALL

E@em3losX
FETCH FETCH FETCH FETCH FETCH FETCH FETCH cursor2; --Por padro retorna a prxima linha 2 IN cursor2; --Retorna as prximas 2 linhas -1 IN cursor2; Retorna a linha anterior FORWARD FROM cursor2; --Prxima linha FORWARD 7 FROM cursor2; --Prximas 7 linhas FIRST FROM cursor2; --Sempre retornar a primeira linha LAST FROM cursor2; --Sempre retornar a ltima linha

D'

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

-#.2 - 8$?E * 8ovendo +&rsores 2 %omando MOVE faz a mudan.a na 3osi./o de um %ursor sem retornar linMas. Sua sinta@e similar Z do FETCHX
MOVE [ direo { FROM | IN } ] nome_cursor

E@em3loX
MOVE -7 FROM cursor2; --Volta 7 posies do cursor

-#.- - +L$SE * Aec1ando +&rsores >6 duas maneiras de se fe%Mar um %ursorI de forma im3lP%itaY 4uando uma transa./o en%errada ou n/o se %on%retiza 7COMMIT ou ROLLBACK8 e de forma e@3lP%itaI %om o %omndo CLOSEX Sinta@eX
CLOSE { nome | ALL }

E@em3losX
CLOSE cursor2; --Fecha o cursor2 CLOSE ALL; --Fecha todos cursores abertos

D(

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

-2 - 9L$9 * 9inar) Large $94ect ($ 4eto Grande 9in5rio,


Sua utilidade est6 em armazenar ar4ui&os dentro do ?an%o de dadosI seEam eles figurasI somI e@e%ut6&eis ou 4ual4uer outro. 2s dados de um ?lo? s/o do ti3o <?Ctea=. Para se inserir ou re%u3erar ?lo?s no PostgreSQL ne%ess6rio utilizar as fun.!esY loLim3ort7te@t8X Seu 3arRmetro a lo%aliza./o do ar4ui&o a ser inserido no ?an%o. Essa fun./o retorna o identifi%ador do ar4ui&o inserido 7oid8. loLe@3ort7oidIte@t8X Seus 3arRmetros s/o res3e%ti&amente o oid do )L2) e a lo%aliza./o futura do ar4ui&o.

A3;s im3ortar um ar4ui&o 3ara a ?ase de dadosI o %am3o da ta?ela s; ter6 o oidI 4ue faz referNn%ia 3ara os dados do )L2) 4ue na &erdade se en%ontram na ta?ela de sistema <3gLlargeo?Ee%t=. E@em3loX
/* Tabela do BLOB */ CREATE TABLE figuras( id_figura oid, nome_figura varchar(15) ); /* Importando o objeto para dentro do banco de dados */ INSERT INTO figuras VALUES (lo_import('/tmp/figura1.jpg'),'Figura 1'); /* Recuperando o objeto no diretrio /tmp */ SELE#T loLe@3ort7idLfiguraIoStm3S%o3iaLfigura .E3go8 $R29 figuras H>ERE nomeLfigura _ o$igura oY

-2.# - Removendo 9L$9s 9esmo a3agando uma linMa de um )L2) %om o %omando <DELETE= na ta?ela <figuras=I o o?Eeto ?in6rio relati&o n/o ser6 remo&ido da ta?ela <3gLlargeo?Ee%t=. Para tal de&e-se usar a fun./o <loLunlinW7oid8=I %uEo 3arRmetro o oid do )L2). E@em3loX
SELECT lo_unlink(16484);

ou tam?m 3oderia serX


SELECT lo_unlink(id_figura) FROM figuras WHERE nome_figura = 'Figura 1';

Agora n/o e@iste mais o o?Eeto ?in6rioI ent/o 3ode-se a3agar a referNn%ia a ele na ta?ela <figuras=X
DELETE FROM figuras WHERE nome_figura = 'Figura 1';

D+

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

-- - A&n.>es +riadas Pelo Cs&5rio


2 PostgreSQL tem 4uatro ti3os de fun./oX Es%ritas em SQLY -nternasY Es%ritas na linguagem #. Pro%eduraisI es%ritas em PLS3gSQL ou PLST%lI 3or e@em3loY

Todos os ti3os de fun./o a%eitam ti3os ?ase ou %om3ostos ou %om?inadosI %omo 3arRmetros. E tam?m 3odem retornar um %onEunto de &alores ?ase ou %om3osto. Sinta@eX
CREATE [ OR REPLACE ] FUNCTION nome ( [ [ modo ] [ nome ] tipo [, ...] ] ) [ RETURNS tipo_retorno ] { LANGUAGE nome_linguagem | IMMUTABLE | STABLE | VOLATILE | CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | COST custo_execuo | ROWS registros_retornados | SET parmetro_configurao { TO valor | = valor | FROM CURRENT } | AS 'definio' | AS 'arquivo_objeto', 'link_simblico' } ... [ WITH ( atributo [, ...] ) ]

#or3o de uma fun./o sim3lifi%adoX


CREATE [OR REPLACE] FUNCTION nome_funcao(parametros) RETURNS tipo AS delimitador comando1; comandoN; delimitador LANGUAGE linguagem;

2?s.X Quando se %ria uma fun./o de uma forma geral temosX CREATE FUNCTION nome Se 4uisermos so?res%re&N-la usamos CREATE OR REPLACE FUNCTION nome... :o entanto s; &6lido so?res%re&er uma fun./o se o ti3o de retorno for o mesmo da original. #aso %ontr6rio ter6 4ue 3rimeiro a3agar a fun./o. --.# - A&n.>es SQL E@e%utam uma lista de de%lara.!es SQL e retornam o resultado da [ltima %onsulta dessa lista. --.#.# - A&n.>es com Retorno B&lo

A [ltima de%lara./o de uma fun./o de&e ser um seu retorno seEa de%larado do ti3o &oid. E@em3loX

SELECTI

o 4ual ser&ir6 %omo retornoI a n/o ser 4ue

CREATE FUNCTION func_teste() RETURNS void AS $$ DELETE FROM colaboradores WHERE cargo IS NULL; $$ LANGUAGE SQL; SELECT func_teste(); -- Usando a funo;

D,

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

--.#.2 - A&n.>es com Retorno B/o B&lo $un.!es 3odem retornar uma linMa ou um %onEunto de linMas. :os %asos em 4ue o retorno n/o um %onEuntoI a 3rimeira linMa do resultado da [ltima %onsulta 3assa a ser o retorno da fun./o mesmo 4ue tenMam mais linMas. Se a [ltima %onsulta n/o retornar nenMuma linMa o retorno nulo. E@em3loX
CREATE OR REPLACE FUNCTION func_teste2() RETURNS varchar(15) AS $$ SELECT nome FROM colaboradores ORDER BY nome; $$ LANGUAGE SQL;

--.#.- - !"agando &ma A&n./o #omo se faz %om a maior 3arte dos ti3os de o?Eetos... E@em3loX
DROP FUNCTION func_teste();

--.#.2 - A&n.>es %&e Retornam +on4&ntos Para 4ue uma fun./o retorne um %onEunto de&e-se es3e%ifi%ar o retorno %omo sendo 4ue <algumLti3o= 3ode ser uma ta?ela. E ent/o todas as linMas do resultado s/o retornadas. E@em3loX
CREATE OR REPLACE FUNCTION func_teste() RETURNS SETOF colaboradores AS $$ SELECT * FROM colaboradores WHERE uf='RJ'; $$ LANGUAGE SQL; SETOF algum_tipoI

Podemos in%lusi&e usar fun.!es 4ue retornam &6rias linMas de uma ta?ela %omo se a mesma fosse uma ta?ela. E@em3losX
SELECT nome FROM func_teste(); SELECT * FROM func_teste();

--.#.6 - A&n.>es com ParRmetros "ma fun./o 3ode ser %riada %om ou sem 3arRmetros. 2s 3arRmetros n/o s/o nomeadosI de&em ser %olo%ados a3enas os ti3os entre os 3arNnteses e no %aso de ser mais de um de&em ser se3arados 3or &Prgulas. :os %omandosI %ada 3arRmetro %Mamado 3ela referNn%ia <vn=I onde <n= a 3osi./o 4ue %orres3onde ao 3arRmetro. E@em3losX
-- Funo de apenas um parmetro; CREATE OR REPLACE FUNCTION func_teste(char(5)) RETURNS text AS $$ SELECT nome||' : '||salario FROM colaboradores WHERE mat_id=$1; $$ LANGUAGE SQL;

D0

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

SELECT func_teste('00001'); -- O parmetro de ver inserido de acordo com o tipo; CREATE OR REPLACE FUNCTION func_teste(real,char(2)) RETURNS SETOF text AS $$ SELECT nome||' '||snome FROM colaboradores WHERE salario<=$1 AND uf=$2; $$ LANGUAGE SQL; SELECT func_teste(3000,'SP'); -- Dois parmetros inseridos na funo CREATE OR REPLACE FUNCTION daqui_uma_semana(date) RETURNS date AS ' SELECT $1+7; ' LANGUAGE SQL; SELECT daqui_uma_semana('01/07/2009');

--.#.7 - So recarga de A&n./o "m re%urso muito usado em linguagens de 3rograma./o 2rientadas a 2?Eeto 7Ja&aI 3or e@em3lo8I 3ossi?ilita %riar mais de uma fun./o %om o mesmo nomeI desde 4ue os 3arRmetros seEam diferentes. 2u seEaI nomes de fun.!es 3odem ser so?re%arregados. Quando se e@e%uta um %omandoI o ser&idor determina 4ual fun./o e@atamente de&e ser %Mamada tomando %omo ?ase os ti3os de dados e os 3arRmetros. Pode-se utilizar so?re%arga de fun.!es 3ara simular fun.!es %om n[mero &ari6&el de 3arRmetros 7numero m6@imo finito8. E@em3losX
-- Funo com parmetros do tipo real; CREATE OR REPLACE FUNCTION soma_parametros(real,real) RETURNS real AS $$ SELECT $1+$2; $$ LANGUAGE SQL; -- Funo com parmetros do tipo varchar; CREATE OR REPLACE FUNCTION soma_parametros(varchar,varchar) RETURNS varchar AS $$ SELECT $1||' '||$2; $$ LANGUAGE SQL; SELECT soma_parametros(333,444); -- Parmetros do tipo real; SELECT soma_parametros('PostgreSQL','rulz!!!'); -- Parmetros do tipo varchar;

Para a3agar fun.!es so?re%arregadas 3re%iso es3e%ifi%ar os ti3os de 3arRmetros. Portando se deseEarmos a3agar as duas &aria.!es de <somaL3arametros78= de&emos fazer da seguinte maneiraX
DROP FUNCTION soma_parametros (real,real); DROP FUNCTION soma_parametros (varchar,varchar);

D1

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

--.2 - A&n.>es internas S/o fun.!es es%ritas na Linguagem # 4ue foram estati%amente ligadas ao ser&idor PostgreSQL. Todas as fun.!es internas 4ue est/o no ser&idorI normalmenteI s/o de%laradas na ini%ializa./o do %lusterI 3orm o usu6rio 3ode %riar aliases 3ara uma fun./o interna atra&s do %omando #REATE $":#T-2:. E@em3loX
CREATE FUNCTION raizquad(double precision) RETURNS double precision AS 'dsqrt' LANGUAGE internal STRICT; SELECT raizquad(49);

2?s.X :em todas as fun.!es <3r-definidas= s/o <internas= no sentido a%ima. Algumas fun.!es 3r-definidas s/o es%ritas em SQL. --.- - A&n.>es na ling&agem + 2 usu6rio 3ode definir fun.!es em #I as 4uais de&em ser %om3iladas %omo ?i?liote%as e s/o %arregadas %onforme s/o re4uisitadas 3elo ser&idor. $un.!es %om3iladas ganMam maior desem3enMo do 4ue fun.!es es%ritas em linguagens %om3iladas. --.2 - Ling&agens "roced&rais :o PostgreSQL 3ossP&el definir fun.!es 3elo usu6rio alm de SQL e #. Essas linguagens s/o generi%amente %Mamadas de linguagens 3ro%edurais 7PLX Pre%edural Language8. S/o e@em3los de PLsX PLS3gSQLI PLST%lI PLSPerlI PLSPCtMon e outras linguagens definidas 3elo usu6rio. >6 outras PLs adi%ionaisI 3orm n/o s/o in%luPdas na distri?ui./o n[%leo. --.2.# - 3nstala./o de ling&agem "roced&ral A linguagem 3ro%edural de&e ser instalada em %ada ?an%o onde ser6 utilizada. Se instalar no ?an%o de dados tem3late I automati%amente estar6 dis3onP&el 3ara todos os ?an%os dados 4ue forem %riados a3;s a instala./o da linguagemI sendo 4ue suas entradas em tem3late s/o %o3iadas. Ent/o o administrador 3ode definir 4uais linguagens fi%ar/o dis3onP&eis de a%ordo %om o ?an%o de dadosI in%lusi&eI se 4uiser tornar algumas 3adr/o. Para instalar a linguagem PLS3gSQL no ?an%o de dados atual use a sinta@eX
CREATE LANGUAGE plpgsql;

2u se 3referirI use o a3li%ati&o %reatelang no sMellX


createlang plpgsql banco_de_dados

--.2.2 - PLI"gSQL PLS3gSQL uma linguagem 3ro%edural %arreg6&el feita 3ara o PostgreSQLI a 4ual similar Z PLSSQL do 2ra%le. En4uanto de%lara.!es SQL s/o e@e%utadas indi&idualmente 3elo ser&idorI a linguagem PLS3gSQL agru3a um ?lo%o de 3ro%essamento e %omandos em srie dentro do ser&idorI somando o 3oder da linguagem 3ro%edural %om a fa%ilidade do SQL.
DD

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

E%onomiza-se tem3oI de&ido ao fato de n/o ser ne%ess6rio so?re%arregar a %omuni%a./o entre %liente e ser&idorI aumentando o desem3enMo. Em PLS3gSQL todos os ti3os de dadosI o3eradores e fun.!es SQL 3odem ser utilizados. A utiliza./o de um editor de te@to 3referido 3elo usu6rio a%onselM6&el 3ara se desen&ol&er em PLS3gSQL. Em uma Eanela se es%re&e o %;digo 73elo editor8 e em outra utiliza-se o 3s4l 3ara %arregar as fun.!es es%ritas. "tilizando b#REATE 2R REPLA#E $":#T-2:b re%omend6&el 3ara fins de atualiza./o do 4ue E6 foi %riado. --.2.2.# - Estr&t&ra PLI"gSQL A linguagem PLS3gSQL estruturada em ?lo%os. 2 te@to %om3leto da defini./o da fun./o de&e ser um ?lo%o. "m ?lo%o definido %omoX
[ <<rtulo>> ] [ DECLARE declaraes ] BEGIN instrues END;

De%lara.!es e instru.!es dentro do ?lo%o de&em ser terminadas %om 3onto-e-&Prgula. "m ?lo%o dentro de outro ?lo%o de&e ter um 3onto-e-&Prgula a3;s o E:DI %onforme e@i?ido a%imaI entretantoI o E:D final 4ue %on%lui o %or3o da fun./o n/o re4uer o 3onto-e-&Prgula. Pala&ras %Ma&es e identifi%adores 3odem ser es%ritos mes%lando letras mai[s%ulas e min[s%ulas. As letras dos identifi%adores s/o %on&ertidas im3li%itamente em min[s%ulasI a menos 4ue esteEam entre as3as. >6 dois ti3os de %oment6rios no PLS3gSQL. 2 MPfen du3lo 7--8 %oment6rio de linMa. 2 SK ini%ia um ?lo%o de %oment6rio &ai at a 3r;@ima o%orrNn%ia de KS. 2s ?lo%os de %oment6rio n/o 3odem ser aninMadosI mas %oment6rios de linMa 3odem estar dentro de ?lo%os de %oment6rioI e os MPfens du3los es%ondem os delimitadores de ?lo%o de %oment6rio SK e KS. 5ari6&eis de%laradas na se./o de de%lara./o 4ue ante%ede um ?lo%o s/o ini%ializadas %om seu &alor 3adr/o toda &ez 4ue o ?lo%o e@e%utadoI e n/o somente uma &ez a %ada %Mamada da fun./o. Por e@em3loX
CREATE FUNCTION teste_escopo() RETURNS integer AS $$ <<bloco_externo>> DECLARE quantidade integer := 30; BEGIN RAISE NOTICE 'Aqui a quantidade %', quantidade; -- A quantidade aqui 30 quantidade := 50; -- Sub-bloco-------------------------------------------------------------------------------<<bloco_interno>> DECLARE quantidade integer := 80; BEGIN RAISE NOTICE 'Aqui a quantidade %', quantidade; -- A quantidade aqui 80 END; -- Fim do sub-bloco------------------------------------------------------------------------RAISE NOTICE 'Aqui a quantidade %', quantidade; -- A quantidade aqui 50 RETURN quantidade; END; $$ LANGUAGE plpgsql;

2?s.X :/o %onfundir o uso )EG-:SE:D de agru3amento de instru.!es PLS3gSQL %om %ontrole de transa./o. )EG-:SE:D de PLS3gSQL s; 3ara agru3amentoI n/o ini%iam nem terminam transa.!es.

DG

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

--.2.2.2 - Declara.>es 5ari6&eis utilizadas em um ?lo%o de&em ser de%laradas em DECLARE 7e@%eto a &ari6&el de la.o FOR 4ue interage so?re um inter&alo de &alores inteirosI 4ue automati%amente de%larada %omo do ti3o inteiro8. As &ari6&eis PLS3gSQL 3odem ser de 4ual4uer ti3o SQL. A sinta@e geral 3ara de%lara./o de &ari6&eis X
nome [ CONSTANT ] tipo [ NOT NULL ] [ { DEFAULT | := } expresso ]; DEFAULT CONSTANT NOT NULL Se for inserida, especifica o valor padro varivel quando o bloco for processado. Caso contrrio, a varivel ter seu valor nulo. No permite que seja atribudo outro valor varivel, mantendo o valor constante enquanto o bloco durar. Faz com que seja obrigatria uma atribuio de valor no nulo varivel

E@em3losX
num_peca integer CONSTANT integer := 97; qtd numeric(7); url varchar:= 'http://meu-site.com'; minha_linha nome_da_tabela%ROWTYPE; meu_campo nome_da_tabela.nome_da_coluna%TYPE; uma_linha RECORD; quantidade integer DEFAULT 32;

--.2.2.- - !liases de ParRmetros de A&n./o ParRmetros de uma fun./o tem %omo identifi%adores a sim?ologia vnI sendo 4ue n o n[mero relati&o Z 3osi./o do 3arRmetro. :o entantoI 3odemos melMorar a legi?ilidade do %;digo atri?uindo aliasesI nomeando os 3arRmetros. E@em3loX
CREATE OR REPLACE FUNCTION calcula_imposto(preco real,porcent_imp real) RETURNS real AS $$ BEGIN RETURN preco*(porcent_imp/100); END; $$ LANGUAGE plpgsql;

A outra formaI 4ue era a [ni%a dis3onP&el antes da &ers/o D.0 do PostgreSQLI de%larar e@3li%itamente um alias utilizando a sinta@e de de%lara./oX
nome ALIAS FOR $n;

2 e@em3lo a%ima es%rito utilizando este estilo fi%a da seguinte maneiraX


CREATE OR REPLACE FUNCTION calcula_imposto(real,real) RETURNS real AS $$ DECLARE preco ALIAS FOR $1; porcent_imp ALIAS FOR $2; BEGIN RETURN preco*(porcent_imp/100); END; $$ LANGUAGE plpgsql;

G0

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

--.2.2.2 - SELE+T 3BT$ Quando uma %onsulta retorna &6rias %olunas 7de a3enas uma linMa8I o resultado 3ode ser atri?uPdo a uma &ari6&el registro 7RECORD8I ou do ti3o linMa 7%ROWTYPE8 ou uma lista de &ari6&eis es%alares 7lista de e@3ress!es8. Da seguinte formaX
SELECT INTO destino expressoes_de_consulta FROM ...;

Sendo 4ue bdestinob 3ode ser uma &ari6&el do ti3o RECORD ou ROWTYPE ou uma lista se3arada 3or &Prgulas de &ari6&eis sim3les e %am3os de registroSlinMaI be@3ressoesLde-%onsultab e o restante do do%mando s/o %omo no 3uro SQL. A inter3reta./o de SELECT INTO em PLS3gSQL diferente da inter3reta./o 3adr/o do PostgreSQL. Pois na forma 3adr/o uma no&a ta?ela %riada %om o nome referente a bdestinobI %onforme mostrado a%ima. Se for ne%ess6rio %riar uma ta?ela dentro de uma fun./o PLS3gSQL a 3artir do resultado de uma %onsulta de ser usada a sinta@e CREATE TABLE nova_tabela AS consulta. --.2.2.6 - !tri &tos A linguagem PLS3gSQL dis3oni?iliza atri?utos 3ara au@iliar a lidar ti3os de dados. S/o elesX
%ROWTYPE. TYPE%

Atri?utos s/o usados 3ara de%larar &ari6&eis 4ue %oin%idam %om o ti3o de dado de uma %oluna 7%TYPE8 ou 3ara %orres3onder Z estrutura de uma linMa 7 %ROWTYPE8. :/o 3re%iso sa?er o ti3o de dado 4uando se usa atri?utos 3ara de%larar &ari6&eis. Se um o?Eeto for alterado futuramenteI o ti3o daa &ari6&el mudar6 automati%amente 3ara o ti3o de dado sem alterar o %;digo. --.2.2.6.# - Ti"o de ?ari5vel +o"iado * vari5vel cTEPE A e@3ress/o %TYPE forne%e o ti3o da &ari6&el ou da %oluna da ta?ela. Pode ser utilizada 3ara de%larar &ari6&eis 4ue guardam &alores do ?an%o de dados. Por e@em3loI su3ondo 4ue e@ista uma %oluna %Mamada id_produto na ta?ela 3rodutosI 3ara de%larar uma &ari6&el %om o mesmo ti3o de dado de 3rodutos.idL3rodutoX
id_produto produtos.id_produto%TYPE;

#om TTBPE n/o 3re%iso sa?er o ti3o de dado da estrutura referen%iada eI ainda mais im3ortanteI se o ti3o de dado do item referen%iado mudar no futuro 73or e@em3loX o ti3o de dado de idL3roduto for mudado de integer 3ara real8I n/o 3re%isar6 mudar a defini./o na fun./o. --.2.2.6.2 - ?ari5vel Ti"o Lin1a - cR$@TEPE Pode armazenar uma linMa inteira do resultado de uma %onsulta se o %onEunto de %olunas do %omando for do mesmo ti3o de%larado 3ara a &ari6&el. #ada %oluna 3ode ser referen%iado indi&idualmente usando a nota./o var.coluna. Ao de%larar uma &ari6&el-linMa 3ode ter o mesmo ti3o das linMas de uma ta?ela %om a nota./o ta?ela%ROWTYPE ou sua de%lara./o es3e%ifi%ando um ti3o %om3osto 7ta?elas 3ossuem um ti3o %om3osto asso%iadoI sendo o 3r;3rio nome da ta?ela8. Por 4uest!es de 3orta?ilidade %on&m-se es%re&er %ROWTYPEI mas 3ara o PostgreSQL n/o faz diferen.a. Sinta@eX
variavel tabela%ROWTYPE; variavel tipo_composto;

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

E@em3loX
CREATE OR REPLACE FUNCTION matricula2nome(matricula char(5)) RETURNS text AS $$ DECLARE /* A varivel nome_colaborador aqui j recebe a estrutura da tabela colaboradores */ nome_colaborador colaboradores%ROWTYPE; BEGIN -- A consulta para dar o retorno da funo SELECT INTO nome_colaborador * FROM colaboradores WHERE mat_id = matricula; -- Retorna o primeiro RETURN nome_colaborador.nome||' '||nome_colaborador.snome; END; $$ LANGUAGE 'plpgsql'; SELECT matricula2nome('00007') AS "Nome Inteiro";

--.2.2.7 - Ti"o Registro * RE+$RD 5ari6&eis do ti3o RE#2RD s/o similares a &ari6&eis do ti3o ROWTYPEI 3orm RECORD n/o tem uma estrutura 3r definida. Elas assumem a estrutura da linMa atual 4ue foi atri?uPda 3or uma %onsulta. Essa atri?ui./oI 4ue o assinalamento se d6 3elo %omando SELECT INTO ou FOR. A su?-estrutura de uma &ari6&el RECORD 3ode mudar %ada &ez 4ue for usada em uma atri?ui./o. Se uma &ari6&el do ti3o RECORD for a%essada antes de ser assinaladaI Ma&er6 um erro. RECORD na &erdade n/o um ti3o de dados real e sim um es3a.o reser&ado. Sinta@eX
variavel RECORDY

E@em3loX
CREATE OR REPLACE FUNCTION matricula2nome(matricula char(5)) RETURNS text AS $$ DECLARE nome_colaborador RECORD; BEGIN SELECT INTO nome_colaborador * FROM colaboradores WHERE mat_id = matricula; -- Retorna o primeiro RETURN nome_colaborador.nome||' '||nome_colaborador.snome; END; $$ LANGUAGE 'plpgsql'; SELECT matricula2nome('00001');

--.2.2.: - REB!8E Renomeia &ari6&eisI registros ou linMas. Tem %omo mair utilidade 4uando :EH ou 2LD de&em ser referen%iados 3or outro nome dentro da fun./o de um trigger. 2)S.X Desde a &ers./o 1.( do PostgreSQLI RE:A9E 3are%e estar %om 3ro?lemas. A %orre./o tem ?ai@a 3rioridadeI de&ido ao fato de AL-AS atender a maior 3arte dos usos 3r6ti%os de RE:A9E. Sinta@eX
RENAME antigo_nome TO novo_nome;

E@em3loX
RENAME nome TO nome_funcionario;

G'

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

--.2.2.; - !tri &i.>es Para atri?uir &alor a uma &ari6&elI ou a um %am3o de linMa ou de registroI se faz da seguinte maneiraX
identificador := valor;

2 &alor 3ode ser tam?m uma e@3ress/o 4ue seEa e4ui&alente a um &alor. E@em3losX
quantidade := $1; i INT:=0; -- Quando a varivel criada, tambm pode atribuir valor a ela; preco := 5.27; total := quantidaade * preco;

--.2.2.< - PERA$R8 - EPec&./o sem Res&ltado Em %ertos %asosI deseEa-se a&aliar um %omando e des3rezar seu resultado 7es3e%ialmente 4uando uma fun./o 3roduz efeitos indeseEados eSou n/o tem um &alor [til de resultado. :a linguagem PLS3gSQL usado a instru./o PERFORM. Sinta@eX
PERFORM comando;

A instru./o de&e ser e@%rita da mesma forma 4ue uma %onsulta SQLI 3orm su?stituindo a 3ala&ra %Ma&e SELECT 3or PERFORM. A &ari6&el es3e%ial FOUND btrueb se %aso o %omando resultar 3elo menos uma linMa ou bfalseb se n/o 3roduzir nenMuma. E@em3loX "ma fun./o 4ue a3enas diz se uma matrP%ula %orres3onde a um %ola?orador sem dizer 4ualX

CREATE OR REPLACE FUNCTION colab_teste(char(5)) RETURNS text AS $$ BEGIN --Uso do PERFORM para desprezar o resultado PERFORM * FROM colaboradores WHERE mat_id=$1; --Se PERFORM "Achar" (FOUND) pelo menos uma linha verdadeiro (true) IF FOUND THEN RETURN 'Existe o colaborador!'; ELSE --Uma Nota com mensagem personalizada RAISE NOTICE 'Colaborador de matricula % nao foi encontrado',$1; RETURN 'Erro!!!'; END IF; END; $$ LANGUAGE plpgsql;

G(

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

--.2.2.#0 - BCLL - B/o AaDer Bada ss &ezes %onforme a situa./oI ao in&s de e@e%utar %omandosI 3ode-se sim3lesmente ignorar e e@e%utar nada. Para isso utiliza-se a instru./o NULL. E@em3loX As duas fun.!es a?ai@o s/o e4ui&alentesX

CREATE OR REPLACE FUNCTION teste_div(int,int) RETURNS int AS $$ BEGIN RETURN $1/$2; EXCEPTION WHEN division_by_zero THEN NULL; -- ignora o erro com a instruo NULL RETURN NULL;

END; $$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION teste_div(int,int) RETURNS int AS $$ BEGIN RETURN $1/$2; EXCEPTION WHEN division_by_zero THEN -- ignora o erro omitindo a instruo NULL RETURN NULL; END; $$ LANGUAGE plpgsql;

Qual4uer uma das formas no PostgreSQL &6lida. 2?s.X :a linguagem PLSSQL do 2ra%le instru.!es &azias n/o s/o 3ermitidasI a instru./o o?rigat;ria em situa.!es %omo essas.
NULL

G+

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

--.2.2.## - EGE+CTE - EPec&./o DinRmica de +omandos Em %ertos %asos ne%ess6rio e@e%utar dinami%amente %omandos dentro de PLS3gSQL 4ue en&ol&am diferentes ta?elas e S ou ti3os de dados. A instru./o EXECUTE forne%ida 3ara este fim e@e%utando uma string 4ue %ontm um %omando SQL. Su?stitui.!es de &ari6&eis em PLS3gSQL n/o s/o feitas na string do %omando. Seus &alores de&em ser inseridos 4uando a string ela?orada. Resultados de SELECT s/o des3rezados 3elo EXECUTE e at o momento SELECT INTO n/o su3ortado. PortantoI n/o M6 %omo e@trair o resultado de um SELECT %riado dinami%amente %om EFE#"TE 3uro. PormI M6 dois Eeitos de se fazer issoX %om o la.o FOR-IN-EXECUTE ou um %ursor %om OPEN-FOR-EXECUTEI 4ue am?os ser/o &istos mais adiante. E@em3losX
CREATE OR REPLACE FUNCTION testaExecute() RETURNS text AS $$ BEGIN //*----------------------------------------------------------------O comando EXECUTE e a string. Devido ao fato da prpria string estar entre aspas simples, os valores string contidos nela devem estar entre dois pares de aspas simples (''string''), como se v abaixo: ---------------------------------------------------------------------- -*/ EXECUTE 'UPDATE colaboradores SET setor=''Higiene'' WHERE setor=''Limpeza'''; RETURN 'Ok!';

END; $$ LANGUAGE plpgsql;

SELECT testaExecute(); CREATE OR REPLACE FUNCTION testaExecute(tabela text,coluna text,valor_novo text,valor_antigo text) RETURNS text AS $marcador$ BEGIN EXECUTE 'UPDATE '||tabela||' SET '||coluna||'='||''''||valor_novo||''''||' WHERE '|| coluna||'='||''''||valor_antigo||''''; RETURN 'OK!'; END; $marcador$ LANGUAGE plpgsql; SELECT testaExecute('colaboradores','setor','Limpeza','Higiene');

--.2.2.#2 - Stat&s de &m Res&ltado >6 &6rias maneiras 3ara determinar o efeito de um %omando atra&s de dois mtodosX --.2.2.#2.# - #d 8todo - GET D3!GB$ST3+S
GET DIAGNOSTICS varivel = item;

Permite o?ter os indi%adores de status do sistema. bitemb uma 3ala&ra %Ma&e 4ue identifi%a o &alor de estado 3ara a &ari6&el es3e%ifi%ada. 2s itens de status 3odem serX -ROW_COUNTX Quantidade de linMas 3ro%essadas 3elo [ltimo %omando SQLY -RESULT_OIDX 2 2-D da [ltima linMa inserida 3elo %omando SQL mais re%enteI ou seEaY s; tem utilidade a3;s um %omando -:SERT.

G,

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

E@em3loX
CREATE OR REPLACE FUNCTION result_status(char(2)) RETURNS integer AS $$ DECLARE linhas integer; BEGIN PERFORM * FROM colaboradores WHERE uf=$1; /* Atribui varivel "linhas" o n de registros referidos pelo comando anterior; */ GET DIAGNOSTICS linhas = ROW_COUNT; RETURN linhas; END; $$ LANGUAGE plpgsql;

--.2.2.#2.2 - 2d 8todo - A$CBD


FOUND uma &ari6&el ?ooleana 4ue ini%ialmente bfalseb dentro de %ada %Mamada de fun./o PLS3gSQL. Sua defini./o dada 3or %ada um dos seguintes ti3os de instru./oX SELECT INTOI PERFORMI UPDATEI INSERTI DELETEI FETCH e FOR. #ada instru./o 3ode definir bTrueb se retornar S interagir %om 3elo menos uma linMa ou b$alseb se n/o retornar S interagir %om nenMuma linMa. $2":D uma &ari6&el lo%al dentro de %ada fun./o PLS3gSQLY 4ual4uer altera./o feita na mesma afeta somente a fun./o %orrente.

--.2.2.#- - Retorno de Cma A&n./o Dois %omandos retornam dados de uma fun./oX RETURN e RETURN --.2.2.#-.# - RETCRB 2 %omando RETURN %om uma e@3ress/o 74ue 3ode ser um &alorI uma &ari6&el ou at mesmo &oid8I finaliza a fun./o e retorna o &alor da e@3ress/o 3ra 4uem e@e%uta. Para 4ue o retorno seEa um &alor %om3osto 7linMa8I de&e ser de%larada uma &ari6&el registro ou linMa %omo a e@3ress/o. Sinta@eX
RETURN expresso; NEXT.

2 &alor retornado 3ela fun./o n/o 3ode ser dei@ado indefinido. Se o %ontrole atingir o final do ?lo%o de nP&el mais alto da fun./o sem atingir uma instru./o RETURNI o%orrer6 um erro em tem3o de e@e%u./o. Se a fun./o for de%larada %omo retornando &oidI ainda assim de&e ser es3e%ifi%ada uma instru./o RETURNY mas neste %aso a e@3ress/o a3;s o %omando RETURN o3%ionalI sendo ignorada %aso esteEa 3resente. --.2.2.#-.2 - RETCRB BEGT Quando o retorno de uma fun./o PLS3gSQL de%larado %omo sendo b SETOF tipobI M6 um 3ro%edimento diferente a ser seguido. 2s itens indi&iduais a serem retornados s/o es3e%ifi%ados em %omandos RETURN NEXTI e um %omando RETURN finalI sem argumento indi%a 4ue a fun./o %Megou ao fim. Sinta@eX
RETURN NEXT expresso;

E@em3loX
G0

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

CREATE OR REPLACE FUNCTION funcao_next() RETURNS SETOF varchar(10) AS $funcao_next$ BEGIN RETURN NEXT 'Saturno'; RETURN NEXT 'Netuno'; RETURN NEXT 'Urano'; RETURN;

END; $funcao_next$ LANGUAGE plpgsql;

$un.!es 4ue utilizam RETURN

NEXT

de&em ser %Mamadas %omo uma fonte de ta?ela na %l6usula

FROMX

SELECT * from funcao_next();

2 %omando RETURN NEXT sal&a o &alor da e@3ress/o e em seguida a e@e%u./o %ontinua na 3r;@ima instru./o da fun./o PLS3gSQL. 2 %onEunto de resultados 7result set8 %onstruPdo se e@e%utando su%essi&os RETURN NEXT e o RETURN finalI 4ue n/o de&e ter argumentosI faz o %ontrole sair da fun./o. --.2.2.#2 - +ondicionais -nstru.!es -$ 7se8 e@e%utam ou n/o %omandos de3endendo de %ondi.!es. PLS3gSQL tem %in%o formas de -$X
IF IF IF IF IF ... ... ... ... ... THEN THEN THEN THEN THEN ... ... ... ... ELSE ELSE IF ELSIF ... THEN ... ELSE ELSEIF ... THEN ... ELSE

--.2.2.#2.# - 3A-TJEB 2s %omandos entre ignorados.


THEN

END IF

s/o e@e%utados se a %ondi./o for &erdadeiraI %aso %ontr6rio s/o

IF expresso_booleana THEN comando 1; comando 2; comando ...; comando N; END IF;

--.2.2.#2.2 - 3A-TJEB-ELSE -nstru.!es IF-THEN-ELSE am3liam o IF-THEN 3ermitindo es3e%ifi%ar alternati&amente um %onEunto de %omandos a serem e@e%utadas se a %ondi./o for a&aliada %omo falsa.
IF expresso_booleana THEN instrues ELSE instrues END IF;

--.2.2.#2.- - 3A-TJEB-ELSE 3A AninMamentos de instru.!es 3odem ser feitos %omo segue o e@em3loX

G1

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

IF uf = 'SP' THEN pessoa_uf := 'paulista'; ELSE IF uf = 'RJ' THEN pessoa_uf := 'fluminense'; END IF; END IF;

Quando essa forma utilizadaI na &erdadeI uma instru./o -$ est6 sendo aninMada dentro da 3arte ELSE da instru./o -$ 3rin%i3al. Ent/oI 3re%iso uma instru./o E:D 3ara %ada -$ aninMado e tam?m 3ara o b-$-ELSEb 3ai. A3esar de fun%ionarI feito de forma esteti%amente desagrad6&el 4uando e@istem muitas alternati&as 3ara serem a&aliadas. A 3r;@ima forma seria mais %on&enienteX --.2.2.#2.2 - 3A-TJEB-ELS3A-ELSE
IF expresso_booleana THEN comandos [ ELSIF expresso_booleana THEN comandos [ ELSIF expresso_booleana THEN comandos ...]] [ ELSE instrues ] END IF;

"sando o modo IF-THEN-ELSIF-ELSE mais ade4uado 3ara &erifi%ar muitas alternati&as em uma instru./o. ] e4ui&alente aos %omandos IF-THEN-ELSE-IF-THEN aninMadosI 3orm s; 3re%isa de um END IF. E@em3loX
IF numero = 0 THEN resultado := 'zero'; ELSIF numero > 0 THEN resultado := 'positivo'; ELSIF numero < 0 THEN resultado := 'negativo'; ELSE -- Aqui a nica outra possibilidade que o nmero seja nulo resultado := 'NULL'; END IF;

--.2.2.#2.6 - 3A-TJEB-ELSE3A-ELSE
ELSEIF

um alias 3ara ELSIFI ou seEaI o resultado ser6 o mesmo usando 4ual4uer um dos dois.

--.2.2.#6 - La.os #om os %omandos LOOPI EXITI WHILEI e FOR 3ossP&el fazer uma fun./o re3etir uma srie de %omandos.

GD

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

--.2.2.#6.# - L$$P Define um la.o in%ondi%ionalI re3etindo indefinidamente at 4ue seEa finalizado 3or um EXIT ou bRET"R:b. :o %aso de la.os aninMados 3ode ser utilizado um r;tulo o3%ional em EXIT 3ara definir o nP&el de aninMamento 4ue de&e ser finalizado.
[<<rtulo>>] LOOP instrues END LOOP;

--.2.2.#6.2 - EG3T Se nenMum r;tulo for determinadoI o la.o mais interno finalizado e o %omando a3;s END LOOP e@e%utado em seguida. Se o r;tulo for determinadoI esse de&e ser o r;tulo do nP&el atual ou de algum nP&el e@terno do la.o ou do ?lo%o aninMado. E ent/o o la.o ou ?lo%o finalizadoI e o %ontrole %ontinua na instru./o a3;s o END do la.o ou do ?lo%o. Quando se tem o 3arRmetro WHENI a saPda do la.o se faz a3enas se a %ondi./o es3e%ifi%ada for &erdadeiraI %aso %ontr6rioI o %ontrole 3assa 3ara a instru./o a3;s o EXIT. 2 EXIT 3ode interrom3er 3rematuramente 4ual4uer ti3o de la.oI n/o se limitando a a3enas la.os in%ondi%ionais. Sinta@eX
EXIT [ rtulo ] [ WHEN expresso ];

E@em3losX
CREATE OR REPLACE FUNCTION teste_loop() RETURNS int AS $$ DECLARE BEGIN i := 0; LOOP IF i = 10 THEN RAISE NOTICE 'O indexador vale 10 agora!!!'; EXIT; -- Faz sair do lao END IF; RAISE NOTICE 'Ainda no... :('; i := i+1; END LOOP; RETURN i; END; $$ LANGUAGE plpgsql; i int;

GG

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

CREATE OR REPLACE FUNCTION teste_loop() RETURNS int AS $$ DECLARE i int; BEGIN i := 0; LOOP IF i < 10 THEN RAISE NOTICE 'Ainda no... :('; END IF; i := i+1; EXIT WHEN i=10; -- Faz sair do lao END LOOP; RAISE NOTICE 'O indexador vale 10 agora!!!'; RETURN i; END; $$ LANGUAGE plpgsql;

--.2.2.#6.- - @J3LE Re3ete uma se4yNn%ia de %omandos en4uanto a e@3ress/o de %ondi./o for &erdadeira. A %ondi./o a&aliada antes de %ada entrada no %or3o do la.o. Sinta@eX
[<<rtulo>>] WHILE expresso LOOP comandos END LOOP;

E@em3losX
CREATE OR REPLACE FUNCTION teste_loop() RETURNS int AS $$ DECLARE i int; BEGIN i := 0; WHILE i < 10 LOOP RAISE NOTICE 'Ainda no... :('; i := i+1; END LOOP; RAISE NOTICE 'O indexador vale 10 agora!!!'; RETURN i; END; $$ LANGUAGE plpgsql;

00

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

CREATE OR REPLACE FUNCTION teste_loop() RETURNS int AS $$ DECLARE BEGIN i := 0; WHILE NOT i=10 LOOP RAISE NOTICE 'Ainda no... :('; i := i+1; END LOOP; RAISE NOTICE 'O indexador vale 10 agora!!!'; RETURN i; END; $$ LANGUAGE plpgsql; i int;

--.2.2.#6.2 - A$R (varia./o inteira, #ria um loo3 4ue interage em um inter&alo de &alores inteiros. A &ari6&el bnomeb definida automati%amente %omo sendo do ti3o integerI e somente dentro do loo". As duas e@3ress!es 4ue s/o os limites inferior e su3erior s/o a&aliadas somente uma &ezI ao entrar no la.o. Por 3adr/o a raz/o da intera./o m I 4uando o 3arRmetro bRE5ERSEb es3e%ifi%ado 3assa a ser - . Sinta@eX
[<<rtulo>>] FOR nome IN [ REVERSE ] expresso .. expresso LOOP comandos END LOOP;

E@em3losX
CREATE OR REPLACE FUNCTION teste_loop() RETURNS int AS $$ DECLARE i int:=0; BEGIN FOR i IN 0..9 LOOP RAISE NOTICE 'Ainda no... :('; i := i+1; END LOOP; RAISE NOTICE 'O indexador vale 10 agora!!!'; RETURN i; END; $$ LANGUAGE plpgsql;

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

CREATE OR REPLACE FUNCTION teste_loop() RETURNS int AS $$ DECLARE i int:=0; BEGIN FOR i IN REVERSE 20..11 LOOP RAISE NOTICE 'Ainda no... :('; i := i-1; END LOOP; RAISE NOTICE 'O indexador vale 10 agora!!!'; RETURN i; END; $$ LANGUAGE plpgsql;

2?s.X Se o limite inferior for maior 4ue o limite su3erior 7ou menorI no %aso de ser6 e@e%utado sem gerar erro. --.2.2.#6.6 - Loo" "or Q&eries

REVERSE8I

o loo3 n/o

] 3ossP&el interagir atra&s do resultado de uma 4uerC e mani3ular dados utilizando um la.o FOR diferente. #ada linMa resultante de %omando 7SELECT8 atri?uPdaI su%essi&a&emnteI Z &ari6&el registro ou linMaI e o %or3o do loo3 e@e%utado uma &ez 3ara %ada linMa. Se o loo3 for finalizado 3or uma EXITI o [ltimo &alor de linMa atri?uPdo ainda a%essP&el a3;s o la.o. Sinta@eX
[<<rtulo>>] FOR registro_ou_linha IN comando LOOP comandos END LOOP; Exemplo: CREATE OR REPLACE FUNCTION loop_for() RETURNS int AS $$ DECLARE var1 colaboradores%ROWTYPE; i int :=0; BEGIN FOR var1 IN SELECT * FROM colaboradores WHERE uf='SP' LOOP i :=i+1; END LOOP; -- Retorna o nmero de linhas resultantes da query: RETURN i; END; $$ LANGUAGE plpgsql;

0'

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

--.2.2.#7 - A$R-3B-EGE+CTE ] uma outra forma de interagir so?re linMasI semelMante Z anteriorI 3orm o %;digo fonte do SELECT definido %omo uma e@3ress/o %adeia de %ara%teresI 4ue a&aliada e re3laneEada a %ada itera./o do loo3. -sso 3ermite ao 3rogramador es%olMer entre a &elo%idade de %onsulta 3r-3laneEada e a fle@i?ilidade da %onsulta dinRmi%aI da mesma forma 4ue no %omando EXECUTE 3uro. Sinta@eX
[<<rtulo>>] FOR registro_ou_linha IN EXECUTE string_de_comando LOOP comandos END LOOP; Exemplo: CREATE OR REPLACE FUNCTION for_in_exec(var_uf char(2)) RETURNS int AS $$ DECLARE var1 colaboradores%ROWTYPE; i int :=0; BEGIN FOR var1 IN EXECUTE 'SELECT * FROM colaboradores WHERE uf='||''''||var_uf||'''' LOOP i :=i+1; END LOOP; -- Retorna o nmero de linhas resultantes da query: RETURN i; END; $$ LANGUAGE plpgsql;

2?s.X Atualmente o analisador PLS3gSQL distingue os dois ti3os de loo3s FOR 7inteiro e resultado de uma 4uerC8I &erifi%ando se en%ontra b..b fora de 3arNnteses entre IN e LOOP. #aso n/o en%ontrarI o loo3 entendido %omo sendo de linMas. Se b..b for es%rito de maneira e4ui&o%adaI 3ode %ausar um erro notifi%ando 4ue <a &ari6&el do la.oI 3ara la.o so?re linMasI de&e ser uma &ari6&el registro ou linMa=I ao in&s de um sim3les erro de sinta@e.

0(

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

--.2.2.#: - Tratamento de Erros Por 3adr/oI 4ual4uer erro em uma fun./o %ausa sua interru3./o. Pode-se %a3turar e se re%u3erar de erros utilizando a %l6usula EXCEPTION. Se n/o o%orrer erro algum todos %omandos antes de EXCEPTION ser/o e@e%utados. Sinta@eX
[ <<rtulo>> ] [ DECLARE declaraes ] BEGIN comandos EXCEPTION WHEN condio [ OR condio ... ] THEN comandos_do_tratador [ WHEN condio [ OR condio ... ] THEN comandos_do_tratador ... ] END;

E@em3loX
CREATE OR REPLACE FUNCTION trata_except(num1 int,num2 int) RETURNS int AS $$ DECLARE resultado int; BEGIN resultado:=num1/num2; RETURN resultado; EXCEPTION WHEN division_by_zero THEN RAISE EXCEPTION 'No dividirs por Zero!!!'; END; $$ LANGUAGE plpgsql;

0+

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

--.2.2.#; - 8ensagens e Erros 2 %omando RAISE gera mensagens 4ue informam ou %ausam erros. Sinta@eX
RAISE nvel 'formato' [, varivel [, ...]];

Sendo 4ue bnP&elb 3ode ser DEBUGI LOGI INFOI NOTICEI WARNINGI e EXCEPTION. 2 nP&el EXCEPTION 3ro&o%a um erro 74ue normalmente interrom3e a transa./o atual8Y os outros nP&eis geram a3enas mensagens %om diferentes 3rioridades. :a string de formata./oI o %ara%tere bTb re3resenta o 3r;@imo argumento 7o3%ional8. Para se o?ter uma mensagem %om o %ara%tere bTb literalmente de&e-se fazerX TT. E@em3losX
RAISE NOTICE 'Total da semana: %', total; -- Exibe a frase com o contedo da varivel "total" RAISE NOTICE '% %% de lucro!',50; -- Exibe o valor e tambm o caractere "%"

0,

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

--.2.2.#< - +&rsores em A&n.>es PLI"gSQL #ursores fa%ilitam muito em %onsultas %uEo retorno so muitas linMasI 3ois ao in&s de fazer a %onsulta de uma &ezI 3ode-se ler algumas linMas 3or &ez. De%lara./o de #ursores #ursores s/o um ti3o de &ari6&elI 3ortanto de&em ser estar dentro de E@em3loX
... DECLARE DECLARE.

cursor_vazio refcursor; cursor_determinado FOR SELECT * colaboradores; cursor_com_arg (argumento int) IS SELECT * FROM colaboradores WHERE cargo IS NOT

NULL;

...

$oram %riados dois %ursoresI am?os s/o do mesmo ti3o 7ref%ursor8Ino entantoI b%ursorL&aziob n/o foi determinado em sua de%lara./o e 3ode ser usado 3ara 4ual4uer 4uerC e b%ursorLdeterminadob E6 tem uma 4uerC determinada 3ara e@e%utar. --.2.2.#<.# - ! ert&ra de +&rsores Para se fazer uso de um %ursor em uma fun./o 3re%iso a?rP-lo. #ursores 5aziosX
OPEN cursor_vazio FOR SELECT * FROM colaboradores; OPEN FOR EXECUTE;

#ursores 5azios Para E@e%utar StringsX


OPEN cursor_vazio FOR EXECUTE 'SELECT * FROM colaborades WHERE uf='||$1||' ORDER BY nome';

#ursores DeterminadosX
OPEN cursor_determinado;

#ursores #om ArgumentosX


OPEN cursor_com_arg(77);

00

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

--.2.2.#<.2 - CtiliDa./o e Aec1amento de +&rsores #omo E6 foi &istoI o %omando b$ET#>b ser&e 3ara re%u3erar informa.!es de %ursores. #om o %omando b$ET#>b 3ode re%u3erar a7s8 linMa determinada7s8 Eogando as informa.!es em &ari6&eis 4ue 3odem ser do ti3o R2HTBPEI RE#2RD ou &ari6&eis de algum desses ti3os se3aradas 3or &Prgulas. E@em3loX
FETCH cursor_x INTO var1; FETCH cursor_y INTO var1,var2,var3,var4;

A &ari6&el FOUND 3ode ser utilizada 3ra se sa?er se Mou&e alguma linMa retornada. A3;s a utiliza./oI um %ursor tem 4ue ser fe%Mado %om o %omando b#L2SEb 3ara li?erar re%ursos. Porm o mesmo 3ode ser a?erto no&amente. ser a?erto no&amente. E@em3loX
CLOSE cursor_x;

01

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

--.2.2.#<.- - A&n.>es PLI"gSQL %&e Retornam +&rsores $un.!es PLS3gSQL 3odem retornar %ursoresI 4ue [til 3ara retornar muitas linMas ou %olunasI 3rin%i3almente %onEuntos de resultados muito grandes. A fun./o de&e a?rir o %ursor e retornar o nome do %ursor 3ara 4uem fez a %Mamada 7ou sim3lesmente a?rir o %ursor utilizando o nome do 3ortal es3e%ifi%ado 3orI ou de outra forma %onMe%ido 3or 4uem %Mamou8. Quem %Mamar 3oder6 ler as linMas usando o %ursor. Quem %Mama 3ode fe%Mar o %ursorI ou o mesmo ser6 fe%Mado automati%amente 4uando a transa./o for finalizada. 2 nome do 3ortal 3ara o %ursor 3ode ser definido 3elo 3rogramador ou gerado automati%amente. Para definir o nome do 3ortal de&e sim3lesmente atri?uir uma string Z &ari6&el do ti3o bref%ursorb antes de a?rP-la. A string da &ari6&el ser6 utilizada 3elo b2PE:b %omo o nome do 3ortal su?Ea%ente. 9as se a &ari6&el do ti3o bref%ursorb nulaI o %omando b2PE:b automati%amente gera um nome 4ue n/o dN %onflito %om nenMum outro 3ortal 4ue E6 e@ista e atri?ui esse nome Z &ari6&el do ti3o bref%ursorb. 2?s.X "ma &ari6&el %ursor ati&ada ini%ializada %om o &alor da string relati&a ao seu nomeI ent/oI o nome do 3ortal o mesmo da &ari6&el %ursorI a n/o ser 4ue o 3rogramador mude esse nome fazendo uma atri?ui./o antes de a?rir o %ursor. 9as uma &ari6&el %ursor desati&ada tem ini%ialmente seu &alor nulo 3or 3adr/oI ent/oI re%e?e um nome [ni%o gerado de forma autom6ti%aI se esse n/o for mudado. E@em3losX
CREATE TEMP TABLE tb_teste(campo text); INSERT INTO tb_teste VALUES ('123'); CREATE OR REPLACE FUNCTION retorna_cursor(refcursor) RETURNS refcursor AS $$ BEGIN OPEN $1 FOR SELECT campo FROM tb_teste; RETURN $1; END; $$ LANGUAGE plpgsql; BEGIN; -- Abertura de uma transao; SELECT retorna_cursor('teste_cursor'); FETCH ALL IN teste_cursor; COMMIT; /* O prximo exemplo gera o nome do cursor automaticamente */ CREATE OR REPLACE FUNCTION retorna_cursor() RETURNS refcursor AS $$ DECLARE ref refcursor; BEGIN OPEN ref FOR SELECT campo FROM tb_teste; RETURN ref; END; $$ LANGUAGE plpgsql; BEGIN; SELECT retorna_cursor(); retorna_cursor -------------------<unnamed portal 1> (1 row)

0D

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

FETCH ALL IN "<unnamed portal 1>"; COMMIT; /* Retornando vrios cursores: */ CREATE OR REPLACE FUNCTION retorna_cursor(refcursor, refcursor) RETURNS SETOF refcursor AS $$ BEGIN OPEN $1 FOR RETURN NEXT OPEN $2 FOR RETURN NEXT RETURN; SELECT * FROM tabela_1; $1; SELECT * FROM tabela_2; $2;

END; $$ LANGUAGE plpgsql; -- necessrio estar em uma transao para poder usar cursor BEGIN; SELECT * FROM retorna_cursor('a', 'b'); FETCH ALL FROM a; FETCH ALL FROM b; COMMIT;

0G

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

-2 - Gatil1os * Triggers
Triggers s/o o?Eetos 4ue determinam a.!es a serem e@e%utadas antes ou de3ois de um e&ento em uma ta?ela. Essas a.!es 3odem ser dis3aradas 3or %omando SQL 7statement8 ou 3or linMa 7roV8. Para se %riar um gatilMo ne%ess6rio 4ue E6 e@ista uma fun./o 7strored 3ro%edure8I a 4ual ser6 usada %omo a./o dis3arada 3or um e&ento . E essa fun./o de&er6 ter o retorno do ti3o TRIGGER. Sinta@eX
CREATE TRIGGER nome { BEFORE | AFTER } { evento [ OR ... ] } ON tabela [ FOR [ EACH ] { ROW | STATEMENT } ] EXECUTE PROCEDURE nome_funo ( argumentos );

DetalMesX nomeX :ome do trigger a ser %riadoY )E$2REX A fun./o ser6 e@e%utada antes do e&entoY A$TERX A fun./o ser6 e@e%utada de3ois do e&entoY e&entoX -:SERTI "PDATE ou DELETEY ta?elaX :ome da ta?ela 4ue ter6 um gatilMo &in%uladoY R2HX A fun./o ser6 dis3arada 3ara %ada linMaY STATE9E:TX A fun./o ser6 dis3arada a3enas uma &ezY nomeLfun./oX :ome da fun./o &in%ulada ao gatilMo.

Quando uma fun./o PLS3gSQL %Mamada %omo um triggerI di&ersas &ari6&eis es3e%iais s/o %riadas automati%amente no ?lo%o de nP&el su3erior. Elas s/oX
Bome NEW OLD TG_NAME TG_WHEN TG_LEVEL TG_OP TG_RELID TG_RELNAM E TG_NARGS TG_ARGV[] Ti"o RECORD RECORD name text text text oid name integer text Descri./o #ontm a no&a linMa do ?an%o de dados 3ara o3era.!es do ti3o -:SERTS"PDATE nos gatilMos no nP&el de linMa. 2 &alor dessa &ari6&el nulo 7:"LL8 nos gatilMos no nP&el de instru./o 7statement8. #ontm a antiga linMa do ?an%o de dados 7antes da modifi%a./o8I 3ara o3era.!es do ti3o "PDATESDELETE nos gatilMos no nP&el de linMa. 2 &alor dessa &ari6&el nulo 7:"LL8 nos gatilMos no nP&el de instru./o 7statement8. #ontm o nome do gatilMo dis3arado. String 4ue %ontm )E$2RE ou A$TERI de3endendo da defini./o do gatilMo. String 4ue %ontm R2H ou STATE9E:TI %onforme a defini./o do gatilMo. String 4ue %ontm -:SERTI "PDATEI ou DELETEI informando 3ara 4ual o3era./o o gatilMo foi dis3arado. 2 -D de o?Eeto da ta?ela 4ue dis3arou o gatilMo. 2 nome da ta?ela 4ue dis3arou o gatilMo. :[mero de argumentos forne%idos ao 3ro%edimento de gatilMo na instru./o <#REATE TR-GGER=. 2s argumentos da instru./o #REATE TR-GGER. 2 %ontador do Pndi%e %ome.a 3or 0. Ondi%es in&6lidos 7menor 4ue 0 ou maior ou igual a tgLnargs8 resultam em um &alor nulo.

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

E@em3loX
/* Criao da tabela original */ CREATE TEMP TABLE tb_teste( campo1 int ); /* Criao da tabela de logs */ CREATE TEMP TABLE tb_teste_log( codigo serial primary key, data date, usuario varchar(15), modificacao char(6) ); /* Criao da funo que ser vinculada ao trigger */ CREATE FUNCTION func_log() RETURNS trigger AS $$ BEGIN INSERT INTO tb_teste_log(data, usuario, modificacao) VALUES (now(), user, RETURN NEW; END; $$ LANGUAGE plpgsql; /* Criao do trigger */ CREATE TRIGGER tg_teste_log AFTER INSERT OR UPDATE OR DELETE ON tb_teste FOR EACH ROW EXECUTE PROCEDURE func_log(); /* Inseres, Remoes e Modificaes na tabela tb_teste */ INSERT INTO tb_teste VALUES (1),(2),(3),(4); DELETE FROM tb_teste WHERE campo1 = 2 OR campo1 = 4; UPDATE tb_teste SET campo1 = 7 WHERE campo1 = 3; /* Verificando a tabela de logs */ SELECT * FROM tb_teste_log;

TG_OP);

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

-6 - PersonaliDando $"eradores
2 PostgreSQL 3ermite aos usu6rios %riarem o3eradores 3ersonalizadosI ao in&s de se utilizar fun.!es %om o mesmo 3ro3;sito. :o entantoI assim %omo triggersI %ada o3erador de&e ser assimilado a uma fun./o. Podem ser %riado o3eradores dos ti3os un6rio es4uerdoI un6rio direito e ?in6rio. Assim %omo a%onte%e %om fun.!es tam?m 3ossP&el fazer so?re%arga de o3eradoresI %uEo %om3ortamento ir6 &ariar %onforme o7s8 ti3o7s8 de dados em 4ue for usado. Sinta@e geral da %ria./o de um o3eradorX
CREATE OPERATOR simbolo_operador ( PROCEDURE = funcao_atrelada, RIGHTARG = tipo_argumento_direito, LEFTARG = tipo_argumento_esquerdo

E@em3loX
/* Criao da funo para o operador binrio */ CREATE OR REPLACE FUNCTION fc_operador_potencia (int,int) RETURNS double precision AS $$ SELECT power($1,$2); $$ LANGUAGE SQL; /* Operador Binrio */ CREATE OPERATOR ** ( LEFTARG = int, RIGHTARG = int, PROCEDURE = fc_operador_potencia ); /* Criao da funo para os operadores unrios */ CREATE OR REPLACE FUNCTION fc_operador_potencia (int) RETURNS double precision AS $$ SELECT power($1,2); $$ LANGUAGE SQL; /* Operadores Unrios */ /* Esquerdo */ CREATE OPERATOR ** ( LEFTARG = int, PROCEDURE = fc_operador_potencia ); /* Direito */ CREATE OPERATOR ** ( RIGHTARG = int, PROCEDURE = fc_operador_potencia ); /* Utilizao do operador */ SELECT 2**9; -- 2 elevado a 9 (operador binrio) SELECT 3**; -- 3 ao quadrado (operador unrio esquerdo) SELECT **3; -- 3 ao quadrado (operador unrio direito)

:o e@em3lo a%ima 3odemos &er a so?re%arga n/o s; da fun./oI %omo tam?m do 3r;3rio o3erador. 2 o3erador 4uando usado de forma un6ria sim3lesmente ele&a ao 4uadrado e na forma ?in6riaI o argumento es4uerdo ele&ado ao direito 73otNn%ia8.

'

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

-7 - Regras - R&les
RULES um sistema de regras 73r;3rio do PostgreSQLI n/o 3adr/o SQL8I o 4ual 3ermite definir uma a./o alternati&a a ser realizada nos e&entos em ta?elas ou &is!es. Grosso modoI uma regra faz %om 4ue seEam e@e%utados %omandos adi%ionais 4uando e@e%utado um determinado %omando em uma determinada ta?ela. :a &erdadeI uma regra um me%anismo 4ue transforma %omandos. Tal transforma./o o%orre antes de se e@e%utar o %omando. Regras n/o dis3aram inde3endentemente 3ara %ada linMa fPsi%a %omo 3ode ser definido em um gatilMo. 2s e&entos 4ue 3odem dis3arar uma RULE s/oX SELECTI INSERTI UPDATE e DELETE.

Sinta@eX
CREATE [ OR REPLACE ] RULE nome_rule AS ON evento TO tabela [ WHERE condio ] DO [ ALSO | INSTEAD ] { NOTHING | comando | ( comando ; comando ... ) };

2 4ue &em a3;s o um e&ento 4ue 3ode serX

DOI

%omo mostra a sinta@e a%imaI a a./o e@e%utada 3ela regra dis3arada 3or

-:STEADX -ndi%a 4ue o7s8 %omando7s8 de&e7m8 ser e@e%utado7s8 ao in&s do %omando originalY ALS2X -ndi%a 4ue o7s8 %omando7s8 de&e7m8 ser e@e%utado7s8 em adi./o ao %omando original. #aso ALSO ou INSTEAD n/o forem es3e%ifi%adosI ALSO o 3adr/o.Y :2T>-:GX :/o faz %oisa algumaI ou seEaI anula o %omando dado ou n/o faz %oisa alguma alm do %omandoY %omandoX 27s8 %omando7s8 4ue faz a a./o da regra. 2s %omandos &6lidos s/o SELECTI INSERTI UPDATEI DELETEI ou NOTIFY.

E@em3loX
/* Criao da tabela de funcionrios que j pertenceram empresa */ CREATE TABLE ex_colaboradores( mat_id character(5) NOT NULL, nome character varying(15) NOT NULL, snome character varying(30) NOT NULL, dt_demis date, CONSTRAINT ex_colaboradores_pkey PRIMARY KEY (mat_id) ); /* Criao da RULE */ CREATE OR REPLACE RULE rl_ex_colaboradores AS ON DELETE TO colaboradores DO INSERT INTO ex_colaboradores VALUES (OLD.mat_id,OLD.nome,OLD.snome,now()); /* Demisso de um funcionrio */ DELETE FROM ONLY colaboradores WHERE mat_id = '00016'; /* Constatao do preenchimento da tabela */ SELECT * FROM ex_colaboradores ;

>6 %asos em 4ue em dados e&entosI 3ara se 3roteger os dadosI nada de&e ser feitoX
/* Criao da tabela a ser protegida */ CREATE TEMP TABLE protegida( campo1 int ); /* Insero de valores */ INSERT INTO protegida VALUES (1),(2),(3),(4),(5),(6),(7); /* Criando regras para proteger contra modificaes ou remoes, respectivamente */ CREATE OR REPLACE RULE rl_escudo_protegida_upd AS ON UPDATE TO protegida DO INSTEAD NOTHING; CREATE OR REPLACE RULE rl_escudo_protegida_del AS ON DELETE TO protegida DO INSTEAD NOTHING; /* Tentativas (frustradas) de violar os dados inseridos na tabela */ UPDATE protegida SET campo1 = 1000 WHERE campo1 = 1; DELETE FROM protegida WHERE campo1 = 2;

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

-7.# - !t&aliDando ?ieOs com R&les ] sa?ido 4ue uma &ieV nada mais do 4ue uma %onsulta 3ersonalizada de uma ta?elaI sendo um o?Eeto a3enas 3ara &isualiza./o de dadosI n/o sendo 3ossP&el inserir e nem a3agar dados dela. :o entantoI a3li%ando uma regra isso 3ode ser 3ossP&el des&iando o e&ento da &ieV 3ara a ta?ela de origemX
SK #ria./o da &ieV KS #REATE 5-EH &VL%ola?oradoresLs3 AS SELE#T K $R29 %ola?oradores H>ERE uf_oSPo A:D %idade _ oS/o PaulooY SK #ria./o da rule KS #REATE R"LE rlL&VL%ola?oradoresLs3 AS 2: -:SERT T2 &VL%ola?oradoresLs3 D2 -:STEAD -:SERT -:T2 %ola?oradores 7matLidInomeIsnomeIdtLadmisI%MefeLdiretoIufI%idade8 5AL"ES 7:EH.matLidI:EH.nomeI:EH.snomeInoV78I:EH.%MefeLdiretoIoSPoIoS/o Pauloo8Y SK -nser./o de um registro na &ieV KS -:SERT -:T2 &VL%ola?oradoresLs3 7matLidInomeIsnomeI%MefeLdireto8 5AL"ES 7o000, oIoEs%endinooIo9atosoIo0000 o8Y SK 5erifi%ando o resultado KS SELE#T K from &VL%ola?oradoresLs3 Y

-7.2 - Removendo R&les Para a3agar uma RULE ne%ess6rio es3e%ifi%ar tam?m o nome da rela./o Z 4ual est6 atreladaX Sinta@eX
DROP RULE [ IF EXISTS ] nome_rule ON relao [ CASCADE | RESTRICT ]

E@em3loX
DROP RULE rl_vw_colaboradores_sp ON vw_colaboradores_sp;

-7.- - R&les G Trigggers R&les :/o 3ossP&el usar uma linguagem 3ro%eduralY Su?stituiI Adi%iona ou desa?ilita %omandosY Ao %ontr6rio de triggersI 3odem alterar a %onsulta e@e%utadaY ] inde3endente de fun.!es definidas 3elo usu6rio.

Triggers ] um me%anismo mais %om3le@oI 3orm muito mais 3oderosoY Determinam fun.!es a serem e@e%utadas antes ou de3ois de um ti3o de e&entoY Antes de sua %ria./o 3re%iso %riar uma fun./o %uEo retorno do ti3o trigger e n/o 3ode re%e?er 3arRmetrosY Pode e@e%utar um %omando 4ue a%ione outro triggerY

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

-: - Jeran.a de Ta elas
Assim %omo em linguagens orientadas a o?EetosI de maneira similarI M6 o %on%eito de Meran.a de ta?elas no PostgreSQL. A Ta?ela-m/e 3ossui %am3os %omuns a todas as outras 4ue dela se originar/oI e as ta?elas-filMasI %ada uma ter6 %olunas 3r;3rias alm das Merdadas. 2 &Pn%ulo de uma ta?ela-m/e %om uma ta?ela-filMa se efeti&a %om a 3ala&ra %Ma&e <-:>ER-TS=. E@em3loX
/* Tabela-me */ CREATE TEMP TABLE pessoa( nome varchar(15), endereco varchar(30), telefone char(10) ); /* Tabelas-filhas */ CREATE TEMP TABLE pessoa_juridica( razao_social varchar(40), cnpj char(14) ) INHERITS (pessoa); CREATE TEMP TABLE pessoa_fisica( sobrenome varchar(40), cpf char(11) ) INHERITS (pessoa);

E@i?i./o da estrutura de %ada ta?elaX


\d pessoa +ol&na nome endere%o telefone Ti"o %Mara%ter &arCing7 ,8 %Mara%ter &arCing7(08 %Mara%ter7 08

\d pessoa_juridica +ol&na nome endere%o telefone razaoLso%ial %n3E Ti"o %Mara%ter &arCing7 ,8 %Mara%ter &arCing7(08 %Mara%ter7 08 %Mara%ter &arCing7+08 %Mara%ter7 +8

\d pessoa_fisica +ol&na nome endere%o telefone so?renome %3f Ti"o %Mara%ter &arCing7 ,8 %Mara%ter &arCing7(08 %Mara%ter7 08 %Mara%ter &arCing7+08 %Mara%ter7 8

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

-:.# - 3nserindo Dados em &ma Ta ela-Ail1a Ao se inserir dados em uma ta?ela-filMaI automati%amente eles ser/o tam?m &istos na ta?elam/eI 3or 3adr/oI nos %am3os 4ue ela 3ossuir em %omum %om as outrasX
INSERT INTO pessoa_fisica VALUES ('Georg','Rua da Resistncia, 35','1122223333','Ohm','12345678901'); /* Verificando os dados na tabela-filha */ SELECT * FROM pessoa_fisica; /* Verificando os dados na tabela-me */ SELECT * FROM pessoa;

#omo 3qde ser %onstatadoI a 3rin%P3ioI tudo 4ue as filMas ti&erem a m/e tam?m ter6. Se 3or a%aso em uma %oluna de &alores [ni%os %omum entre m/e e filMasI o mesmo &alor for inserido tanto na m/e 4uanto em uma filMaI se n/o for usado 3arRmetro < ONLY= antes do nome da ta?ela-m/e e@i?ir6 o mesmo &alor mais de uma &ez.
/* Visualizando apenas os resultados da tabela-me */ SELECT * FROM ONLY pessoa;

Alm do SELECTI o 3arRmetro <ONLY= 3ode ser usado tam?m %om DELETE e UPDATE.

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

-; - !rra) de +ol&nas
Tam?m %onMe%ido %omo &etor ou matriz um re%urso muito [til em linguagens de 3rograma./o e 4ue tam?m est6 dis3onP&el %omo re%urso em %olunas de ta?elas do PostgreSQL. Para se definir um %am3o %omo &etorI adi%iona-se %ol%Metes 7de8 logo de3ois do ti3o de dado. E@em3loX
CREATE TABLE tb_array( campo_array_a int[], campo_array_b varchar(10)[][][] -- Uma matriz de 3 dimenses );

At o momentoI se es3e%ifi%ar um tamanMo fi@o 3ara o arraC 7dne8I n/o far6 diferen.aI 3ois a im3lementa./o atual n/o for.a a o?de%er o tamanMo definido. -;.# - 3nserindo Dados em !rra)s 2s &alores a serem inseridos em um &etor de&em ser en&oltos 3or %Ma&es 7kl8 e se3arados 3or &Prgulas. Em matrizes multidimensionais de&em ter e@3ress!es de matriz %om dimens!es %orres3ondentes. E@em3loX
INSERT INTO tb_array VALUES ( '{1,2,3,4,5}', '{{"valorX1","valorX2","valorX3"},{"valorY1","valorY2","valorY3"}, {"valorZ1","valorZ2","valorZ3"}}' );

-;.2 - Selecionando Dados de !rra)s Para sele%ionarmos os dados de um &etor ou um arraC definimos sua 3osi./o %om a3enas um 3ar de %ol%MetesX
/* Selecionar a segunda posio */ SELECT campo_array_a[2] FROM tb_array;

] 3ossP&el definir um fai@a de &alores de um arraC 3ara %onsultaI usando %omo delimitador dois 3ontos 7X8X
/* Selecionar da terceira quinta posio */ SELECT campo_array_a[3:5] FROM tb_array;

:o %aso de matrizes 7&etor de mais de uma dimens/o8I s/o ne%ess6rios ' 3ares de %ol%MetesI sendo 4ue o 3rimeiro informa em 4ual dimens/o se en%ontra e o segundo em 4ue 3osi./oX
/* Dimenso 3, Posio 1 */ SELECT campo_array_b[3][1] FROM tb_array;

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

-< - Particionamento de Ta elas


Parti%ionar ta?elas %onsiste em di&idir uma ta?ela 4ue re%e?e um grande &olume de dados. Essa di&is/o feita entre outras ta?elas 4ue na &erdade s/o ta?elas-filMas %uEos dados s/o re%e?idos 3or redire%ionamentos %onforme uma regra 7geralmente fai@as de &alores8. #ada ta?ela-filMa %Mamada de 3arti./oI nesse %aso. A ta?ela-m/e &azia geralmenteI sua e@istNn%ia ser&e a3enas 3ara re3resentar os dados 3or inteiro. 3m"ortanteX 2 %on%eito de 3arti%ionamento a4ui agora a3resentado n/o tem nada a ver %om o 3arti%ionamento de dis%os. )enefP%iosX Performan%e melMorada 3ara %onsultasY Quando %onsultas ou atualiza.!es a%essam uma grande 3or%entagem de uma [ni%a 3arti./oI o desem3enMo 3ode ser melMorado 3ela &antagem de &arredura se4uen%ial da4uela 3arti./o ao in&s de usar um Pndi%e e a%essos aleat;rios 4ue faz a leitura es3alMada 3or toda a ta?elaY Grandes %argas e remo.!es 3odem ser efetudadas 3or adi.!es ou remo.!es de 3arti.!es. ALTER TABLE muito mais r63ido do 4ue em o3era.!es de grande %arga. E&ita tam?m so?re%arga de VACUUM %ausada 3or um grande &olume de DELETE.

-<.# - Aormas de Particionamento do PostgreSQL Range Partitioning

] a forma mais utilizada. A ta?ela 3arti%ionada dentro de fai@as de dados definidas 3or uma %oluna-%Ma&e ou um %onEunto de %olunas. List Partitioning A ta?ela 3arti%ionada e@3li%itamente listando 4ue &alores %Ma&es a3are%em em %ada 3arti./o. -<.2 - 3m"lementa./o do Particionamento . #rie a ta?ela-m/eI de onde as 3arti.!es ir/o se originar. Esta ta?ela n/o de&e ter dados. :/o defina 4ual4uer restri./o do ti3o b#>E#AbI a n/o ser 4ue 3retenda a3li%6-la igualmente a todas as 3arti.!esX
CREATE TABLE tb_mae( valor int);

'. #rie as ta?leas-filMas 7as 3arti.!es8 4ue Merdar/o as 3ro3riedades da ta?ela-m/eX


CREATE TABLE tb_filha_1() INHERITS (tb_mae); CREATE TABLE tb_filha_2() INHERITS (tb_mae); CREATE TABLE tb_filha_3() INHERITS (tb_mae );

(. Adi%ione restri.!es Zs 3arti.!es 3ara definir os &alores %Ma&es 3ermitidos em %ada 3arti./oX
ALTER TABLE tb_filha_1 ADD CONSTRAINT chk_valor CHECK (valor BETWEEN 0 AND 9999); ALTER TABLE tb_filha_2 ADD CONSTRAINT chk_valor CHECK (valor BETWEEN 10000 AND 19999); ALTER TABLE tb_filha_3 ADD CONSTRAINT chk_valor CHECK (valor BETWEEN 20000 AND 29999);

+. Para %ada 3arti./o %riar um Pndi%e na %oluna 3rin%i3alX

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

CREATE INDEX idx_tb_filha_1_valor ON tb_filha_1 (valor); CREATE INDEX idx_tb_filha_2_valor ON tb_filha_2 (valor); CREATE INDEX idx_tb_filha_3_valor ON tb_filha_3 (valor);

,. 5erifi4ue se o 3arRmetro b%onstraintLe@%lusionb est6 desa?ilitado 7off8 no ar4ui&o 3ostgres4l.%onf. #aso esti&erI as %onsultas n/o ser/o otimizadas %omo deseEado. #om esse 3arRmetro desa?ilitadoI as %onsultas &as%ulMar/o %ada uma das 3arti.!es. 0. #rie uma R"LE ou um TR-GGER 3ara fazer o redire%ionamento da ta?ela-m/e 3ara a ta?ela-filMa %onforme o &alor %itadoX
/* I) Com Trigger */ -- Criao da Funo para o Trigger CREATE OR REPLACE FUNCTION fc_particionamento() RETURNS TRIGGER AS $$ BEGIN IF (NEW.valor BETWEEN 0 AND 9999) THEN INSERT INTO tb_filha_1 VALUES (NEW.*); ELSIF(NEW.valor BETWEEN 10000 AND 19999) THEN INSERT INTO tb_filha_2 VALUES (NEW.*); ELSIF(NEW.valor BETWEEN 20000 AND 29999) THEN INSERT INTO tb_filha_3 VALUES (NEW.*); ELSE RAISE EXCEPTION 'Valor Invlido!!!'; END IF; RETURN NULL; END; $$ LANGUAGE PLPGSQL; -- Criao do Triger CREATE TRIGGER tg_particionamento BEFORE INSERT ON tb_mae FOR EACH ROW EXECUTE PROCEDURE fc_particionamento(); /*========================================================*/ /* II) Insero e verificao de valores */ -- Insero INSERT INTO tb_mae VALUES (55),(100),(20700),(14777); -- Verificando na tabela principal: SELECT * FROM tb_mae; -- Verificando em cada partio se os valores correspondem faixa SELECT * FROM tb_filha_1; SELECT * FROM tb_filha_2; SELECT * FROM tb_filha_3; /*========================================================*/ /* III) Com Rules */ -- Eliminao do Trigger e sua Funo DROP FUNCTION fc_particionamento() CASCADE; -- Criao da Rule para a Partio 1 CREATE OR REPLACE RULE rl_particionamento_1 AS ON INSERT TO tb_mae WHERE valor BETWEEN 0 AND 9999 DO INSTEAD INSERT INTO tb_filha_1 VALUES (NEW.*); -- Criao da Rule para a Partio 2 CREATE OR REPLACE RULE rl_particionamento_2 AS ON INSERT TO tb_mae WHERE valor BETWEEN 10000 AND 19999 DO INSTEAD INSERT INTO tb_filha_2 VALUES (NEW.*); G

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

-- Criao da Rule para a Partio 3 CREATE OR REPLACE RULE rl_particionamento_3 AS ON INSERT TO tb_mae WHERE valor 20000 AND 29999 DO INSTEAD INSERT INTO tb_filha_3 VALUES (NEW.*); BETWEEN

:o e@em3lo a3resentado tanto faz usar TR-GGER ou R"LEsI o resultado ser6 o mesmo 74ue 3ode ser %onferido %onforme o 3asso --8.

'0

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

20 - !dministra./o de Cs&5rios
20.# - Roles 2 PostgreSQL geren%ia 3ermiss!es de a%esso usando o %on%eito de brolesbI %uEo uso 3ode 3ara usu6rios e gru3osI de3endendo de %omo um broleb definido. bRolesb 3odem 3ossuir o?Eetos do ?an%o de dados e determinar 3ri&ilgios nesses o?Eetos 3ara outros brolesbI de modo a %ontrolar 4uem de&er6 ter a%esso a esses o?Eetos. Alm dissoI 3ossP&el %on%eder um mem?ro de um broleb 3ara outroI 3ermitindo assim usufruir dos 3ri&ilgios 4ue foram %on%edidos a esse outro broleb. 2 %on%eito de broleb englo?a o %on%eito de usu6rios e gru3os. Em &ers!es do PostgreSQL antes da D. I usu6rios e gru3os eram distintos ti3os de entidadesI mas agora M6 a3enas brolesb. Qual4uer broleb 3ode serr um usu6rioI um gru3o ou am?os. bRolesb do ?an%o de dados s/o %on%eitualmente %om3letamente se3arados dos usu6rios do sistema o3era%ional. :a 3r6ti%aI 3ode ser %on&eniente manter uma %orres3ond n%iaI mas isso n/o re4uerido. Sinta@eX
CREATE ROLE nome_role [ [ WITH ] opes [ ... ] ]

2nde o3.!es 3odem serX

SCPERCSER ^ B$SCPERCSER X Determinam se o no&o broleb um su3er usu6rioI 4ue 3ode so?re3or todas restri.!es de a%esso. 2 status de su3er usu6rio 3erigoso e de&e ser usado somente 4uando realmente ne%ess6rio. 5o%N mesmo de&e ser um su3er usu6rio 3ara %riar um no&o su3er usu6rio. Se n/o for es3e%ifi%ado NOSUPERUSER o 3adr/oY +RE!TED9 ^ B$+RE!TED9 X Determinam se um broleb 3ode %riar um ?an%o de dados. Se CREATEDB es3e%ifi%adoI o broleb 3oder6 %riar no&os ?an%os de dados. Es3e%ifi%ando NOCREATEDbI 4ue 3adr/oI negar6 ao broleb 3oder %riar ?an%o de dadosY +RE!TER$LE ^ B$+RE!TER$LE X Determinam se um broleb 3ode %riar no&os brolesb. "m broleb %om o 3ri&ilgio CREATEROLE 3ode tam?m alterar ou a3agar outros brolesb. Se nada for es3e%ifi%ado NOCREATEROLE o 3adr/oY +RE!TECSER ^ B$+RE!TECSER X Essas %l6usulas s/o o?soletasI mas ainda s/o a%eitasI S/o e4ui&alentes a CREATEROLE e NOCREATEROLEI res3e%ti&amenteY 3BJER3T ^ B$3BJER3T X Determinam um broleb Merdando os 3ri&ilgios de brolesb 4ue mem?ro. "m broleb %om o atri?uto INHERIT 3ode automati%amente usar 4ual4uer 3ri&ilgio do ?an%o de dados 4ue foram %on%edidos diretamente ou indiretamente a um mem?ro. Sem INHERITI a ades/o em outro broleb a3enas garante definir um broleb 3ara outro broleb. Se nada for es3e%ifi%ado INHERIT o 3adr/obY L$G3B ^ B$L$G3B X Determinam se um broleb est6 3ermitido a entrar no sistemaI isso I se o broleb 3oder6 ter autoriza./o a se %one%tar. "mbroleb tento o atri?uto LOGIN 3ode ser 3ensado %omo um usu6rio. bRolesb sem esse atri?uto s/o [teis 3ara geren%iar 3ri&ilgios de ?an%os de dadosI mas n/o s/o %omo usu6rios. Se n/o for es3e%ifi%ado NOLOGIN o 3adr/obI e@%eto 4uando CREATE ROLE e@e%utado usando o 3arRmetro CREATE USERY +$BBE+T3$B L383T connlimit X Se o broleb 3uder entrar no sistemaI isso es3e%ifi%a %omo muitas %one@!es %on%orrentes o broleb 3ode fazer. 2 3adr/o b- bI 4ue siginifi%aX sem limitesY Y EB+REPTED ^ CBEB+REPTED Z P!SS@$RD e"assOorde X #onfigura a senMa do brolebI sendo a3enas 3ara brolesb 4ue tenMam o atri?uto LOGINI mas 3ode-se definir 3ara um 4ue n/o tenMa. Se n/o 3laneEa usar autenti%a./o %om senMaI 3ode-se omitir essa o3./o. Se nenMuma senMa for es3e%ifi%adaI ser6 nula e a autenti%a./o sem3re falMar6 3ara esse usu6rio. "ma senMa nula 3ode ser o3%ionalmente ser es%rita e@3li%itamente %omo PASSWORD NULL. ENCRYPTED ou UNENCRYPTED %ontrolam se a senMa armazenada en%ri3tada no sistema de %at6logos. Se nenMuma for es3e%ifi%adaI o %om3ortamento 3adr/o determinado 3elo 3arRmetro de %onfigura./o b3assVord en%rC3tationbI no ar4ui&o 3ostgres4l.%onf. Se a senMa a3resentada E6 esti&er no formato en%ri3tado 9D,I ent/o ela ser6 armazenada %omo I inde3endentemente se ENCRYPTED ou UNENCRYPTED for es3e%ifi%ados 7desde 4ue o sistema n/o 3ossa des%ri3tografar a string es3e%ifi%ada senMa
'

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

%ri3tografada8. -sso 3ermite re%arga de senMas %ri3tografadas durante bdum3b ou brestoreb. #lientes mais antigos 3odem n/o ter su3orte 3ara autenti%a./o %om o me%anismo 9D, 4ue 3re%iso 3ara fun%ionar %om senMas 4ue s/o armazenadas en%ri3tadasY ?!L3D CBT3L etimestam"e X #onfigura a data e MoraI 4ue a3;s isso a senMa n/o ser6 mais a%eita. Se essa %l6usula for omitida a senMa ser6 &6lida 3ara sem3reY 3B R$LE rolename Y= ...Z X Lista um ou mais brolesb e@istentes 3ara 4uais o no&o broleb ser6 imediatamente adi%ionado %omo mem?ro. 7:ote 4ue n/o M6 o3./o 3ara adi%ionar o no&o broleb %omo um administradorI use o %omando GRANT se3aradamente 3ara issoY 3B GR$CP rolename Y= ...Z X Para &ers!es a 3artir da D. totalmete o?soletaI %uEo uso se e4ui&ale a bIN ROLEbY R$LE rolename Y= ...Z X Lista um ou mais brolesb e@istentes 4ue s/o automati%amente adi%ionado %omo mem?ros do no&o broleb. 7$az o 3a3el de um no&o gru3o8Y !D83B rolename Y= ...Z X ] %omo ROLEI mas os nomes de brolesb adi%ionados ao no&o broleb WITH ADMINI dando-lMes o direito de %on%eder a ades/o neste broleb 3ara outrosY CSER rolename Y= ...Z X Seu uso o?soletoI e4ui&ale a ROLEY SES3D &idX ] uma %l6usula ignoradaI 3orm a%eita 3ara %om3ati?ilidade %om &ers!es anteriores. E@em3losX
/* Criao de um usurio*/ CREATE ROLE usuario1 LOGIN; /* Criao de usuario comum com senha definida em "123" */ CREATE ROLE usuario2 LOGIN ENCRYPTED PASSWORD '123'; /* Criao de super usurio com senha definida em "123" */ CREATE ROLE dbmaster LOGIN SUPERUSER ENCRYPTED PASSWORD '123'; /* Criao do role continer (grupo) financeiro */ CREATE ROLE financeiro; /* Criao do role marcia dentro do grupo financeiro */ CREATE ROLE marcia LOGIN ENCRYPTED PASSWORD '123' IN ROLE financeiro; /* Criao do role clara dentro do grupo financeiro */ CREATE ROLE clara LOGIN ENCRYPTED PASSWORD '123' IN ROLE financeiro;

20.2 - !"agando Roles #omo em outros ti3os de o?EetoI o %omando DROP usado 3ara remo./o. PormI se um <role= 3ossui algum o?Eeto isso n/o 3ossP&el sem antes re3assar os o?Eetos de sua 3ro3riedade 3ara outro <role= %om o %omando REASSIGN OWNED BY role_original TO role_novo ou mesmo a3agando todos o?Eetos de sua 3ro3riedade %om o %omando DROP OWNED BY role_... E@em3loX
/* Criao de um objeto do tipo tabela */ CREATE TEMP TABLE tb_1(valor int); /* Atribuio de propriedade da tabela criada para usuario1 */ ALTER TABLE tb_1 OWNER TO usuario1 ; /* Tentativa (frustrada) de remoo do role usuario1 */ DROP ROLE usuario1; /* Passando as propriedades de usuario 1 para usuario2@db1 */ REASSIGN OWNED BY usuario1 TO usuario2 ; /* Tentativa (com sucesso) de remoo do role usuario1 */ DROP ROLE usuario1; /* Removendo todos os objetos de propriedade de usuario2 sem remover o role */ DROP OWNED BY usuario2;

''

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

20.- - Gr&"os Tam?m %onMe%idos %omo <roles %ontRiners= s/o %omo gru3os de usu6rios. S/o <roles= 4ue %ontm outros <roles=. E@em3losX
/* Roles continer */ CREATE ROLE comercial; CREATE ROLE vendas; /* Criao de continer com 2 roles assimilados */ CREATE ROLE diretores WITH ROLE clara,marcia; /* Inserindo um role de login em um role continter */ GRANT vendas TO marcia; /* Removendo um role de login de um role continter */ REVOKE financeiro FROM clara; /* Usando o comando "GRANT" e o parmetro "WITH ADMIN OPTION" permite conceder o direito de administrao do role a outro role */ GRANT vendas TO clara WITH ADMIN OPTION; /* Inversamente podemos revogar tal direito */ REVOKE ADMIN OPTION FOR vendas FROM clara; /* Exibindo todos os roles */ \du /* ...individualmente */ \du clara

20.2 - +oncedendo o& Revogando !cesso a $ 4etos :a %ria./o de um o?EetoI 4uem %ria 7o <role=8I 3assa a ser o dono e tem 3oderes sem restri.!es. Para 4ue outros roles tenMam a%esso 3re%iso %on%eder esse 3ri&ilgioI 4ue 3ode ser dado a <roles= %ontRinersI em 4ue seus mem?ros 3oder/o usufruir dos mesmos direitos. 2s %omandos GRANT e REVOKEI res3e%ti&amenteI %on%edem ou tiram 3ri&ilgiosI fazem 3arte da su?di&is/o D#L 7Data #ontrol Language * Linguagem de #ontrole de Dados8 4ue tratam dessa 3arte da linguagem SQL. 2s ti3os de 3ri&ilgios 4ue 3odem ser %on%edidos s/oX

SELE+TX Permite sele%ionar 4ual4uer %oluna de uma es3e%ifi%ada ta?elaI &is/o ou se4u n%ia. Tam?m 3ermite o uso de COPY TO. Esse 3ri&ilgio tam?m ne%ess6rio 3ara referen%iar &alores e@istentes em %olunas em UPDATE ou DELETE. Para se4uNn%iasI este 3ri&ilgio tam?m 3ermite o uso da fun./o currvalY 3BSERTX Permite inserir uma no&a linMa em uma ta?ela es3e%ifi%ada. Permite tam?m COPY FROMY CPD!TEX Permite atualizar 4ual4uer %oluna de uma ta?ela es3e%ifi%ada. 7:a 3r6ti%aI 4ual4uer %omando de atualiza./o n/o tri&ial re4uirir6 3ri&ilgio SELECT ?em %omoI uma &ez 4ue as %olunas da ta?ela 3ara determinar 4ue linMas atualizarI eSou %al%ular no&os &alores 3ara %olunas8. SELECT ... FOR UPDATE e SELECT ... FOR SHARE tam?m re4uerem esse 3ri&ilgioI em adi./o ao 3ri&ilgio de SELECT. Para se4uNn%iasI este 3ri&ilgio 3ermite o uso das fun.!es nextval e setvalY DELETEX Permite deltar uma linMa da ta?ela es3e%ifi%ada. 7:a 3r6ti%aI 4ual4uer DELETE n/o tri&ial re4uirir6 o 3ri&ilgio SELECT ?em %omoI uma &ez 4ue as %olunas da ta?ela tem de referNn%ia 3ara determinar 4uais as linMas 4ue deseEa e@%luir8Y REAEREB+ESX Para %riar uma restri./o de %Ma&e estrangeiraI ne%ess6rio ter este 3ri&ilgio em am?as as ta?elas referen%iadasY TR3GGERX Permite a %ria./o de um gatilMo na ta?ela es3e%ifi%adaY +RE!TEX Para ?an%os de dadosI 3ermite no&os es4uemas serem %riados dentro do ?an%o de dados. Para es4uemasI 3ermite no&os o?Eetos serem %riados dentro do es4uema. Para renomear

'(

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

um o?Eeto e@istenteI &o%N de&e 3ossuir o o?Eeto e ter este 3ri&ilgio 3ara o es4uema 4ue o %ontm. Para bta?les3a%esbI 3ermite ta?elasI Pndi%es e ar4ui&os tem3or6rios serem %riados dentro do bta?les3a%ebI e 3ermite ?an%os de dados serem %riados terem o bta?les3a%eb %omo 3adr/o. 7:ote 4ue re&ogando este 3ri&ilgio n/o 3oder6 alterara lo%aliza./o dos o?Eetos e@istentes8Y +$BBE+TX Permite ao usu6rio %one%tar ao ?an%o de dados es3e%ifi%ado. Este 3ri&ilgio %Me%ado no inP%io da %one@/o 7em adi./o %Me%a 4ual4uer restri.!es im3ostas 3elo ar4ui&o 3gLM?a.%onf8Y TE8P$R!RE ^ TE8PX Permite ta?elas tem3or6rias serem %riadas en4uanto se usa o ?an%o de dados es3e%ifi%adoY EGE+CTEX Permite o uso da fun./o es3e%ifi%ada e o uso de 4uais4uer o3eradores 4ue s/o im3lementados no to3o da fun./o. Este o [ni%o ti3o de 3ri&ilgio 4ue a3li%6&el a fun.!es. 7Sua sinta@e fun%iona 3ara fun.!es de agrega./o8Y CS!GEX Para linguagens 3ro%eduraisI 3ermite o uso de uma linguagem es3e%ifi%ada 3ara %ria./o de fun.!es nela. Este o [ni%o 3ri&ilgio 4ue a3li%6&el a linguagens 3ro%edurais. Para es4uemasI 3ermite a%esso a o?Eetos %ontidos no es4uema es3e%ifi%ado 7su3ondo 4ue os re4uirimentos 3r;3rios de o?Eetos tam?m esteEam 3reen%Midos8. Essen%ialmente isso 3ermite a 4uem %on%edido b3ro%urarb o?Eetos dentro do es4uema. Sem essa 3ermiss/oI ainda 3ossP&el &er os nomes dos o?EetosI 3or e@em3loI %onsultando as ta?elas de sistema. Tam?mI a3;s re&ogar esta 3ermiss/oI b?a%Wendsb e@istentes de&em ter de%lara.!es 4ue E6 tenMam realizado essa 3es4uisaI ent/o n/o uma maneira %om3letamente segura 3ara 3re&enir o a%esso ao o?Eeto. Para se4uNn%iasI este 3ri&ilgio 3ermite o uso das fun.!es currval e nextvalY !LL PR3?3LEGESX #on%ede todos os 3ri&ilgios imediatamente. A 3ala&ra-%Ma&e PRIVILEGES o3%ional no PostgreSQLI em?ora seEa re4uirida 3elo SQL 3adr/o. 2s 3ri&ilgios re4uiridos 3or outros %omandos s/o listados na 36gina de referNn%ia do mesmo. E@em3losX
/* Role continer */ CREATE ROLE masters SUPERUSER; /* Usurio simples */ CREATE ROLE newusr NOSUPERUSER LOGIN ENCRYPTED PASSWORD '123'; /* Tabelas para teste */ CREATE TEMP TABLE tb_acesso1(valor CREATE TEMP TABLE tb_acesso2(valor CREATE TEMP TABLE tb_acesso3(valor CREATE TEMP TABLE tb_acesso4(valor CREATE TEMP TABLE tb_acesso5(valor int); int); int); int); int);

/* Conceder direito de INSERT em 2 tabelas */ GRANT INSERT ON tb_acesso1,tb_acesso2 TO masters; /* Conceder direito de SELECT para qualquer um */ GRANT SELECT ON tb_acesso1 TO PUBLIC; GRANT masters TO newusr; /* Revogando todos os privilegios de todos os usurios em 3 tabelas */ REVOKE ALL ON tb_acesso2,tb_acesso3,tb_acesso4 FROM PUBLIC; /* Revogando o direito de inserir na tabela tb_acesso5 para os roles newusr e masters */ REVOKE INSERT ON tb_acesso5 FROM newusr,masters;

'+

SELE#T "PDATE -:SERT DELETE TR":#ATE RE$ERE:#ES TR-GGER dI...e ALL d PR-5-LEGES e d TA)LE e tablename dI ...e d GR2"P e rolename

SELE#T -:SERT "PDATE RE$ERE:#ES

7 column dI ...e 8 dI...e ALL d PR-5-LEGES e 7 column dI ...e 8 l

"SAGE SELE#T "PDATE dI...e ALL d PR-5-LEGES e d GR2"P e rolename #REATE GRA:T #2::E#T TE9P2RARB f TE9P dI...e ALL d PR-5-LEGES e 2: DATA)ASE dbname dI ...e T2 d H-T> GRA:T 2PT-2: e SEQ"E:#E sequencename dI ...e

"SAGE ALL d PR-5-LEGES e

$2RE-G: DATA HRAPPER fdwname dI ...e

"SAGE ALL d PR-5-LEGES e

$2RE-G: SER5ER servername dI ...e

EFE#"TE ALL d PR-5-LEGES e

$":#T-2: funcname 7 d d argmode e d argname e argtype dI ...e e 8 dI ...e

"SAGE ALL d PR-5-LEGES e

LA:G"AGE langname dI ...e

d GR2"P e rolename

#REATE "SAGE dI...e ALL d PR-5-LEGES e S#>E9A schemaname dI ...e

#REATE ALL d PR-5-LEGES e

TA)LESPA#E tablespacename dI ...e

Role dI ...e

T2

Rolename dI ...e

SELE#T "PDATE -:SERT DELETE TR":#ATE RE$ERE:#ES TR-GGER dI...e ALL d PR-5-LEGES e d TA)LE e tablename dI ...e d GR2"P e rolename

SELE#T -:SERT "PDATE RE$ERE:#ES

7 column dI ...e 8 dI...e ALL d PR-5-LEGES e 7 column dI ...e 8 l

"SAGE SELE#T "PDATE dI...e ALL d PR-5-LEGES e d GR2"P e rolename RE52AE dGRA:T 2PT-2: $2Re #REATE #2::E#T TE9P2RARB f TE9P dI...e ALL d PR-5-LEGES e 2: DATA)ASE dbname dI ...e f RESTR-#Te $R29 d#AS#ADE SEQ"E:#E sequencename dI ...e

"SAGE ALL d PR-5-LEGES e

$2RE-G: DATA HRAPPER fdwname dI ...e

"SAGE ALL d PR-5-LEGES e

$2RE-G: SER5ER servername dI ...e

EFE#"TE ALL d PR-5-LEGES e

$":#T-2: funcname 7 d d argmode e d argname e argtype dI ...e e 8 dI ...e

"SAGE ALL d PR-5-LEGES e

LA:G"AGE langname dI ...e

d GR2"P e rolename

#REATE "SAGE dI...e ALL d PR-5-LEGES e S#>E9A schemaname dI ...e

#REATE ALL d PR-5-LEGES e

TA)LESPA#E tablespacename dI ...e

RE52AE dAD9-: 2PT-2: $2Re

role dI ...e

$R29

rolename dI ...e

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

20.6 - ?erificando os Privilgios de $ 4etos >6 duas maneiras sim3les e e4ui&alentes 3ara se %onsultar os 3ri&ilgios 4ue <roles= tNm so?re um determinado o?EetoX
\dp objeto

73ode ser inter3retado %omo <dis3laC 3ri&ileges=Y e@i?ir 3ri&ilgios8 ou


\z objeto

7seu efeito e@atamente igual ao anterior8 E@em3loX


GRANT ALL ON colaboradores TO aluno ; GRANT SELECT ON colaboradores TO PUBLIC ; \dp colaboradores

Produziu a seguinte saPdaX


\dp colaboradores Access privileges Schema | Name | Type | Access privileges | Column access privileges --------+---------------+-------+---------------------------+-------------------------public | colaboradores | table | postgres=arwdDxt/postgres | : aluno=arwdDxt/postgres : =r/postgres

:o e@em3lo <3ostgres=I 4ue 3or 3adr/o role de administrador tem todos os 3ri&ilgiosI assim %omo <aluno=I %uEos 3ri&igios foram %on%edidos 3or <3ostgres= e PUBLIC tem a%esso de somente leituraI ou seEaI s; 3ode fazer %onsultas 7SELECT8. A?ai@o est/o maiores informa.!es e siglas &istas no e@em3loX rolename_@@@@ -- 3ri&ileges granted to a role _@@@@ -- 3ri&ileges granted to P")L-# r -- SELE#T 7breadbX leitura8 V -- "PDATE 7bVritebX es%rita8 a -- -:SERT 7ba33endbX a%res8 d -- DELETE D -- TR":#ATE @ -- RE$ERE:#ES t -- TR-GGER F -- EFE#"TE " -- "SAGE # -- #REATE % -- #2::E#T T -- TE9P2RARB arVdD@t -- ALL PR-5-LEGES 7Todos os 3ri&ilgios 3ara ta?elasI &aria 3ara outros o?Eetos8 K -- o3./o de %on%ess/o de 3ri&ilgio anterior SCCCC -- role 4ue %on%edeu esse 3ri&ilgio nomeLdeLrole_@@@@ -- Pri&ilgios %on%edidos a um usu6rio ou gru3o _@@@@ -- Pri&ilgios %on%edidos 3ara P")L-#

'1

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

20.7 - +oncedendo o& Revogando Privilgios em +ol&nas Antes da &ers/o D.+ s; era 3ossP&el fazer o %ontrole de a%esso de forma mais granular a uma ta?ela %riando uma &ieV es3e%ifi%ando as %olunas 3ermitidas. Agora 3ode dar ou tirar 3ri&ilgios da seguinte formaX
GRANT SELECT (coluna1,coluna2,...) ON tabela TO role;

Para o e@em3lo 3r6ti%o a %ria./o de roleX


CREATE ROLE limitado LOGIN NOSUPERUSER;

S; ter6 a%esso Zs %olunas <nome= e <snome=I sendo de somente leitura da ta?ela %ola?oradoresX
GRANT SELECT (nome,snome) ON colaboradores TO limitado;

5isualiza./o dos 3ri&ilgiosX


\z colaboradores Access privileges Schema | Name | Type | Access privileges | Column access privileges --------+---------------+-------+---------------------------+-------------------------public | colaboradores | table | postgres=arwdDxt/postgres | nome: : aluno=arwdDxt/postgres : limitado=r/postgres : =r/postgres : snome: : limitado=r/postgres

De forma an6loga ser6 re&ogado 7retirado8 o a%esso Z %oluna <snome=X


REVOKE SELECT (snome) ON colaboradores FROM limitado;

5isualiza./o dos 3ri&ilgios no&amenteX


\z colaboradores Access privileges Schema | Name | Type | Access privileges | Column access privileges --------+---------------+-------+---------------------------+-------------------------public | colaboradores | table | postgres=arwdDxt/postgres | nome: : aluno=arwdDxt/postgres : limitado=r/postgres : =r/postgres

'D

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

2# - D linK * !cessando &m $&tro 9anco de Dados


D)linW um modulo 4ue su3orta %one@!es a outros ?an%os de dados PostgreSQL dentro de uma sess/o de ?an%o de dados. Sinata@eX Para %onsultasX
SELECT * FROM dblink ('dbname=banco_de_dados hostaddr=endereo_de_host user=usurio password=senha port=n_da_porta',consulta_no_banco) AS tabela(campo1 tipo,campo2 tipo, ...);

Para e@e%u.!esX
SELECT dblink_exec ('dbname=banco_de_dados hostaddr=endereo_de_host user=usurio password=senha port=n_da_porta',comando_sql);

-nstala./oX #omo o a3rendizado deste %urso ?aseado na distri?ui./o De?ianI usaremos suas ferramentas. E 3rimeiramente 3re%iso sa?er 4ual o nome do 3a%ote 4ue %ontm o D)linWX
apt-cache search dblink

De 3osse do &alor retornadoX


apt-get install postgresql-contrib

Agora ne%ess6rio sa?er onde est/o os ar4ui&os referentes ao D)linWX


dpkg -L postgresql-contrib | grep dblink.sql /usr/share/postgresql/8.4/contrib/dblink.sql /usr/share/postgresql/8.43/contrib/uninstall_dblink.sql

Sendo 4ueI ao ler o nome dos ar4ui&osI fi%a ;?&io %onstatar 4ue o 3rimeiro instala e o segundo desinstala. A instala./o do m;duloX
psql -d template1 -U aluno -f /usr/share/postgresql/8.4/contrib/dblink.sql

E@em3loX
/* Criao dos bancos de dados */ CREATE DATABASE banco1; CREATE DATABASE banco2; /* Conectando ao banco1 */ \c banco1 /* Criao de uma tabela de exemplo e insero de dados */ CREATE TABLE tb1(campo int); INSERT INTO tb1 VALUES (1),(2),(3),(4),(5),(6),(7); /* Conectando ao banco2 */ \c banco2

'G

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

/* Acessando dados da tabela tb1 que est em banco1 */ SELECT * FROM dblink ('dbname=banco1 hostaddr=127.0.0.1 user=aluno password=123 port=5432','SELECT * FROM tb1') AS tb2(campo int); /* Inserindo dados na tabela tb1 que est em banco1 */ SELECT dblink_exec ('dbname=banco1 hostaddr=127.0.0.1 user=aluno password=123 port=5432','INSERT INTO tb1 VALUES (8),(9)');

(0

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

22 - ?!+CC8 * !locando Es"a.os sem Des"erdHcio


2 %omando VACUUM re%u3era as 6reas de armazenamento o%u3adas 3or registros mortos. Em uma o3era./o normal do PostgreSQLI registros 4ue s/o deletados ou transformados em o?soletos 3or um UPDATE n/o s/o fisi%amente remo&idos de suas ta?elasI eles 3ermane%em 3resentes at o %omando VACUUM ser feito. PortantoI ne%ess6rio e@e%utar o VACCUM 3eriodi%amenteI es3e%ialmente em ta?elas fre4uentemente atualizadas. 2 %omando VACCUM ANALIZE alm do %om3ortamento 3adr/o de VACUUM faz uma an6lise 3ara %ada ta?ela sele%ionada. Essa uma forma de %om?ina./o a%essP&el 3ara s%ri3ts de manuten./o de rotina. 5eEa adiante so?re o %omando ANALIZE 3ara mais detalMes so?re %omo ele 3ro%essa. VACUUM 7sem o 3arRmetro FULL8 a3enas re%u3era o es3a.o e o torna dis3onP&el 3ara reutiliza./o. Essa forma de %omando 3ode o3erar em 3aralelo %om leituras e es%ritas normais da ta?elaI de&ido ao fato de n/o Ma&er uma tra&a 7blo%Wb8 e@%lusi&a. J6 VACUUM FULL faz 3ro%essamento mais e@tensi&oI in%luindo mo&er registros atra&s de ?lo%os 3ara tentar %om3a%tar a ta?ela 3ara o mPnimo n[mero ?lo%os de dis%o. Essa forma muito lenta e re4uer uma tra&a e@%lusi&a em %ada ta?ela en4uanto 3ro%essada. Sinta@eX
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ table ] VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] ANALYZE [ tabela [ (coluna [, ...] ) ] ]

Par/metrosX

$"LL $REExE 5ER)2SE

Re%u3era mais es3a.oI mas le&a mais tem3o e re4uer e@%lusi&idade de tra&a 7blo%Wb8 de ta?ela. Pro&o%a o %ongelamento dos registros. ] um 3arRmetro o?soleto e ser6 remo&ido num futuro lan.amento. -m3rime na tela a ati&idade de relat;rio de b5A#""9b 3ara %ada ta?ela. Pode ser usado 3ara aEudar a determinar %onfigura.!es 3ara bma@LfsmL3agesbI bma@LfsmLrelationsb e bdefaultLstatisti%sLtargetsb 4ue se en%ontram no ar4ui&o b3ostgres4l.%onfb. Atualiza estatPsti%as usadas 3elo 3laneEador 3ara determinar a o modo mais efi%iente 3ara e@e%utar uma %onsulta.

A:ALBxE

E@em3loX
VACUUM ANALYZE VERBOSE colaboradores ;

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

2- - !B!LELE - +oleta de EstatHsticas So re &ma 9ase de Dados


2 %omando ANALYSE %oleta estatPsti%as so?re o %onte[do de ta?elas no ?an%o de dadoes e guarda os resultados na ta?ela de sistema b3gLstatisti%b. Su?se4uen%ianmenteI o 3laneEador de %onsultas usa essas estatPsti%as 3ara aEudar a determinar o 3lano de e@e%u./o mais efi%iente 3ara b4ueriesb. Sem 3arRmetrosI ANALYSE e@amina todas ta?elas no ?an%o de dados %orrente. #om um 3arRmetroI e@amina a3enas a ta?ela determinada. #om o 3arRmetro VERBOSEI Ma?ilita a e@i?i./o de mensagens de 3rogressso. Sinta@eX
ANALYZE [ VERBOSE ] [ tabela [ ( coluna [, ...] ) ] ]

E@em3loX
ANALYZE VERBOSE colaboradores;

2?s.X :a %onfigura./o 3adr/o do PostgreSQLI o daemon de bauto-&a%uumb %uida da an6lise autom6ti%a de ta?elas 4uando s/o %arregadas 3ela 3rimeira &ez %om dados e %omo elas mudam toda o3era./o regular. Quando bauto&a%uumb desa?ilitadoI uma ?oa 3r6ti%a e@e%utar ANALYZE 3eriodi%amenteI ou a3enas a3;s fazer grandes mudan.as no %onte[do da ta?ela. EstatPsti%as aEudam o 3laneEador a es%olMer o mais a3ro3riado 3lano de %onsultas e assim melMorar sua &elo%idade de 3ro%essamento. "ma estratgia %omum rodar o ANALYZE uma &ez ao dia durante um 3erPodo de 3ou%o uso.

('

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

22 - EGPL!3B
Esse %omando e@i?e o 3lano de e@e%u./o 4ue o 3laneEador PostgreSQL gera 3ara %ada instru./o. 2 3lano de e@e%u./o e@i?e %omo a7s8 ta?ela7s8 referen%iada7s8 3or uma instru./o ser6 e@aminada 3or um e@ame se4uen%ial 3lanoI e@ame de Pndi%esI et%. Se m[lti3las ta?elas forem referen%iadasI 4uais algoritmos de Eun./o ser/o usados 3ara unir linMas ne%ess6rias de %ada ta?ela en&ol&ida. Sinta@eX
EXPLAIN [ ANALYZE ] [ VERBOSE ] instruo

ParRmetrosX

A:AL-xE

E@e%uta o %omando e mostra o tem3o real de e@e%u./o

5ER)2SE 9ostra a re3resenta./o interna %om3leta da 6r&ore de 3lanosI ao in&s de a3enas um resumo. "sualmente essa o3./o [til a3enas 3ara 3ro3;sitos de bde?ugb es3e%ializados. instru./o Qual4uer instru./o SELE#TI -:SERTI "PDATEI DELETEI 5AL"ESI EFE#"TE ou DE#LAREI %uEo 3lano de e@e%u./o deeEa &isualizar.

E@em3loX
EXPLAIN ANALYZE SELECT * FROM colaboradores;

((

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

26 - 9acK&" M Restore
#omo tudo 4ue tem dadosI ?an%os de dados PostgreSQL de&em ser b?a%Wu3eadosb regularmente. $undalmentalmenteI M6 trNs diferentes ti3os de t%ni%as 3ara se fazer ?a%Wu3 do PostgreSQLX - SQL dum3X on lineI %om 3gLdum3 ou 3gLdum3allY - Em nP&el de sistema de ar4ui&osX off lineI %om tarI %3I gzi3I ?zi3'I et%Y - Ar4ui&amento %ontPnuoX onlineI utilizando Point -n Time Re%o&erC. )a%Wu3s on line n/o 3aram o ser&i.o do ?an%oI mas reduz a 3erforman%e. J6 os ?a%Wu3s off line ne%essitam 4ue o ser&i.o do ?an%o esteEa 3arado. #ada um tem seus 3ontos 3ositi&os e negati&osI 4ue ser/o dis%utidos. ] altamente re%omend6&el efetuar ?a%Wu3s em 3erPodos 4ue a utiliza./o seEa a menor 3ossP&el.

26.# - 9acK&" SQL

26.#.# - "g0d&m" A idia 3or tr6s deste mtodo de bdum3b gerar um ar4ui&o de te@to %om %omandos SQLI 4ue 4uando restaurado re%riar6 o ?an%o de dados no mesmo estado %om era 4uando o ?a%Wu3 foi efetudado. 2 PostgreSQL dis3oni?iliza um utilit6rioI 3ara ser usado no sMellI o ?3gLdum3. 2 3gLdum3 uma a3li%a./o %lienteI 4ue 3ermite fazer ?a%Wu3s remotamente. E seu uso ?6si%o X
pg_dump nome_do_banco > arquivo_de_saida

Por 3adr/oI o 3gLdum3 faz ?a%Wu3s em formato te@to. >6 a 3ossi?ilidade de se fazer ?a%Wu3s em formato ?in6rio e %om3rimido da seguinte formaX
pg_dump -Fc -f arquivo.dump nome_do_banco

26.#.#.# - Resta&rando do "g0d&m" e o Ctilit5rio "g0restore 2s ar4ui&os de te@to %riados 3elo 3gLdum3 3odem ser inter3retados 3elo utilit6rio 3s4l. A forma geral de %omando 3ara restaurar X
psql nome_do_banco < arquivo_de_entrada

2nde bar4ui&oLdeLentradab o ar4ui&o de saPda usado 3elo %omando 3gLdum3. 2?s.X Ele n/o re%ria o ?an%o de dados %om o %omando CREATE DATABASE ...I %aso o ?an%o n/o e@ista mais e for 3re%iso restaurar atra&s do ar4ui&o gerado 3elo 3gLdum3I antes 3ode re%riar o ?an%o %om o utilit6rio sMellI %uEa fun./o e4ui&ale ao %omando SQL CREATE DATABASEX
createdb nome_do_banco

:o entanto o mtodo a%ima &6lido 3ara <dum3s= feitos em modo te@to. Para restaurar ar4ui&os ?in6rios %om3a%tados 3elo 3gLdum3 utiliza-se o 3rograma 3gLrestoreX
pg_restore -Fc arquivo.dump -d nome_do_banco

(+

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

26.#.2 - "g0d&m"all 2 utilit6rio 3gLdum3 faz %;3ia de seguran.a de um [ni%o ?an%o de dados 3or &ezI e n/o guarda informa.!es so?re roles ou ta?les3a%esI 3ois s/o o?Eetos 4ue n/o de3endem de um ?an%o. Para se fazer ?a%Wu3s de todo %onte[do de um %luster de um %lusterI o utilit6rio 3gLdum3all forne%ido. 2 utilit6rio 3gLdum3all efetua ?a%Wu3s de %ada ?ase de dados 4ue um %luster %ontm e tam?m 3reser&a dados mais a?rangentes %omo roles e defini.!es de ta?les3a%es. :/o faz ?a%Wu3 de )L2)s. Seu uso ?6si%o X
pg_dumpall > arquivo

2 ?a%Wu3 resultante 3ode ser restaurado 3elo utilit6rio 3s4l da seguinte formaX
psql -f arquivo postgres

7AtualmenteI 3ode ser es3e%ifi%ado algum nome de ?ase de dados e@istente 3ara ini%iar o %luster delaI mas se est6 re%arregando as informa.!es em um %luster &azioI ent/o o nome b3ostgresb de&e ser usado8. 26.2 - 9acK&"s "ara 9ancos de Dados Grandes >6 a 3ossi?ilidade de um ar4ui&o de ?a%Wu3 ser maior do 4ue o m6@imo tamanMo 3ermitido 3ara o sistema de ar4ui&os 7file sCstem8 utilizado. Le&ando-se em %onta 4ue o utilit6rio 3gLdum3 3ode im3rimir sua saPda 3ara a telaI 3ossP&el usar ferramentas 3adr/o "ni@ 3ara %ontornar esse 3ossP&el 3ro?lema. A3li%ando o uso do 3i3e bfb e utilit6rios %om %om3ress/o mais 3oderosa do 4ue o formato ?in6rio %om3rimido do 3gLdum3. E@em3loX - #om3rimindo
pg_dump curso | bzip2 -9 > banco.bz2

:o %omando a%imaI o 3gLdum3 en&iaria sua saPda 3ara a telaI mas o 3i3e redire%iona 3ara o ?zi3' 7utilit6rio de %om3ress/o8I 4ue gera o ar4ui&o b?an%o.?z'b. - Restaurando
bzip2 -d -c banco.bz2 | psql curso

2 ar4ui&o des%om3a%tado e mandaria sua saPda 3ara a telaI mas no&amente o 3i3e redire%ionaI desta &ez 3ara o 3s4l 4ue es3e%ifi%a 3ara 4ual ?ase de dados. Quando s; a %om3ress/o n/o resol&e 3odemos di&idir o ar4ui&o resultante em &6rios 3eda.os %om o %omando s3litX
pg_dump nome_do_banco | split -b 10m - arquivo

:o %omando a%imaI o 3i3e re3assa o 4ue seria e@i?ido em tela 3ara o %omando s3lit 4ue di&idir6 o ?a%Wu3 em ar4ui&os de no m6@imo 09) A restaura./o feita da seguinte maneiraX
cat arquivo* | psql nome_do_banco

(,

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

26.- - 9acK&" em BHvel de Sistema de !r%&ivos "ma estratgia alternati&a de ?a%Wu3 %o3iar diretamente os ar4ui&os 4ue o PostgresSQL usa 3ara armazenar os dados da ?ase. Para isso de&e-se sa?er onde est/o tais ar4ui&os. :o %aso da instala./o &ia a3t-get do 3ostgres4l desta &ers/o est6 em bS&arSli?S3ostgres4lSD.+Smainb. Lo%aliza./o o?tida no ar4ui&o 3ostgres4l.%onfI na %onfigura./o de nome bdataLdire%torCb. E@em3lo usando o utilit6rio tar %om %om3ress/o ?zi3'X
tar -cvjf cluster.tar.bz2 /var/lib/postgresql/8.4/main/ --exclude=pg_xlog/*

26.2 - !r%&ivamento +ontHn&o 26.2.# - @!L (@rite-!1ead-Log` Registro Prvio de Escrita, Hrite-AMead Loggin 7HAL8 o mtodo 3adr/o 3ara garantir integridade de dados. 2 %on%eito %entral do HAL 4ue as mudan.as nos ar4ui&os de dados 7onde ta?elas e Pndi%es est/o8 de&em ser gra&adas somente de3ois 4ue tenMam sido es%ritas em logI ou seEaI as altera.!es ser/o efeti&adas fisi%amente 7nos ar4ui&os de dados8. 2s ar4ui&os de log de transa./o s/o %onMe%idos %omo <@log= e est/o armazenados em em su?diret;rio do diret;rio de dados do 3ostgres4l 7<dataLdire%torC= no ar4ui&o de %onfigura./o 3ostgres4l.%onf ou a &ari6&el de am?iente <PGDATA=8. Ent/o o %aminMo 3ara os logs de transa./o em sistemas Linu@S"ni@ <PGDATAS3gL@log= ou em sistemas HindoVsX <TPGDATATc3gL@log=I isso seI as &ari6&eis de am?ientes foram de&idamente %onfiguradas. 2s nomes dos ar4ui&os de log s/o n[meros Me@ade%imaisI sendo 4ue os oito 3rimeiros dPgitos s/o referentes Z sua %ronologia. E@em3loX 0000000-00000000000000 '. Em %aso de <%rasM= 7falMa8 de ?an%o de dados 3ossP&el re%u3erar as transa.!es registradasI sendo 4ue 3ara a3li%ar usa-se <rolling forVard= e 3ara desfazer <rolling ?a%W=. 2 HAL faz %om 4ue n/o seEa 3re%iso sin%ronizar a 6rea de %a%Me em mem;ria da ?ase de dados %om os ar4ui&os fPsi%os a %ada efeti&a./o de uma transa./o. :o ar4ui&o <3ostgres4l.%onf=I os 3arRmetros de %onfigura./o do HAL s/oX
ParRmetro Defini.>es Ati&ado 7on8I o ser&idor PostgreSQL tentar6 %Me%ar se as atualiza.!es est/o fisi%amente es%ritas em dis%oI mediante %Mamadas de sistema fsCn%78 ou &6rios mtodos e4ui&alentes 7&eEa ValLsCn%LmetMod8. -sso assegura 4ue a ?ase de dados 3ode ser re%u3erada 3ara um estado %onsistente a3;s um %rasM de MardVare ou de sistema o3era%ional. :o entantoI o uso de fsCn% resulta em 3erda de 3erforman%eX 4uando uma transa./o efeti&adaI o PostgreSQL de&e es3erar 3elo sistema o3era%ional 3ara li?erar o HAL 3ara o dis%o. Quando o fsCn% est6 desa?ilitado 7off8I 3ermite ao sistema o3era%ional fazer melMores b?ufferingbI ordena./o e tem3oriza./o de es%rita. Resulta em uma insignifi%ante melMora de 3erforman%eI mas se Mou&er um %rasM de sistemaI os resultados das 3ou%as [ltimas transa.!es efeti&adas ser/o 3erdidas 3ar%ialmente ou %om3letamente. Define se a efeti&a./o da transa./o ir6 es3erar 3or registros HAL serem es%ritos no dis%o antes do %omando retornar uma indi%a./o de su%esso 3ara o %liente. Se for desati&ado 7off8I 3oder6 Ma&er um atraso durante o momento de su%esso 4ue re3ortado ao %liente e 4uando a transa./o realmente garantida 3ara ser segura %ontra um %rasM de ser&idor. 9todo usado 3ara for.ar atualiza.!es do HAL 3ara o dis%o. Se fsCn% esti&er desati&ado esta %onfigura./o irrele&anteI E6 4ue as atualiza.!es n/o ser/o todas for.adas a sair. 2s 3ossP&eis &alores s/oX { o3enLdatasCn% 7gra&a ar4ui&os HAL %om a o3./o o3en78 2LDSB:#8Y { fdatasCn% 7%Mama fdatasCn%78 a %ada efeti&a./o8Y { fsCn%LVritetMrougM 7%Mama fsCn%78 a %ada efeti&a./oI for.ando Vrite-tMrougM de 4ual4uer %a%Me de dis%o8Y { fsCn% 7%Mama fsCn%78 a %ada efeti&a./o8Y Padr/o Descri./o

fsCn% 7?oolean8

on

sCn%MronousL%ommit 7?oolean8

on

ValLsCn%LmetMod 7string8

fsCn%

(0

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

{ o3enLsCn% 7gra&a ar4ui&os HAL %om a o3./o o3en78 2LSB:#8. 2?s.X :em todas as o3.!es est/o dis3onP&eis 3ara todas as 3lataformas. fullL3ageLVrites 7?oolean8 on Ati&ado este 3arRmetro faz %om 4ue o ser&idor PostgreSQL es%re&a o %onte[do inteiro de %ada 36gina de dis%o 3ara o HAL durante a 3rimeira modifi%a./o de 36gina de3ois de um %Me%W3oint. 2 total de mem;ria usada na mem;ria %om3artilMada 7sMared memorC8 3ara dados do HAL. Aumentar esse &alor 3ode signifi%ar maior desem3enMo 3ara ?ases de dados 4ue tNm transa.!es grandesI no entantoI faz %om 4ue o PostgreSQL re4ueira mais mem;ria %om3artilMada do 4ue as %onfigura.!es 3adr/o do sistema o3era%ional ofere%em. Define o tem3o entre %i%los de ati&idade 3ara o es%ritor do HAL. Tem3o entre a es%rita de uma efeti&a./o 3ara o ?uffer do HAL e li?era./o do ?uffer 3ara o dis%o em mi%rosegundos. #onfigurando %om um &alor diferente de zero 3ode 3ermitir m[lti3las transa.!es 3ara serem efeti&adas %om a3enas uma %Mamada de sistema fsCn%78I se a %arga de sistema alta o sufi%iente de modo 4ue transa.!es adi%ionais fi4uem 3rontas 3ara efeti&ar dentro do inter&alo es3e%ifi%ado. :[mero mPmino de transa.!es simultRneas a?ertas antes da re4uisi./o de tem3o de %ommitLdelaC. "m &alor maior torna 3ossP&el 3elo menos uma ou outra transa./o fi4ue 3ronta 3ara efeti&ar durante o inter&alo de tem3o.

ValL?uffers ValLVriterLdelaC 7integer8

0+W) '00ms

%ommitLdelaC 7integer8

%ommitLsi?lings 7integer8 +1ecK"oints

%Me%W3ointLsegments 7integer8 %Me%W3ointLtimeout 7integer8 %Me%W3ointL%om3letionLtarget 7floating 3oint8 %Me%W3ointLVarning 7integer8 !r%&ivamento

( ,min 0., (0s

:[mero m6@imo de segmentos de ar4ui&os de log entre %Me%W3oints do HAL 7%ada segmento tem 0 9)8. Aumentando esse 3arRmetro 3ode aumentar tam?m o tem3o ne%ess6rio 3ara um b%rasM re%o&erCb. -nter&alo entre %Me%W3oints autom6ti%os do HAL 73or 3adrao em segundos8. 5aria de (0s a M. Es3e%ifi%a a dura./o do al&o de %Me%W3ointsI %omo uma fra./o de inter&alo de &erifi%a./o. Es%re&e uma mensagem no log do ser&idor se &erifi%a.!es %ausadas 3elo 3reen%Mimento de ar4ui&os de %Me%W3oint a%onte%er mais 3r;@imo do 4ue este n[mero de segundos. xero desa?ilita a mensagem.

ar%Mi&eLmode 7?oolean8

off

Quando Ma?ilitadoI segmentos HAL %om3letados s/o %o3iados 3ara lo%ais determinados 7&er ar%Mi&eL%ommand8. #omando utilizado 3ara ar4ui&ar um segmento do HAL. :a string 3odem ser usados os seguintes artifP%iosX T3 _ 2 %aminMo do ar4ui&o HAL a ser ar4ui&ado Tf _ :ome do ar4ui&o HAL

ar%Mi&eL%ommand 7string8

] im3ortante 4ue o %omando retorne zero em %aso de su%esso. E@em3losX ar%Mi&eL%ommand _ |%3 bT3b S%aminMoSdoSdiretorioSdeSar4ui&amentoSbTfb| ar%Mi&eL%ommand _ |%o3C bT3b b#Xcc%aminMoccdoccdiretorioccdeccar4ui&amentocTfb| ` HindoVs

ar%Mi&eLtimeout 7integer8

Tem3o m6@imo em segundos entre ar4ui&amentos do HALI ou seEaI determina o inter&alo de re%i%lagem do ar4ui&o de logI for.ando o ar4ui&amento. xero desa?ilita. #aso ti&er um &alor muito ?ai@o %om3rometer6 a 3erforman%e do ?an%o de dados.

(1

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

26.2.#.# - 9enefHcios do @!L Redu./o signifi%ati&a do n[mero de es%ritas em dis%oI 3ois 4uando uma transa./o efeti&ada s; 3re%iso des%arregar o ar4ui&o de registro ao in&s de todos os ar4ui&os de dados modifi%ados 3ela transa./oY #onsistNn%ia das 36ginas de dadosI 3ois sem o HAL n/o 3ossP&el garantir %onsistNn%ia em %aso de 4ueda de energia. E 4ual4uer 4ueda durante a es%rita 3oderia resultar emX . LinMas de Pndi%e a3ontando 3ara linMas 4ue n/o e@istemY '. Perda de linMas de Pndi%e nas o3era.!es de 4ue?ra de 36gina 7s3lit8Y (. Ta?elas ou Pndi%es %orrom3idos de&idos a dados 3ar%ialmente gra&ados. Alta dis3oni?ilidade %om a %;3ia dos ar4ui&os de log 3ara outra m64uinaX <Log sMi33ing=.

26.2.#.2 - P3TR - Point 3n Time Recover) #om o P-TR 3ossP&el restaurar o estado do %luster de um tem3o 3assado. Durante todo o tem3oI o PostgreSQL mantm o HAL no su?diret;rio 3@Llog do diret;rio do %lusterI o 4ual %ontm %ada mudan.a 3ara os ar4ui&os da ?ase de dados. Esse log e@iste 3rin%i3almente %ontra falMas de sistemaI 3ois se isso a%onte%erI o ?an%o 3ode ser restaurado %onsistentemente refazendo as entradas efetuadas desde o [ltimo %Me%W3oint. 9asI a e@istNn%ia de logs torna 3ossP&el outra estratgia 3ara se fazer ?a%Wu3 de ?an%os de dadosI 3ode-se %om?inar ?a%Wu3 em nP&el de sistema de ar4ui&os %om ?a%Wu3s dos ar4ui&os do HAL. Se Mou&er ne%essidade de re%u3era./oI restauram-se o ?a%Wu3I 3ara o momento atual. 2?s.X Ondi%es 4ue n/o seEam )-Tree n/o est/o 3resentes no HALI se o ?an%o em 4uest/o ti&er Pndi%es diferentes desse ti3o de&e ser reinde@adoI utilizando o %omando REINDEXI a3;s o trmino do P-TR. 26.2.#.2.# - +onfig&ra./o do !r%&ivamento Primeiramente de&e ser %riado ou determinado o diret;rio de ?a%Wu3 3ara onde ir/o os ar4ui&os de log. :o e@em3lo ser6 usado /srv/wal_backupX
mkdir -p /srv/wal_backup chgrp -R postgres /srv/wal_backup %Mmod -R 11, Ssr&SValL?a%Wu3 # Criao do diretrio # Definindo o grupo de usurios do diretrio ` Permiss/o a mem?ros do gru3o 3ara es%rita

:o ar4ui&o 3ostgres4l.%onf fazer as seguintes modifi%a.!esX


ar%Mi&eLmode _ on

>a?ilita o ar4ui&amentoY
a%Mi&eL%ommand _ o%3 T3 Ssr&SValL?a%Wu3STfo

A3;s as modifi%a.!es serem feitas 3re%iso reini%iar o ser&i.o do PostgreSQL 3ara re%onMe%er essas no&as %onfigura.!esX
/etc/init.d/postgresql restart

2?s.X Se o diret;rio 3@L@log for 3erdidoI os dados dos ar4ui&os 4ue n/o foram ar4ui&ados ser/o 3erdidos.

(D

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

26.2.#.2.2 - AaDendo &m 9acK&" da 9ase 2 3ro%edimento 3ara fazer o ?a%Wu3 ?ase relati&amente sim3lesX . 5erifi4ue se o HAL ar%Mi&ing est6 a?ilitadoY '. #one%te a um ?an%o de dados %omo su3er usu6rio e dN o %omandoX
SELECT pg_start_backup(rotulo);

2nde brotulob 4ual4uer string es%olMida 3ara identifi%ar uni%amente essa o3era./o de ?a%Wu3 7uma ?oa 3r6ti%a usar o %aminMo inteiro 4ue se 3retende destinar o ar4ui&o de ?a%Wu38. A fun./o 3gLstartL?a%Wu3 %ria um ar4ui&o de r;tuloI %uEo nome b?a%Wu3Lla?elbI no diret;rio do %luster %omo informa.!es so?re o ?a%Wu3 ou ent/o %ria um ar4ui&o de e@tens/o <.?a%Wu3= no su?diret;rio <3gL@log=. :/o im3orta em 4ual ?an%o de dados est6 %one%tado 3ara dar esse %omando. A fun./o 3gLstartL?a%Wu3 3ode le&ar muito tem3o 3ara finalizarI de&ido ao fato de ele realizar um %Me%W3ointI e as re4uisi.!es de -S2 7in3utSout3ut _ entradaSsaPda8 3ara um %Me%W3oint ser/o distri?uPdas ao longo de um 3erPodo de tem3o signifi%ati&oI 3or 3adr/o metade do inter&alo de inter-%Me%W3oint 7&er %onfigura./o b%Me%W3ointL%om3letionLtargetb8. :ormalmente isso o deseEado 3or4ue minimaliza o im3a%to no 3ro%essamento de 4ueries. Se deseEar ini%ializar o ?a%Wu3 assim 4ue 3ossP&elI e@e%ute o %omando #>E#AP2-:T 74ue realiza um %Me%W3oint o mais r63ido 3ossP&el8 e em seguidaI imediatamente e@e%ute 3gLstartL?a%Wu3. A fun./o 3gLstartL?a%Wu3 ter6 3ou%o 3ara fazerI 3ois n/o &ai demorar. (. Realize o ?a%Wu3 em nP&el de sistema de ar4ui&o no %luster usando 4ual4uer ferramenta %on&eniente %omo tar ou %3io. :/o ne%ess6rio e nem deseE6&el 3arar o ?an%o de dados en4uanto se faz isso. Por e@em3loI dN o %omando no sMell do sistema o3era%ionalX
tar -cvjf cluster.tar.bz2 /var/lib/postgresql/8.4/main/ --exclude=pg_xlog/*

2?s.X 2 %omando a%ima %riar6 o ?a%Wu3 no diret;rio %orrenteI 3ara sa?er em 4ual diret;rio est6 dN o %omando <3Vd= no sMell. +. A3;s o ?a%Wu3 em nP&el de sistema de ar4ui&os %one%te a um ?an%o de dados dN o %omandoX
SELECT pg_stop_backup();

-sso terminar6 o modo de ?a%Wu3 e realizar6 uma mudan.a autom6ti%a 3ara o 3r;@imo segmento HAL e tam?m gerar6 um Mist;ri%o de ?a%Wu3 na 6rea de ar4ui&amento. 2 inter&alo entre 3gLstartL?a%Wu3 e 3gLsto3L?a%Wu3 3ode ser demorado.

(G

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

26.2.#.2.- - Rec&"era./o P3TR 2 3ior a%onte%eu\\\ ] 3re%iso re%u3erar o ?a%Wu3\ Pro%edimentoX . Pare o ser&i.oI se ele esti&er rodandoY
/etc/init.d/postgresql stop

ou
pg_ctl stop

'. Se Mou&er es3a.o 3ara fazerI %o3ie todo o diret;rio de %luster e 4ual4uer ta?les3a%e 3ara uma lo%alidade tem3or6riaI 3ois 3ode 3re%isar de3ois. #aso n/o Mou&er es3a.oI no mPnimo %o3iar o %onte[do do diret;rio 3gL@logI 3ois 3ode ter logs 4ue n/o foram ar4ui&ados antes do sistema %airY
cp -a $PGDATA/pg_xlog/* /srv/wal_backup

(. A3ague todos ar4ui&os e diret;rios 4ue esti&erem dentro do diret;rio do %luster e so? a raiz de 4ual4uer ta?les3a%e 4ue esti&er em usoY
rm -fr $PG_DATA

+. Restaure os ar4ui&os de seu ?a%Wu3. ] im3ortante ter assegurar as 3ro3riedades %orretas de 3ermiss/o 3ara o usu6rio do sistema do ?an%o de dados 7geralmente o usu6rio 3ostgres8 e n/o %om as 3ermiss!es de root. #aso usar ta?les3a%esI de&e &erifi%ar se os linWs sim?;li%os em vPGDATASt?ls3%S foram %orretamente restauradosY
tar -xvjf cluster.tar.bz2

,. A3ague 4ual4uer ar4ui&o 3resente em vPGDATAS3gL@logI 3ois se originam da restaura./o do ?a%Wu3 e 3ro&a&elmente s/o o?soletos. Se n/o ti&er o %onte[do de de 3gL@logI ele de&e ser re%riadoI tendo %uidado ao assegurar 4ue foi resta?ele%ido %omo linW sim?;li%oI se foi %riado dessa forma antes.
mkdir -p $PGDATA/pg_xlog/archive_status

0. #aso tenMa armazenado os ar4ui&os de segmentos HAL 7&er 3asso '8I de&em ser %o3iados em vPGDATAS3gL@log. ] melMor %o3i6-los e n/o mo&N-losI 3ois assim ainda ter6 os ar4ui&os n/o modifi%ados se um 3ro?lema o%orrerI 3ara e&itar %ome.ar de no&o.
cp -a /srv/wal_backup/* $PGDATA/pg_xlog

1. #riar o ar4ui&o re%o&erC.%onf no diret;rio de %luster. :a instala./o 3adr/o M6 um modelo em bSusrSsMareS3ostgres4lSD.+Sre%o&erC.%onf.sam3leb.


cp /usr/share/postgresql/8.4/recovery.conf.sample $PGDATA/recovery.conf

2?s.X ] a%onselM6&el fazer uma modifi%a./o tem3or6ria no ar4ui&o 3gLM?a.%onf 3ara 3re&enir 4ue usu6rios %omuns se %one%tem at ti&er %erteza 4ue a restaura./o fun%ionou.

+0

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

26.2.#.2.2 - +onfig&ra./o de Resta&ra./o (recover).conf, Estas %onfigura.!es s; 3odem ser feitas no ar4ui&o re%o&erC.%onfI e a3li%6&eis somente durante o 3ro%esso de re%o&erC 7restaura./o8. restoreL%ommand 7string8 ] o %omando 3ara e@e%utar a restaura./o de HAL ar4ui&ados e [ni%a config&ra./o o rigatNria.
restoreL%ommand _ |%3 Ssr&SValL?a%Wu3STf bT3b|

um

re%o&erCLendL%ommand 7string8 Define um %omando 4ue ser6 e@e%utado assim 4ue a restaural./o a%a?ou. Seu 3ro3;sito 3ro&er me%anismo 3ara fazer lim3eza de ar4ui&os a3;s uma re3li%a./o ou re%u3era./o. re%o&erCLtargetLtime 7timestam38 Determina at 4ue data e Mora a re%u3era./o de&e ser feitaI o 3adr/o re%u3erar at o fim dos logs HAL.

re%o&erCLtargetL@id 7string8 -ndi%a at 4ue -D de transa./o a re%u3era./o ser6 feita

re%o&erCLtargetLin%lusi&e 7?oolean8 Determina se &ai 3arar logo a3;s o al&o de restaura./o 7true8 ou 3ou%o antes dele 7false8.

re%o&erCLtargetLtimeline 7string8

Determina a re%u3era./o de uma determinada %ronologia. Por 3adr/o re%u3era ao longo da %ronologia 4ue foi a %ronologia atual 4uando foi feito o ?a%Wu3 da ?ase. 26.2.2 - +ronologias * Timelines A %a3a%idade de restaurar uma ?ase de dados a um 3onto anterior no tem3o %ria algumas %om3le@idades 4ue s/o semelMantes a Mist;rias de fi%./o %ientPfi%a so?re &iagem no tem3o e uni&ersos 3aralelos. :um %aso real de ?an%o de dadosI tal&ez &o%N a3agou uma ta?ela %rPti%a Zs 1X , na ter.a-feiraI mas n/o 3er%e?eu o erro at 4uarta-feira ao meio-dia. Tran4yilamenteI &o%N 3ega seu ?a%Wu3 e o restaura 3ara 1X + de ter.a-feira. Est6 rodando\ :essa Mist;ria de uni&erso de ?an%o de dadosI &o%N nun%a a3agou toda a ta?ela. 9as su3onMa 4ue de3ois &o%N 3er%e?eu 4ue a3;s tudo isso n/o foi uma grande idiaI e gostaria de &oltar 3ara algum tem3o na manM/ de 4uarta-feira na Mist;ria original. 5o%N n/o 3oder6 fazer isso seI en4uanto seu ?an%o de dados esti&er rodandoI ele so?res%re&eu algum dos segmentos seriais do HAL 4ue le&ou at o momento 4ue &o%N deseEa agora retornar. Ent/o &o%N realmente 4uer distinguir as sries de gra&a.!es do HAL geradas a3;s terminar o P-TR da4ueles 4ue foram gerados na Mist;ria original do ?an%o de dados. Para lidar %om esses 3ro?lemas o PostgreSQL tem a no./o de timelines 7%ronologias8. Sem3re 4ue um ar4ui&o de restaura./o %om3letadoI uma no&a timeline %riada 3ara identifi%ar as sries das gra&a.!es de HAL geradas a3;s essa restaura./o. 2 n[mero timeline -D 3arte dos nomes de ar4ui&os de segmentos HALI e ent/o uma no&a timeline n/o &ai so?res%re&er dados gerados 3or timelines anteriores. ] de fato 3ossP&el armazenar muitas %ronologias diferentes. Em?ora 3ossa 3are%er um re%urso in[tilI muitas &ezes sal&a &idas. #onsidere a situa./o onde &o%N n/o tenMa %erteza 4ue 3onto no tem3o re%u3erarI e ent/o tem 4ue fazer muitos P-TRs 3or tentati&a e erro at en%ontrar o melMor lugar 3ara ramifi%ar a 3artir do Mist;ri%o antigo. Sem %ronologias esse 3ro%esso logo geraria uma ?agun.a in%ontrol6&el. #om %ronologiasI &o%N 3ode re%u3erar 3ara 4ual4uer estado anteriorI in%luindo estados de
+

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

ramifi%a.!es de %ronologias 4ue &o%N mais tarde a?andonou. #ada &ez 4ue uma no&a %ronologia %riadaI o PostgreSQL %ria um ar4ui&o de bMist;ri%o da linMa do tem3ob 4ue e@i?e 4ue %ronologia ramifi%a de onde e 4uando. Esses ar4ui&os de Mist;ri%os s/o ne%ess6rios 3ara 3ermitir ao sistema 3egar os ar4ui&os %ertos de segmento HAL 4uando se re%u3era de um ar4ui&o 4ue %ontm &6rias %ronologias. PortantoI elas s/o armazenadas na 6rea de ar4ui&o HAL assim %omo ar4ui&os de segmentos do HAL. 2s Mist;ri%os s/o a3enas 3e4uenos ar4ui&os de te@toI ent/o n/o %usta muito e ade4uado mantNlos indefinidamente 7ao %ontr6rio dos ar4ui&os de segmento 4ue s/o muito grandes8. Se 4uiserI &o%N 3ode adi%ionar %oment6rios ao ar4ui&o de Mist;ri%o 3ara fazer suas 3r;3rias anota.!es so?re %omo e 3or4ue esta %ronologia foi %riada. Tais %oment6rios ser/o es3e%ialmente im3ortantes 4uando &o%N tem um emaranMado de %ronologias diferentes %omo resultado de e@3erimenta./o. 2 %om3ortamento 3adr/o de uma restaura./o re%u3erar ao longo da mesma %ronologia 4ue era 4uando o ?a%Wu3 da ?ase de dados foi tomado. Se deseEar re%u3erar dentro da mesma %ronologia filMa 7isto I &o%N 4uer retornar 3ara algum estado 4ue foi-se gerado a3;s uma tentati&a de restaura./o8I &o%N 3re%isa es3e%ifi%ar o -D da %ronologia al&o no ar4ui&o re%o&erC.%onf 7mais es3e%ifi%amenteI no 3arRmetro <re%o&erCLtargetLtimeline=8. 5o%N n/o 3oder6 re%u3erar dentro de %ronologias 4ue ramifi%aram mais %edo do 4ue o ?a%Wu3 da ?ase. 26.2.2.# - Rec&"era./o P3TR (contin&a./o, D. -ni%ie o ser&idor. 2 ser&idor entrar6 no modo de re%u3era./o e far6 a leitura dos ar4ui&os HAL armazenados 4ue 3re%isa. Se a re%u3era./o for terminada 3or %ausa de um erro e@ternoI o ser&idor 3ode sim3lesmente ser reini%iado e &ai %ontinuar a re%u3era./o. A3;s a %on%lus/o do 3ro%esso de re%u3era./oI o ser&idor renomear6 o ar4ui&o re%o&erC.%onf 3ara re%o&erC.done 73ara 3re&enir entrar no modo de re%u3era./o a%identalmente em %aso de falMa 3osterior8 e ent/o ini%iar as o3era.!es normais de ?an%o de dados. G. E@amine o %onte[do do ?an%o de dados 3ara garantir 4ue &o%N tenMa re%u3erado 3ara onde &o%N 4uer estar. Se n/oI &olte ao 3asso . Se tudo esti&er ?emI 3ermita %one@/o dos usu6rios no&amente restaurando o ar4ui&o 3gLM?a.%onf ao normal. A 3arte fundamental de tudo isso %onfigurar o ar4ui&o de %omando de re%u3era./o 4ue des%re&e %omo &o%N 4uer restaurar e at 4uando o re%o&erC de&e rodar.

+'

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

27 - +onfig&ra.>es de 8emNria e !4&stes de Desem"en1o


9uitas 3essoas erroneamente 3ensam 4ue o PostgreSQL um SG)D muito lento. :o entantoI o 4ue a%onte%e 4ue 3or 4uest!es de %om3ati?ilidade %om %onfigura.!es de MardVare modestasI os aEustes 3adr!es s/o tam?m modestos. Para %onfigura.!es de MardVare mais 3otentes 3odem ser feitas modifi%a.!es 4ue aumentam o desem3enMo %onsidera&elmente. Essas modifi%a.!esI no 3ostgres4l.%onf s/o feitas seguindo o modelo 3arRmetro _ &alorI sendo 4ue 3ara &alores numri%os n/o se usa se3arador de milMar e 3ara &alores n/o numri%os 7te@toSstring8 o &alor de&e fi%ar entre as3as sim3lesX 3arRmetro_o&aloro. Antes de 4ual4uer modifi%a./oI &amos %riar uma ta?ela de e@em3lo e 3o3ul6-la signifi%ati&amenteX #ria./o da ta?elaX
CREATE TABLE tb_tuning_teste( codigo serial primary key, valor1 int, valor2 int, valor3 int, texto varchar(50) );

:o sMell digiteX
for i in $(seq 1 10000); do psql -d curso -c \ "INSERT INTO tb_tuning_teste (valor1,valor2,valor3,texto) VALUES \ ($i*2,$i*3,$i*4,now()||' '||'$i'),($i*2,$i*3,$i*4,now()||' '||'$i'),\ ($i*2,$i*3,$i*4,now()||' '||'$i'),($i*2,$i*3,$i*4,now()||' '||'$i'),\ ($i*2,$i*3,$i*4,now()||' '||'$i'),($i*2,$i*3,$i*4,now()||' '||'$i'),\ ($i*2,$i*3,$i*4,now()||' '||'$i'),($i*2,$i*3,$i*4,now()||' '||'$i'),\ ($i*2,$i*3,$i*4,now()||' '||'$i'),($i*2,$i*3,$i*4,now()||' '||'$i');" done

2 %omando a%ima gerar6 00.000 registros na ta?ela %riada. Essa o3era./o demorar6 alguns minutosX :o 3s4l digiteX
EXPLAIN ANALYZE SELECT * from tb_tuning_teste WHERE (codigo%2=0) ORDER BY valor3 DESC;

Re3ita %in%o &ezes e &eEa os resultados. Ser/o e@i?idos %omo segueX


QUERY PLAN ------------------------------------------------------------------------------------------------------------------------Sort (cost=2502.71..2503.96 rows=500 width=50) (actual time=191.541..248.919 rows=50000 loops=1) Sort Key: valor3 Sort Method: external merge Disk: 2952kB -> Seq Scan on tb_tuning_teste (cost=0.00..2480.30 rows=500 width=50) (actual time=0.023..77.225 rows=50000 loops=1) Filter: ((codigo % 2) = 0) Total runtime: 281.811 ms (6 rows)

+(

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

27.# - S1ared 8emor) Tam?m %onMe%ida %omo memNria com"artil1adaI uma 4uantidade de mem;ria dis3oni?ilizada 3elo sistema o3era%ional 3ara fins de %omuni%a./o entre 3ro%essos 7-P#X -nter-Pro%ess #omuni%ation8. A %onfigura./o da mem;ria %om3artilMada feita atra&s de 3arRmetros do WernelX
Descri./o Quantidade m6@ima 7em ?Ctes8 de um segmento de S>99AF mem;ria %om3artilMada S>9ALL ParRmetro S&gest/o de ?alor ',0W) m 7D.'W) K sMaredL?uffers8 m 7 +.'W) K ma@L%onne%tions8

Total de mem;ria %om3artilMada dis3onP&el 7em 36ginas 2 &alor e4ui&alente ao de S>99AF _ S>99AF S +0G0 de +A)8

27.#.# - ?is&aliDando os ?alores de 8emNria +om"artil1ada Res3e%ti&amenteI 3ara %ada um dos 3arRmetros do Wernel %itadosI no sMell dN os %omandosX
cat /proc/sys/kernel/shmmax cat /proc/sys/kernel/shmall

27.#.2 - 8odificando os ?alores de 8emNria +om"artil1ada >6 trNs maneiras 3ara fazer a modifi%a./oI am?as %omo usu6rio root do sistemaX . A forma n/o efeti&aI ao reini%iar a m64uina a %onfigura./o &oltar6 ao 4ue era antesX
echo 322838528 > /proc/sys/kernel/shmmax echo 78818 > /proc/sys/kernel/shmall

'. $orma definiti&a 3or edi./oI a?rindo o ar4ui&o Set%SsCs%tl.%onf e ent/o altere ou adi%ione as seguintes linMas referentes ao 3arRmetros Wernel.sMmma@ e Wernel.sMmallX
Wernel.sMmma@ _ (''D(D,'D Wernel.sMmall _ 1DD D

Sal&eI saia e dN o %omando no 3rom3tX


sysctl -p

(. A forma definiti&a 3or %omandoI sem 3re%isar editar ar4ui&oX


sysctl -w kernel.shmmax=322838528 sysctl -w kernel.shmall=78818

2 utilit6rio sCs%tl usado 3ara modifi%ar 3arRmetros do Wernel em tem3o de e@e%u./o.

++

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

27.2 - +onfig&ra.>es de +ons&mo de Rec&rsos no "ostgres%l.conf 27.2.# - Gerenciamento de Trava * LocK 8anagement 27.2.#.# - deadlocK0timeo&t (integer, f Padr/o` #s 5amos assumir de uma forma otimista 4ue dead lo%Ws n/o s/o %omuns em a3li%a.!es de 3rodu./o e a3enas es3era 3or uma tra&a en4uanto antes de %ome.ar a ?us%ar 3or um dead lo%W. Aumentando este &alor reduz a 4uantidade de tem3o gasto em %Me%agens de dead lo%W sem ne%essidade. 2 &alor 3adr/o de um segundo 7 s8 3ro&a&elmente o menor &alor 4ue &ai 4uerer na 3r6ti%a. Em um ser&idor muito %arregado &o%N 3ode 4uerer aumentar esse &alor. -dealmente o aEuste de&e e@%eder o tem3o tP3i%o de transa./oI de modo a melMorar as %Man%es 4ue uma tra&a ser6 li?erada antes da de%is/o do sistema 3ara %Me%ar 3or dead lo%Ws. Quando o 3arRmetro logLlo%WLVaits est6 aEustadoI determina tam?m o tem3o de es3era antes 4ue uma mensagem de log en&iada so?re a es3era de lo%W 7tra&a8. Se &o%N est6 in&estigando atrasos de lo%Wing &o%N de&e 4uerer aEustar um &alor menor 3ara logL%Me%WLVaits do 4ue um deadlo%WLtimeout normal. 27.2.#.2 - maP0locKs0"er0transaction (integer, f Padr/o` 72 #ontrola o n[mero mdio de tra&as alo%adas 3ara %ada transa./oY transa.!es indi&iduais 3odem tra&ar mais o?Eetos en4uanto %omo as tra&as de todas transa.!es se aEustam na ta?ela de tra&a 7lo%W ta?le8. Este n/o o n[mero de linMas 4ue de&em ser tra&adasI esse ilimitado. 2 &alor 3adr/o 70+8I tem Mistori%amente tem se %om3ro&ado sufi%ienteI mas &o%N de&e 3re%isar aumentar se tem %lientes 4ue a%ionam ta?elas diferentes em uma [ni%a transa./o. Ao aumentar esse 3arRmetro 3ode fazer %om 4ue o PostgreSQL re4uira mais mem;ria %om3artilMada do 4ue sua %onfigura./o 3adr/o 3ermite. 27.2.2 - 8emNria 27.2.2.# - s1ared0 &ffers (integer, f Padr/o` 2289 "m dos mais im3ortantes 3arRmetros 4ue influen%ia diretamente no desem3enMo do sistema de ?an%o de dados. Determina a 4uantidade de mem;ria 7?uffer8 da mem;ria %om3artilMada 4ue o PostgreSQL usa. Esse 3arRmetro e@3resso es%re&endo o &alor diretamente %om o sufi@o de medida 7A)I9)I..8 ou um n[mero 3uro 4ue re3resenta a 4uantidade de ?lo%os de D A). E@em3los e4ui&alentesX
sMaredL?uffers _ '+9) ` 5alor em 9)

ou
sMaredL?uffers _ (01' ` (01' 36ginas de DA) ^ 7Qtd em 9) @ 0'+8 S D

E eis ent/o a 4uest/oX <Com qual valor ajusto shared buffers!" A res3osta mais ade4uada X <# quantidade adequada para este par$metro % o maior n&mero poss'vel que n(o prejudique outras atividades no servidor." Para reaEustar esse 3arRmetro 3re%iso tam?m reaEustar os &alores de sMmma@ e sMmall do
+,

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

Wernel. Primeiro se define a 4uantidade deseEada 3ara o 3arRmetro sMaredL?uffersI e ent/o a 4uantidade 3ara a mem;ria %om3artilMada 7sMmma@8 ser6 determinada 3ela seguinte f;rmulaX S>99AF _ ',0W) m 7D.'W) K sMaredL?uffers8 m 7 +.'W) K ma@L%onne%tions8 E@em3loX Su3ondo 4ue a m64uina 4ue o ser&idor Postgres esteEa tenMa a3enas G) 7 0'+ 9)8I e (00 9) seEa uma 4uantidade segura de mem;ria 3ara destinar ao 3arRmetro sMared ?uffers e o 3arRmetro ma@L%onne%tions seEa igual a 0X sMaredL?uffers _ 7(00@ 0'+8 S D ^ sMaredL?uffers _ (D+00 ent/oX S>99AF _ ',0W) m 7D.'W) K(D+008m7 +.'W) K 08 _ ( ,'1' W) 5alor em ?CtesX S>99AF _ ( ,'1' @ 0'+ _ (''D(D,'D Pre%isamos agora do &alor 3ara S>9ALLX S>9ALL _ S>99AF S +0G0 _ (''D(D,'D S +0G0 _ 1DD D 2W. Agora temos os &alores 3ara sMmma@ e sMmall. ] 3re%iso fazer %om 4ue o Wernel re%onMe.a esses &aloresX
sysctl -w kernel.shmmax=322838528 sysctl -w kernel.shmall=78818

E 3or fimI a3;s todos os %6%ulosI no ar4ui&o 3ostgres4l.%onfI &amos definir finalmenteI a 4uantidade de (009) 3ara o 3arRmetro sMared ?uffersX
sMaredL?uffers _ (D+00

ou
sMaredL?uffers _ (009)

27.2.2.2 - tem"0 &ffers (integer, f Padr/o` ;89 #onfigura a 4uantidade m6@ima de ?uffers tem3or6rios usados em %ada sess/o de ?an%o de dados. Esses s/o ?uffers de sess/o lo%al a"enas &sados "ara ta elas tem"or5rias. A %onfigura./o 3ode ser alterada %om sess!es indi&iduaisI mas a3enas at o 3rimeiro uso de ta?elas tem3or6rias dentro de uma sess/oY tentati&as su?se4uentes 3ara mudar o &alor n/o ter6 efeito nessa sess/o. "ma sess/o sess/o alo%ar6 ?uffers tem3or6rios %onforme o ne%ess6rio at o limite dado de tem3L?uffers. 2 %usto de %onfigurar um &alor muito alto em sess!es 4ue realmente n/o 3re%isam de muitos ?uffers tem3or6rios a3enas um des%ritor de ?ufferI ou %er%a de 0+ ?Ctes 3or in%remento em tem3L?uffers. PormI se um ?uffer realmente usado um adi%ional de D G' ?Ctes 7DA)8 ser6 %onsumido 3or ele. E@em3loX
tem3L?uffers _ D9)

+0

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

27.2.2.- - maP0"re"ared0transactions (integer, f Padr/o` 0 #onfigura o m6@imo n[mero de transa.!es 4ue 3odem estar em um estado <3re3aradas= simultaneamente 7PREPARE TRA:SA#T-2: do manual do PostgreSQL8. AEustando este 3arRmetro 3ara zero desa?ilita a %ara%terPsti%a de transa./o 3re3arada 73re3ared transa%tion8. Se n/o 3laneEa usar esse re%ursoI seu &alor de&e ser zero 3ara 3re&enir %ria./o a%idental de transa.!es 3re3aradas. #aso esti&er usando transa.!es 3re3aradasI 3ro&a&elmente gostaria 4ue ma@L3re3aredLtransa%tions seEa no mPnimo o mesmo &alor de ma@L%onne%tionsI de modo 4ue %ada sess/o 3ode ter uma transa./o 3re3arada 3endente. Aumentanto ma@L3re3aredLtransa%tions %usta a3ro@imadamente 000 ?Ctes de de mem;ria %om3artilMada 3or slot de transa./oI mais lo%W s3a%e 7&eEa ma@Llo%WsL3erLtransa%tion8. 27.2.2.2 - OorK0mem f Padr/o #89 Determina a 4uantidade de ?uffers de mem;ria %om3artilMada utilizada 3elo Postgres. Tem efeito em o3era.!es de ordena./o 3ara mani3ula./o eSou %onsulta de Pndi%es. Es3e%ifi%a a 4uantidade de mem;ria usada 3or o3era.!es internas de %lassifi%a./o e ta?elas MasM antes de alternar 3ara ar4ui&os tem3or6rios em dis%o. Para %ada %onsulta %om3le@aI muitas %onsultas e o3era.!es de MasM de&em rodar 3aralelamenteY %ada uma ser6 3ermitida 3ara usar tanta mem;ria 4uanto este &alor es3e%ifi%a antes dele %ome.ar a inserir os dados em ar4ui&os tem3or6rios. Alm dissoI &6rias sess!es em e@e%u./o 3oderiam fazer tais o3era.!es simultaneamente. Ent/o o total de mem;ria usado 3ode ser muitas &ezes o &alor de VorWLmemY ne%ess6rio 3ara manter esse fato em mente 4uando es%olMer o &alor. o3era.!es de %lassifi%a./o s/o usadas 3or 2RDER )BI D-ST-:#T e J2-:s. Ta?elas MasM s/o usadas em J2-:s de MasMI agrega./o ?aseada em MasM e MasMes ?aseados em 3ro%essamento de su?%onsultas -:. 5amos alterar 3ara (09) o &alorX
VorWLmem _ (09)

27.2.2.6 - maintenance0OorK0mem (integer, f Padr/o` #789 Es3e%ifi%a a 4uantidade m6@ima de mem;ria 3ara ser usada em o3era.!es de manuten./oI %omo 5A#""9I #REATE -:DEFI e ALTER TA)LE ADD $2RE-G: AEB. Desde 4ue a3enas uma dessas o3era.!es 3ossa ser e@e%utada em um momento 3or uma sess/oI e uma instala./o normalmente n/o tenMa muitas delas rodando atualmenteI seguro %onfigurar este &alor signifi%antemente maior do 4ue VorWLmem. 9aiores %onfigura.!es de&em melMorar a 3erforman%e 3ara 5A#""9 e 3ara restaurar ?a%Wu3s. :ote 4ue en4uanto o auto&a%uum rodaI at auto&a%uumLma@LVorWers essa mem;ria de&e der alo%adaI ent/o tenMa %uidado 3ara n/o %onfigurar o &alor 3adr/o t/o alto. E@em3loX
maintenan%eLVorWLmem _ 009)

27.2.2.7 - maP0stacK0de"t1 (integer, f Padr/o` 289 Determina a 3rofundidade m6@ima segura de 3ilMas em e@e%u./o. A %onfigura./o ideal 3ara este 3arRmetro o atual limite de tamanMo de 3ilMa e@e%utada 3elo Wernel menos uma margem segura de 9). A margem de seguran.a ne%ess6ria 3or4ue a 3rofundidade de 3ilMa n/o %Me%ada em todas rotinas no ser&idorI mas a3enas nas 3rin%i3ais rotinas 3oten%ialmente re%ursi&as %omo a&alia./o de e@3ress/o. A %onfigura./o 3adr/o um &alor seguro %ontra falMasI mas muito ?ai@o 3ara 3ermitir e@e%u./o de fun.!es %om3le@as. A3enas su3er usu6rios 3odem mudar essa %onfigura./o. Definir ma@Lsta%WLde3tM %om um &alor mais alto do 4ue o atual limite do Wernel signifi%a 4ue uma fun./o re%ursi&a 4ue es%a3ar 3ode 4ue?rar um 3ro%esso indi&idual de ?a%Wend. Em 3lataformas onde o Postgres 3ode determinar o limite do WernelI n/o &ai dei@ar definir essa &ari6&el 3ara um &alor n/o seguro. PormI nem todas as 3lataformas forne%em a
+1

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

informa./oI ent/o re%omendado ter %autela ao %onfigurar esse &alor. E@em3loX


ma@Lsta%WLde3tM _ ,9)

27.2.- - Cso de Rec&rsos do Uernel 27.2.-.# - maP0files0"er0"rocess (integer, f Padr/o` #000 #onfigura o n[mero m6@imo 3ermitido de ar4ui&os a?ertos simultaneamente 3ara %ada su?3ro%esso do ser&idor. Se o Wernel im3or um limite seguro 3or 3ro%essoI n/o 3re%isa se 3reo%u3ar %om esta %onfigura./o. 9as em algumas 3lataformas 7a maioria dos sistemas )SD8I o Wernel 3ermitir6 3ro%essos indi&iduais a a?rir muito mais ar4ui&os do 4ue o sistema 3ode realmente su3ortar 4uando um grande n[mero de 3ro%essos de todos os 4ue tentam a?rir muitos ar4ui&os. Se a3are%er uma mensagem de falMaX bToo manC o3en filesbI tente reduzir esta %onfigura./o. E@em3loX
ma@LfilesL3erL3ro%ess _ 000

27.2.-.2 - s1ared0"reload0li raries (string, f Padr/o` Yem rancoZ Esta &ari6&el define uma ou mais ?i?liote%as %om3artilMadas 4ue de&em ser %arregadas na ini%ializa./o do ser&idor. Se de&e %arregar mais de uma ?i?liote%aI se3are seus nomes %om &Prgulas. Por e@em3loX ovli?dirSmCli?o a?rir6 mCli?.so 7em alguns sistemasY mCli?.sl8 3ara ser %arregada do diret;rio de instala./o 3adr/o de ?i?liote%as. )i?liote%as de linguagens 3ro%edurais 3odem ser %arregadas desse EeitoI ti3i%amente usando a sinta@e ovli?dirS3lFFFo onde FFF 3gs4lI 3erlI t%l ou 3CtMon. #arregando a ?i?liote%a %om3artilMadaI seu tem3o de ini%ializa./o e&itado 4uando usada 3ela 3rimeira &ez. :o entantoI o tem3o 3ara ini%ializar %ada no&o 3ro%esso de ser&idor de&e aumentar ligeiramenteI mesmo se esses 3ro%essos nun%a usem essa ?i?liote%a. Ent/oI alterar esse 3arRmetro re%omendado a3enas 3ara ?i?liote%as 4ue ser/o usadas na maior 3arte das sess!es. Se uma ?i?liote%a es3e%ifi%ada n/o for en%ontradaI o ser&idor falMar6 ao ini%ializar. Todas ?i?liote%as su3ortadas 3elo PostgreSQL tem um <?lo%o m6gi%o= 7magi% ?lo%8 4ue %Me%ado 3ara garantir %om3ati?ilidade. Por essa raz/oI ?i?liote%as n/o-PostgreSQL n/o 3oder/o ser %arregadas desse Eeito. E@em3loX
sMaredL3reloadLli?raries _

27.2.2 - +&sto 9aseado no Tem"o de ?!+CC8 Durante a e@e%u./o de %omandos VACCUM e ANALYZEI o sistema mantm um %ontador interno 4ue mantm o %ontrole de %usto estimado de &6rias o3era.!es -S2 7in3utSout3ut ^ entradaSsaPda8 4ue s/o realizadas. Quando o %usto a%umulado al%an.a um limite 7es3e%ifi%ado 3or &a%uumL%ostLdelaC8. Ent/o ele &ai zerar o %ontador e %ontinua a e@e%u./o. A inten./o dessa %ara%terPsti%a 3ermitir administradores reduzir o im3a%to de -S2 desses %omandos em ati&idades de ?an%o de dados simultRneas. >6 muitas situa.!es em 4ue n/o muito im3ortante 4ue %omandos de manuten./o %omo 5A#""9 e A:ALBxE terminem ra3idamenteY 3ormI muito im3ortante 4ue esses %omandos normalmente n/o interfiram signifi%antemente na Ma?ilidade 4ue o sistema realiza o3era.!es de ?an%o de dados. #usto ?aseado no tem3o de 5A#""9 7#ost-?ased &a%uum delaC8 forne%e uma maneira 3ara administradores al%an.arem isso. Esta %ara%terPsti%a desa?ilitada 3or 3adr/o 3ara %omandos 5A#""9 en&iados. Para Ma?ilitar defina o 3arRmetro &a%%umL%ostLdelaC 3ara um &alor diferente de zero.
+D

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

27.2.2.# - vac&&m0cost0dela) (integer, f Padr/o` 0ms Dura./o do tem3o em milisegundosI 4ue o 3ro%esso aguardar6 4uando o limite de %usto 7%ust limit8 for e@%edido. 5alores 3ositi&os Ma?ilitam esse 3arRmetro. Em muitos sistemasI a resolu./o efeti&a de Mi?erna./o de 0msY %onfigurando &a%uumL%ostLdelaC 3ara um &alor 4ue n/o um m[lti3lo de 0 de&e ter os mesmos resultados %omo os %onfigurados no 3r;@imo n[mero maior 4ue 0. Quando o %usto ?aseado em &6%uo 7%ost-?ased &a%uuming8 usado de forma a3ro3riada 3ara &a%uumL%ostLdelaC s/o normalmente &alores muito 3e4uenosI tal&ez 0 ou '0 milisegundos. AEustando o re%urso de %onsumo de &6%uo melMor feito aEustando outros 3arRmetros de %usto de &6%uo. E@em3loX
&a%uumL%ostLdelaC _ 0ms

27.2.2.2 - vac&&m0cost0"age01it (integer, f Padr/o` # 2 %usto estimado 3ara &6%uo de um ?uffer en%ontrado no %a%Me de sMared ?uffer. Ele re3resenta o %usto 3ara tra&ar as re4uisi.!es de ?ufferI 3es4uisa a ta?ela de MasM %om3artilMada e &as%ulMa o %onte[do da 36gina. E@em3loX
&a%uumL%ostL3ageLMit _

27.2.2.- - vac&&m0cost0"age0miss (integer, f Padr/o` #0 2 %usto estimado 3ara &6%uo de um ?uffer 4ue tem 4ue ser lido do dis%o. -sso re3resenta o esfor.o 3ara tra&ar as re4uisi.!es de ?ufferI 3es4uisa a ta?ela de MasM %om3artilMadaI lN o ?lo%o deseEado do dis%o e &as%ulMa seu %onte[do. E@em3loX
&a%uumL%ostL3ageLmiss _ 0

27.2.2.2 - vac&&m0cost0"age0dirt) (integer, f Padr/o` 20 2 %usto estimado %o?rado 4uando o &6%uo modifi%a um ?lo%o 4ue foi 3re&iamente lim3o. Ele re3resenta o -S2 re4uirido 3ara li?erar o ?lo%o lim3o no dis%o no&amente. E@em3loX
&a%uumL%ostL3ageLdirtC _ '0

+G

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

27.2.2.6 - vac&&m0cost0limit (integer, f Padr/o` 200 2 %usto a%umulado 4ue %ausar6 a Mi?erna./o do 3ro%esso de &6%uo. >6 determinadas o3era.!es 4ue mantNm ?lo4ueios %rPti%os e de&e ent/o %om3letar o mais r63ido 3ossP&el. #ustos ?aseados no tem3o de &6%uo n/o o%orrem durante durante tais o3era.!es. PormI 3ossP&el 4ue o %usto a%umule muito mais do 4ue o limite es3e%ifi%ado. Para e&itar longos atrasos nesses %asosI o atual 7delaC8 %aul%ulado 3or &a%uumL%ostLdelaC K a%%umulatedL?alan%e S &a%%umL%ostLlimit %om um m6@imo de &a%%umL%ostLdelaC K +. E@em3loX
&a%uumL%ostLlimit _ '00

27.2.6 - 9acKgro&nd @riter >6 um 3ro%esso se3arado %Mamado ?a%Wground VriterI %uEa fun./o en&iar es%ritas de sMared ?uffers suEos 7dirtC8. A inten./o 4ue o 3ro%esso do ser&idor mani3ule %onsultas de usu6rios 3ara 4ue raramente ou nun%a tenMa 4ue es3erar 3ara 4ue uma es%rita o%orraI 3or4ue o ?a%Wground Vriter o far6. :o entantoI M6 um aumento signifi%ati&o de %arga de -S2I 3or4ue uma 36gina re3etidamente suEa de&e ser es%rita a3enas uma &ez 3or inter&alo de %Me%W3ointI mas o ?a%Wground Vriter de&e gra&6-lo muitas &ezes no mesmo inter&alo. 2s 3arRmetros dis%utidos em seguida 3odem ser usados 3ara melMorar o desem3enMo do %om3ortamento 3ara ne%essidades lo%ais. 27.2.6.# - gOriter0dela) (integer, f Padr/o` 200ms Es3e%ifi%a o tem3o entre rodadas de ati&idade 3ara o ?a%Wground Vriter. Em %ada round 7rodada8 o Vriter es%re&e 3ara um determinado n[mero de ?uffers suEos 7%ontrol6&el 3elos 3arRmetros seguintes8. Em seguida ele es3era 3elo tem3o do &alor de ?gVriter e re3ete. Em muitos sistemasI a resolu./o efeti&a de tem3o de Mi?erna./o 0msY %onfigurando ?gVriterLdelaC 3ara um &alor 4ue n/o um m[lti3lo de 0 de&e ter os mesmos resultados %om %onfigur6-lo 3ara o 3r;@imo m[lti3lo de 0. E@em3loX
?gVriterLdelaC _ '00ms

27.2.6.2 - gOriter0lr&0maP"ages (integer, f Padr/o` #00 Em %ada rodadaI n/o mais do 4ue isso muitos ?uffers ser/o es%ritos 3elo ?a%Wground Vriter. #onfigurando isso 3ara zero desa?ilita ?a%Wground Vriting 7e@%eto 3ara ati&idades de %Me%W3oint8. E@em3loX
?gVriterLlruLma@3ages _ 00

27.2.6.- - gOriter0lr&0m&lti"lier (floating "oint, f Padr/o` 2.0 2 n[mero de ?uffers suEos es%ritos em %ada rodada ?aseado no n[mero de no&os ?uffers 4ue tem sido ne%ess6rios 3or 3ro%essos do ser&idor durante rodadas re%entes. A mdia re%ente ne%ess6ria multi3li%ada 3elo ?gVriterLlruLmulti3lier 3ara %Megar a um n[mero estimado de n[mero de ?uffers 4ue 3re%iso durante a 3r;@ima rodada. )uffers suEos s/o es%ritos at 4ue MaEa muitos lim3osI ?ufferes dis3onP&eis reutiliz6&eis. 73ormI n/o mais do 4ue ?uffers ?gVriterLlruLma@3ages ser/o es%ritos 3or rodada.8 AssimI uma %onfigura./o de .0 re3resenta uma 3olPti%a <Eust in time= de es%rita e@atamente o n[mero de ?uffers 3re&isto 3ara ser ne%ess6rio. 5alores maiores forne%em amorte%imento %ontra 3i%os de demandaI en4uanto &alores menores inten%ionalmente dei@a es%ritas 3ara serem feitas 3or 3ro%essos do
,0

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

ser&idor. 5alores menores de ?gVriterLlruLma@3ages e ?gVriterLlruLmulti3lier reduz a %arga e@tra de -S2 %ausada 3elo ?a%Wground VriterI torna mais 3ro&6&el 4ue 4ue os 3ro%essos do ser&idor ter6 4ue en&iar es%ritas 3ara si mesmosI atrasando %onsultas interati&as. E@em3loX
?gVriterLlruLmulti3lier _ '.0

27.2.7 - +om"ortamento !ssHncrono 27.2.7.# - effective0io0conc&rrenc) (integer, f Padr/o` # #onfigura o n[mero de o3era.!es simultRneas de -S2 de dis%o 4ue o PostgreSQL es3era serem e@e%utadas. Aumentando este &alor ele&a o n[mero de o3era.!es de -S2 4ue 4ual4uer sess/o indi&idual do PostgreSQL tenta ini%iar em 3aralelo. A fai@a de &alores 3ermita de a 000I ou zero 3ara desati&ar soli%ita.!es assPn%ronas de -S2. "m ?om 3onto de 3artida 3ara essa %onfigura./o o n[mero de dri&es se3aradosI in%lusi&e 3ara RA-D. :o entantoI se o ?an%o de dados est6 fre4uentemente o%u3ado %om m[lti3las %onsultas feitas em sess!es %on%orrentesI &alores mais ?ai@os de&em ser sufi%iente 3ara manter o dis%o de arraC o%u3ado. "m &alor mais alto do 4ue o ne%ess6rio 3ara manter os dis%os o%u3ados resultar/o a3enas em o&erMead e@tra de #P". E@em3loX
effe%ti&eLioL%on%urren%C _

27.2.: - +onstantes de +&sto do Plane4ador As &ari6&eis de %usto des%ritas nessa se./o s/o mensuradas em uma es%ala ar?itr6ria. A3enas seus &alores relati&os im3ortamI 3ortanto dimensionando todos eles 3ara %ima ou 3ara ?ai@o 3elo mesmo fator resultar6 em nenMuma mudan.a nas es%olMas do 3laneEador. Tradi%ionalmenteI essas &ari6&eis tem sido referen%iadas 3ara ?us%as de 36ginas se4uen%iais %omo unidade de %ustoI isto I se4L3ageL%ost %on&en%ionalmente aEustada 3ara .0 e as outras &ari6&eis de %usto s/o definidas %om referNn%ia a essa. 9as &o%N 3ode usar uma es%ala diferente se 3referirI %omo os tem3os de e@e%u./o em milisegundos em uma m64uina es3e%Pfi%a. -nfelizmente. n/o M6 nenMum mtodo ?em definido 3ara determinar &alores ideais 3ara &ari6&eis de %usto. Eles s/o melMores tratados %omo mdias so?re todas as %onsultas 4ue uma instala./o 3arti%ular far6. -sso signifi%a 4ue mudando-os %om ?ase em algumas 3ou%as e@3eriNn%ias arris%ado 27.2.:.# - se%0"age0cost (floating "oint, f Padr/o` #.0 AEusta a estimati&a do 3laneEador de %usto de uma 36gina do dis%o ?us%ar 4ual a 3arte de uma srie de ?us%a se4uen%ial. E@em3loX
se4L3ageL%ost _ .0

27.2.:.2 - random0"age0cost (floating "oint, f Padr/o` 2.0 #onfigura a estimati&a do 3laneEador de %usto de uma 36gina de dis%o n/o-se4uen%ialmente,

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

?us%ada. Reduzindo este &alor relati&o a se4L3ageL%ost far6 %om 4ue o sistema 3refira ?us%as inde@adasI aumentando far6 as ?us%as inde@adas 3are%erem mais %ustosas. 5o%N 3ode aumentar ou diminuir am?os os &alores Euntos 3ara mudar a 3rioridade de %ustos de -S2 de dis%os 3ara %ustos de #P"I 4ue ser/o des%ritos 3elos 3arRmetros seguintes. Di%aX A3esar de o sistema 3ermitir definir ramdomL3ageL%ost 3ara menos do 4ue se4L3ageL%ostI ele n/o fisi%amente sensato fazN-lo. PormI aEustando-os igualmente faz sentido se o ?an%o de dados esti&er totalmente no %a%Me da mem;ria RA9I 3or4ue neste %ason/o Ma&er6 3enalidade 3ara maneEar 36ginas fora de se4uNn%ia. Alm dissoI em um ?an%o de dados 3esadamente em %a%Me &o%N de&er6 a?ai@ar am?os os &alores relati&os 3ara os 3arRmetros de #P"I desde 4ue o %usto 3ara ?us%ar uma 36gina E6 em RA9 muito menor do 4ue ele normalmente seria. E@em3loX
randomL3ageL%ost _ +.0

27.2.:.- - c"&0t&"le0cost (floating "oint, f Padr/o` 0.0# Define a estimati&a do 3laneEador de %usto de 3ro%essamento de %ada linMaI durante uma %onsulta. E@em3loX
%3uLtu3leL%ost _ 0.0

27.2.:.2 - c"&0indeP0t&"le0cost (floating "oint, f Padr/o` 0.006 Define a estimati&a do 3laneEador de %usto de 3ro%essamento de %ada entrada de Pndi%e durante a &arredura do Pndi%e. E@em3loX

%3uLinde@Ltu3leL%ost _ 0.00,

27.2.:.6 - c"&0o"erator0cost (floating "oint, f Padr/o` 0.0026 Define a estimati&a do 3laneEador de %usto de 3ro%essamento de %ada o3erador ou fun./o e@e%utados durante uma %onsulta. E@em3loX
%3uLo3eratorL%ost _ 0.00',

27.2.:.7 - effective0cac1e0siDe (integer, f Padr/o` #2;89 TMis 3arameter Mas no effe%t on tMe size of sMared memorC allo%ated ?C PostgreSQLI nor does it reser&e Wernel disW %a%MeY it is used onlC for estimation 3ur3oses. Define a su3osi./o do 3laneEador so?re o tamanMo efeti&o de %a%Me de dis%o 4ue est6 dis3onP&el 3ara uma [ni%a %onsulta. ] um dos elementos de estimati&a de %usto de uso de um Pndi%eY um &alor mais alto 3ro&al&elmente far6 %om 4ue &arreduras de Pndi%es seEam utilizadasI um &alor mais ?ai@o 3ro&a&elmente far6 mais ?us%as se4uen%iais. Ao %onfigurar este 3arRmetro de&e %onsiderar os sMared ?uffers do PostgreSQL e a 3or./o de mem;ria %a%Me do dis%o do Wernel 4ue ser6 usado 3ara ar4ui&os de dados. Alm dissoI %onsiderar o n[mero de %onsultas simultRneas em ta?elas diferentesI uma &ez 4ue ter6 de %om3artilMar o es3a.o dis3onP&el.
,'

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

Este 3arRmetro n/o tem efeito no tamanMo da mem;ria %om3artilMada alo%ada 3elo PostgresI nem faz reser&a de %a%Me de dis%o do WernelI s; usado 3ara fins de estimati&a. "m ?om &alor sugerido 3ara este 3arRmetro 'S( da mem;ria RA9. E@em3loX
effe%ti&eL%a%MeLsize _ 0D'9)

,(

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

2: - 3nstala./o a Partir do +Ndigo Aonte f +om"ila./o


-nstalar o Postgres a 3artir do %;digo fonte 3ermite uma fle@i?ilidade maior 3ara um D)AI 3odendo in%luir re%ursos. 5eEamos algumas das &antagens em fazer a instala./o a 3artir do %;digo fonteX Es%olMer uma &ers/o es3e%Pfi%a ao in&s de a3enas a 4ue est6 no re3osit;rioY $azer a %om3ila./o de a%ordo %om a ar4uitetura do 3ro%essadorY Dentre &6rias %oisasI 3ode-se definir em 4ue 3orta as %one@!es 3oder/o es%utarI diret;riosI et%Y 2 3ro%esso de %om3ila./o analisa seu MardVare 73rin%i3almente 3ro%essador e mem;ria8I fazendo assim %om 4ue a instala./o a3ro&eite melMor os re%ursos do ser&idorY

2:.# - 3nstalando . -nstalar 3rogramas e ?i?liote%as ne%ess6rios 3ara %om3ila./o do sour%e do PostgresX #omo usu6rio rootX
apt-get install build-essential libreadline5-dev zlib1g-dev gettext

'. :o seu ?roVser entre no endere.oX Mtt3XSSVVV.3ostgres4l.orgSft3Ssour%eS Ao a?rir o siteI ser/o e@i?idas algumas 3astas 4ue re3resentam uma &ers/oI %li4ue so?re a &ers/o deseEada e ent/o a3are%er6 outra tela %om os ar4ui&os dis3onP&eis 3ara ?ai@ar. Esses ar4ui&os est/o nos formatos tar.gz e tar.?z' e alm desses M6 um ar4ui&o .md, 3ara %ada umI 3ara fazer o %Me%Wsum. :o nosso e@em3lo ?ai@aremos a3enas o ar4ui&o .?z'I o 4ual de&ido Z sua %om3ress/o ser maior um ar4ui&o de menor tamanMo e %onse4uentemente mais r63ido de ?ai@ar. Es%olMa um mirror 7%li4ue8I 3ara ?ai@ar o ar4ui&o .?z'. De 3referNn%ia ?ai@e o ar4ui&o no diret;rio <Stm3=. (. #om o ar4ui&o ?ai@ado 3re%isamos des%om3a%t6-loX
tar xvjf postgresql-XXXX.tar.bz2

2nde <FFFF= a &ers/o do softVare ?ai@ado. +. 5amos %riar um usu6rio de sistema 4ue ser6 o usu6rio do %lusterI seu gru3o e tam?m definir o lo%al do %lusterI 4ue tam?m ser6 o diret;rio Mome do usu6rioX Gru3oX d?grou3 "su6rioX d?master Diret;rio do #lusterX Sd?Ldata Diret;rio de instala./o do PostgreSQLX SusrSlo%alS3ostgres4l E@e%ute os dois %omandos %omo rootX
groupadd dbgroup useradd -g dbgroup -d /db_data -s /bin/bash -c "Postgres User" dbmaster -m

Sendo 4ueX -g ^ gru3o do usu6rioI -d ^ diret;rio Mome do usu6rioI -% ^ %oment6rio e -m ^ for.a a %ria./o do diret;rio Mome.
passwd dbmaster # define a senha do usurio dbmaster

,. DN a 3ro3riedade do %;digo 3ara o usu6rio d?master e 3ara seu gru3oX


chown -R dbmaster:dbgroup postgresql-XXXX/ ,+

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

0. Entre no diret;rio do sour%eX


cd postgresql-XXXX/

1. Antes de %ome.armos a %om3ilar 3ara 4ue o %;digo seEa %om3ilado de uma maneira a ofere%er um maior desem3enMo &amos definir algumas &ari6&eis de am?ienteX Para di&idir a %om3ila./o em ' tra?alMos 7Eo?s8I 3ara #P"s de ' n[%leosX
export MAKEOPTS="-j2"

9em;ria %a%Me 3ara %om3ila./o de ,009X


export CCACHE_SIZE="500M"

Es3e%Pfi%as 3ara sistemas de (' ou 0+ ?itsX Para sistemas de (' )itsX


export CHOST="i686-pc-linux-gnu" export CFLAGS="-march=native -O3 -m32 -pipe" export CXXFLAGS="${CFLAGS}"

Para sistemas de 0+ )itsX


export CHOST="x86_64-pc-linux-gnu" export CFLAGS="-march=native -O3 -m64 -pipe" export CXXFLAGS="${CFLAGS}"

2?s.X :o %aso das &ari6&eis es3e%Pfi%as 7(' ou 0+ ?its8 s/o de a%ordo %om a &ers/o do seu sistema instaladoI ressaltando 4ue sistemas de 0+ ?its tNm desem3enMo muito su3erior aos de ('. 2 su3orte a um sistema de 0+ ?its e@ige um 3ro%essador de 0+ ?its. E@3li%a./o das flags usadas nas &ari6&eisX -mar%M_%3u-tC3e Gera instru.!es 3ara o ti3o de 3ro%essador da m64uina. -nati&e Produz o %;digo otimizado 3ara a m64uina lo%alI auto dete%tando o modelo de #P". -m(' -m0+ Gera %;digoI res3e%ti&amenteI 3ara am?ientes de (' ?its ou de 0+ ?its. -3i3e A%elera o 3ro%esso de %om3ila./oI mas n/o M6 ganMos no tem3o de e@e%u./o. -2dne 7letra b2b mai[s%ula8 2timiza./o. $az %om 4ue %om3ila./o le&e mais tem3o e muito mais mem;ria. #om esta o3./o o %om3ilador tenta reduzir o tamanMo do %;digo e o tem3o de e@e%u./o. >6 trNs nP&eis de otimiza./oX b-2 bI b-2'b e b-2(bI sendo 4ue b-2(b o nP&el mais alto. D. Agora &amos Z %om3ila./o em si. DN os %omandosX
su dbmaster -c "./configure --prefix=/usr/local/postgresql --bindir=/usr/local/bin \ --sbindir=/usr/local/sbin" ,,

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

make && make install

#omo nossas otimiza.!es e@igem muito do 3ro%essadorI Mora de tomar um %af\ G. Para ini%iarmos o 3ostgres4l 3re%isamos do s%ri3t de ini%ializa./oX
cp /tmp/postgresql-XXXX/contrib/start-scripts/linux /etc/init.d/postgresql chmod 755 /etc/init.d/postgresql update-rc.d postgresql start 70 S . stop 21 0 6 .

2?s.X :a 3asta %ontri? do %;digo fonte do PostgreSQL M6 tam?m fun.!es 4ue 3or 3adr/o n/o est/o no PostgreSQLI %omo a fun./o d?linW. ] 3re%iso editar o ar4ui&o Set%Sinit.dS3ostgres4l e mude os seguintes &aloresX
3refi@X SusrSlo%alS3gs4l ^ 3refi@_SusrSlo%alS3ostgres4l PGDATAX SusrSlo%alS3gs4lSdata ^ Sd?LdataS?ase PG"SERX 3ostgres ^ d?master DAE92:_bv3refi@S?inS3ostmasterb ^ bSusrSlo%alS?inS3ostmasterb PG#TL_bv3refi@S?inS3gL%tlb ^ bSusrSlo%alS?inS3gL%tlb

0. #rie o %lusterX
su dbmaster -c "/usr/local/bin/initdb -E utf8 -D /db_data/base"

. #omo root ini%ialize o 3ro%esso do 3ostgres %om o s%ri3tX


/etc/init.d/postgresql start

'. 23%ionalmente 3ode ser adi%ionada a seguinte linMaI relati&a Z &ari6&el de diret;rio do %lusterX
e@3ort PGDATA_bSd?LdataS?aseb

As &ari6&eis s; 3assar/o a &aler 3ro usu6rio na 3r;@ima &ez 4ue ele logarI a n/o ser 4ue ele dN o %omandoX
source ~/.bashrc

,0

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

2; - 3nstala./o do PostgreSQL no @indoOs


2 uso do PostgreSQL na 3lataforma HindoVs n/o en%oraEadoI 3rin%i3almente 3ela 3erforman%e muito inferior a sistemas o3era%ionais "ni@ liWe 7Linu@I SolarisI )SDs8. 9as 3ara 4uem n/o tem nenMum desses sistemas o3era%ionais instalados em seu %om3utadorI a?ai@o est/o os 3ro%edimentos 3ara a atual &ers/o 7D.+.'8X . )ai@e o instalador do seguinte endere.oX VVV.3ostgres4l.orgSdoVnloadSVindoVs '. 56 at o diret;rio onde ?ai@ou o instalador e dN um du3lo %li4ue so?re ele e siga os 3assosX Setu3 - PostgreSQL ^ :e@t -nstallation Dire%torC ^ #XcAr4ui&os de 3rogramascPostgreSQLcD.+ ^ :e@t Data Dire%torC ^ #XcAr4ui&os de 3rogramascPostgreSQLcD.+cdata ^ :e@t PassVord -a Digite e redigite uma senMa 3ara o su3er usu6rio do Postgres -a :e@t Port ^ ,+(' Ad&an%ed 23tions ^ Lo%ale_dDefault lo%aleeI d e -nstall 3lS3gs4l in tem3late data?asew ^ :e@t Read to -nstall ^ :e@t #om3leting tMe PostgreSQL Setu3 Hizard ^ d e Laun%M Sta%W )uilder at e@itw ^ $inisM -ni%iar -a #onfigura.!es -a Painel de #ontrole -a Sistema Guia bA&an.adob -a 5ari6&eis de Am?iente 5ari6&eis do sistema -a PatM -a Editar -a Adi%ione no final da linMaX bY#XcAr4ui&os de 3rogramascPostgreSQLcD.+c?inb 7sem as as3as8 -a 2A -a 2A -a 2A -ni%iar -a E@e%utar... -a ArirX %md -a 2A 3s4l -" 3ostgres

,1

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

EPtras
+Ndigo do 9anco de Dados Csado como EPem"lo (+o"ie= cole e salve,
--CRIAO DO BANCO DE DADOS "curso" --CREATE DATABASE curso ENCODING='utf8' LC_COLLATE='pt_BR.UTF-8' LC_CTYPE='pt_BR.UTF-8' TEMPLATE=template0; CREATE DATABASE curso; \c curso --TABELA COLABORADORES CREATE TABLE colaboradores ( mat_id character(5) NOT NULL, nome character varying(15) NOT NULL, snome character varying(30) NOT NULL, cargo character varying(15), setor character varying(15), uf character(2) DEFAULT 'SP'::bpchar, cidade character varying(15), salario real, dt_admis date, chefe_direto character(5), CONSTRAINT colaboradores_pkey PRIMARY KEY (mat_id), CONSTRAINT chefe_direto_fk FOREIGN KEY (chefe_direto) REFERENCES colaboradores(mat_id) ) WITH (OIDS=FALSE); ALTER TABLE colaboradores OWNER TO postgres; COMMENT ON TABLE colaboradores IS 'Funcionrios da empresa'; --TABELA PRODUTOS CREATE TABLE produtos ( prod_id character varying(5) NOT NULL, nome character varying(15) NOT NULL, preco real, qtd integer, descr text, CONSTRAINT produtos_pkey PRIMARY KEY (prod_id) ) WITH (OIDS=FALSE); ALTER TABLE produtos OWNER TO postgres; --TABELA PEDIDO CREATE TABLE pedido ( ped_id character varying(5) NOT NULL, prod character varying(5), vendedor character varying(5), CONSTRAINT pedido_pkey PRIMARY KEY (ped_id), CONSTRAINT prod_fk FOREIGN KEY (prod) REFERENCES produtos (prod_id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION, CONSTRAINT vend_fk FOREIGN KEY (vendedor) REFERENCES colaboradores (mat_id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION ) WITH (OIDS=FALSE); ALTER TABLE pedido OWNER TO postgres; --TABELA FUNCIONARIOS PREMIADOS CREATE TABLE funcionarios_premiados( premio_id varchar(5) primary key, mat_id varchar(15), CONSTRAINT pk_funcionario FOREIGN KEY (mat_id) REFERENCES colaboradores (mat_id) ); ,D

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

--INSERTS --Insero de dados na tabela colaboradores INSERT INTO colaboradores VALUES ('00001','Chiquinho','da Silva','Diretor','Marketing',DEFAULT,'So Paulo',8500.51,'1999-1020','00001'), ('00002','Almerinda','Santos','Recepcionista','Recepo',DEFAULT,'So Paulo',850.63,'199704-04','00003'), ('00003','Estrovzio','da Silva','Diretor','Publicidade',DEFAULT,'So Paulo',8500.51,'199705-30','00001'), ('00004','Wolfrmio','Leite','Qumico','Laboratrio 1',DEFAULT,'So Paulo',5400.32,'1999-0313','00003'), ('00005','Estrncio','Junqueira','Faxineiro','Limpeza',DEFAULT,'So Paulo',600.00,'2000-1025','00003'), ('00006','Azevino','Xavier','Porteiro','Portaria','MG','Belo Horizonte',1020.34,'1997-0315','00007'), ('00007','Sandra','Lima','Diretor','Logstica','MG','Belo Horizonte',3200.51,'2003-0404','00001'), ('00008','Vagner','da Silva','Office Boy','Expedio','SP','Jundia',550.48,'2002-0623','00012'), ('00009','Elisa','Macedo','Vendedor','Marketing','MG','Belo Horizonte',2300.00,'2005-0919','00007'), ('00010','Teobaldo','Moura','Web Designer','Publicidade','RJ','Niteri',3210.00,'2000-0827','00031'), ('00011','Radnio','Xavier','Qumico','Laboratrio 13','RJ','Niteri',5400.32,'2003-1111','00031'), ('00012','Cludia','Carvalho','Contador','Financeiro',DEFAULT,'Jundia',2500.51,'2002-1212','00001'), ('00013','Natlia','Costa','Diretor','TI',DEFAULT,'So Paulo',4559.72,'2002-02-02','00001'), ('00014','Agevsio','Ramalho','Contador','Financeiro',DEFAULT,'So Paulo',3002.00,'2005-0504','00003'), ('00015','Gertrudes','Trevizan','Auxiliar','Expedio',DEFAULT,'So Paulo',850.00,'2000-0606','00003'), ('00016','Estrncio','da Silva','Engenheiro','Laboratrio 3','SP','So Paulo',7100.00,'199707-07','00003'), ('00017','Agatemor','Santos','Programador','TI',DEFAULT,'So Paulo',2500.00,'1998-1103','00003'), ('00018','Alzevina','dos Santos','Estagirio','Marketing',DEFAULT,'So Paulo',822.20,'200801-09','00003'), ('00019','Deoclcio','Diniz','Motorista','Logstica',DEFAULT,'So Paulo',1500.00,'2005-0504','00003'), ('00020','Anglica','Santos','Estagirio','Publicidade','AM','Manaus',1000.00,'2009-0404','00021'), ('00021','Sandra','Vilares','Gerente','Financeiro','AM','Manaus',5000.00,'2007-0504','00001'), ('00022','Joana','Ferraz','Programador','TI','AM','Manaus',2500.00,'2009-01-04','00021'), ('00023','Elmeraldo','da Silva','Motorista','Logstica','SP','So Paulo',1000.00,'2009-0204','00003'), ('00024','Beatriz','Xavier','Qumico','Laboratrio 13','RJ','Niteri',3500.00,'2008-1120','00031'), ('00025','Fernanda','Toledo','Vendedor','Marketing','MG','Belo Horizonte',1400.00,'2006-1213','00007'), ('00026','Tnia','Costa','An. de Sistemas','TI','AM','Manaus',4500.00,'2008-12-10','00021'), ('00027','Zeoclcio','Teodoro','Motorista','Logstica','AM','Manaus',1200.00,'2008-0131','00021'), ('00028','Mariana','Xavier','Vendedor','Logstica','SP','Jundia',1200.00,'2009-0722','00003'), ('00029','Lucrcia','Ramalho','Programador','TI',DEFAULT,'Jundia',2200.00,'2007-0707','00003'), ('00030','Martina','Santos','An. de Sistemas','TI','SP','Jundia',4200.00,'2007-0930','00003'), ('00031','Alice','Santos','Engenheiro','Laboratrio 13','RJ','Niteri',7200.00,'2008-0112','00031'), ('00032','Paula','Franco','Programador','TI','SP','Jundia',2100.00,'2007-09-30','00003'); INSERT INTO colaboradores (mat_id,nome,snome) VALUES ('00033','Z','Ningum'), ('00034','%///teste','teste'), ('00035','_///teste','teste'); --Insero de dados na tabela funcionarios premiados

,G

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

INSERT INTO funcionarios_premiados VALUES ('00001','00007'), ('00002','00013'), ('00003','00004'), ('00004','00021'), ('00005','00010'); INSERT INTO funcionarios_premiados (premio_id) VALUES ('00006'),('00007'),('00008'), ('00009'),('00010'),('00011'),('00012');

00

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

Dicas Em %&e endere.o est5 esc&tando'


SHOW listen_addresses ; listen_addresses -----------------------localhost,192.168.10.7 (1 row)

+riando anco de dados latin# em &m cl&ster &tf-;

CREATE DATABASE sistema_outros ENCODING='latin1'LC_COLLATE='pt_BR.ISO-8859-1' LC_CTYPE='pt_BR.ISO-8859-1' TEMPLATE=template0;

Bgmero de coneP>es a ertas no servidor


SELECT count(procpid) FROM pg_stat_activity;

Bgmero de coneP>es a ertas em &m determinado anco


SELECT count(procpid) FROM pg_stat_activity WHERE datname='nome_do_banco';

Bgmero de coneP>es a ertas em cada anco do servidor


SELECT datname,numbackends FROM pg_stat_database;

Q&ais R$LES est/o conectados ao servidor= sendo %&e oid \ #0 o &s&ario %&e inicialiDa o cl&ster
SELECT oid,rolname FROM pg_authid;

Tomando as Rdeas do Grande Elefante dos Dados - PostgreSQL

9i ilografia
Do%umenta./o ofi%ial do PostgreSQL 1tt"`IIOOO."ostgres%l.orgI Do%umenta./o ofi%ial do G:" #om3iler #olle%tion 7G##8 1tt"`IIgcc.gn&.orgI

0'

You might also like