SlideShare uma empresa Scribd logo
1 de 84
Baixar para ler offline
Estripando o Elefante
   Como estender o
    PostgreSQL...
  … estripando sua aplicação e dividindo
            um problemão em
   problemas menores utilizando extensões?




            por Dickson S. Guedes
                   (@guediz)
           PGBR 2011, 4 de Novembro
Estripando o Elefante
   Como estender o
    PostgreSQL...
  … estripando sua aplicação e dividindo
            um problemão em
   problemas menores utilizando extensões?




            por Dickson S. Guedes
                   (@guediz)
           PGBR 2011, 4 de Novembro
ADVERTÊNCIA!
ESTA PALESTRA
 POSSUI CONTEÚDO
QUE PODE QUEBRAR
     CERTOS
 PARADÍGMAS SEUS
“Quando você faz as
  coisas sempre do
mesmo jeito, obterá
 sempre os mesmos
  resultados” – Alguém
No começo haviam vários bancos
espalhados com várias funções...
PostgreSQL 9.0
              +
          PL/Perl
              +
Funções definidas pelo usuário
… e então perdeu-se o controle.
… e então perdeu-se o controle.

         Gerenciamento manual
         Não havia controle de versão
         Falta de abstração, e modularidade
         Sem reutilização de código
Como melhorar?
Primeiramente entendendo o
        problema...
Primeiramente entendendo o
         problema...

Pensando fora da caixa!
pessoas                       usuarios



     email_valido()          cpf_valido()




PL/perl               PL/pgsql              SQL


             PostgreSQL 9.1
As aplicações precisavam ser
       modularizadas...
As aplicações precisavam ser
       modularizadas...

     … e o banco precisava ser
                    atualizado
As aplicações precisavam ser
       modularizadas...

     … e o banco precisava ser
                    atualizado
Até então não tinhamos....
●   Versionamento de funções no banco
●   Gerenciamento de contribs
    ●     saber facilmente quais contribs estão instaladas, por exemplo
●   Modularidade
●   Reaproveitamento de código
●   Contribuições para comunidade
●   ...
Até então não tinhamos....
●   Versionamento de funções no banco
●   Gerenciamento de contribs
    ●     saber facilmente quais contribs estão instaladas, por exemplo
●   Modularidade
●   Reaproveitamento de código
●   Contribuições para comunidade
●   ...

            SIM! Eu consigo dividir para conquistar!
Tá! E como o PostgreSQL pode
           ajudar?
EXTENSÕES
EXTENSÕES

  POR QUE?
Porque o PostgreSQL é
divertidamente estendível !
Por que o PostgreSQL é
divertidamente estendível ?
Por que o PostgreSQL é
divertidamente estendível ?

É guiado por catálogo!
Catálogo do sistema


             Metadados


                      Dicionário de dados
Catálogo do sistema


             Metadados


                      Dicionário de dados

Diferença para outros SGDBS?
Tabelas
Colunas
              Tipos de dados
                                Funções
   Domínios
                          Métodos de acesso
                    ...
Tabelas
Colunas
              Tipos de dados
                                Funções
   Domínios
                          Métodos de acesso
                    ...
PostgreSQL não é
     apenas um
Sistema Gerenciador
de Banco de Dados ...
… ele é uma Plataforma
de Desenvolvimento de
      Aplicações
Você desenvolve bibliotecas de
  extensões reutilizáveis …
… e as combina para criar aplicações!
Vamos começar!
Banco PostgreSQL 9.0
           Varias tabelas
Várias funções em varias linguagens
         Código sem testes
 Pouco versionamento das funcoes
O dump possui o codigo das funcoes
Gerenciamento atraves de esquemas
Cadastro de pessoas
CREATE TABLE pessoas
(
     nro_cpf   cpf   PRIMARY KEY,
     nome      text NOT NULL,
     data_nascimento date
);
Cadastro de pessoas
CREATE TABLE pessoas
(
     nro_cpf   cpf   PRIMARY KEY,
     nome      text NOT NULL,
     data_nascimento date
);
Cadastro de pessoas
INSERT INTO pessoas(nro_cpf, nome, data_nascimento)
VALUES
(88274557875, 'Adaloso Cachimbinho Lustrado', '1981-04-22'),
(96672786465, 'Enelildo Protolino Calado'   , '1983-02-13'),
(88856899302, 'Feicebuque Ailaique'         , '1976-07-06'),
(12563330858, 'Torrecilda Tapelia'          , '1987-11-16'),
(27837882334, 'Almofafio Vasildo Tomado'    , '1965-01-08'),
(25616561282, 'Uessebelson Blutuf'          , '1983-05-11');
Cadastro de pessoas
INSERT INTO pessoas(nro_cpf, nome, data_nascimento)
VALUES
(88274557875, 'Adaloso Cachimbinho Lustrado', '1981-04-22'),
(96672786465, 'Enelildo Protolino Calado'   , '1983-02-13'),
(88856899302, 'Feicebuque Ailaique'         , '1976-07-06'),
(12563330858, 'Torrecilda Tapelia'          , '1987-11-16'),
(27837882334, 'Almofafio Vasildo Tomado'    , '1965-01-08'),
(25616561282, 'Uessebelson Blutuf'          , '1983-05-11');
Cadastro de pessoas
INSERT INTO pessoas(nro_cpf, nome, data_nascimento)
VALUES
(88274557875, 'Adaloso Cachimbinho Lustrado', '1981-04-22'),
(96672786465, 'Enelildo Protolino Calado'   , '1983-02-13'),
(88856899302, 'Feicebuque Ailaique'         , '1976-07-06'),
(12563330858, 'Torrecilda Tapelia'          , '1987-11-16'),
(27837882334, 'Almofafio Vasildo Tomado'    , '1965-01-08'),
(25616561282, 'Uessebelson Blutuf'          , '1983-05-11');

Mas...
INSERT INTO pessoas(nro_cpf, nome, data_nascimento)
VALUES
(12312312300, 'Ester Lionata Rio', '1981-04-22')
Cadastro de pessoas
INSERT INTO pessoas(nro_cpf, nome, data_nascimento)
VALUES
(88274557875, 'Adaloso Cachimbinho Lustrado', '1981-04-22'),
(96672786465, 'Enelildo Protolino Calado'   , '1983-02-13'),
(88856899302, 'Feicebuque Ailaique'         , '1976-07-06'),
(12563330858, 'Torrecilda Tapelia'          , '1987-11-16'),
(27837882334, 'Almofafio Vasildo Tomado'    , '1965-01-08'),
(25616561282, 'Uessebelson Blutuf'          , '1983-05-11');


Mas...
INSERT INTO pessoas(nro_cpf, nome, data_nascimento)
VALUES                VIOLATION!
(12312312300, 'Ester Lionata Rio', '1981-04-22')
Cadastro de usuarios
CREATE TABLE usuarios (
     login email PRIMARY KEY,
    nro_cpf cpf REFERENCES
pessoas(nro_cpf)
);
Cadastro de usuarios
CREATE TABLE usuarios (
     login email PRIMARY KEY,
    nro_cpf cpf REFERENCES
pessoas(nro_cpf)
);
Um operador especial
CREATE OPERATOR #? (
     LEFTARG   = numeric,
     PROCEDURE = cpf_valido
);
Um operador especial
CREATE OPERATOR #? (
     LEFTARG   = numeric,
     PROCEDURE = cpf_valido
);
Um operador especial
CREATE OPERATOR @? (
     LEFTARG = citext,
     PROCEDURE = email_valido
);
Um operador especial
CREATE OPERATOR @? (
     LEFTARG = citext,
     PROCEDURE = email_valido
);
Cadastro de usuarios
INSERT INTO usuarios (login, nro_cpf)
VALUES
    ('adaloso@cahimbinho.net', 88856899302),
    ('enelildo@calado.com',     96672786465),
    ('feicebuque.ailaique@facebook.com', 88856899302),
    ('tata.torre87@hotmail.com', 12563330858),
    ('tomado35@gmail.com',       27837882334),
    ('usb.83@aasdasdasd.com',    25616561282);
Cadastro de usuarios
INSERT INTO usuarios (login, nro_cpf)
VALUES
    ('adaloso@cahimbinho.net', 88856899302),
    ('enelildo@calado.com',     96672786465),
    ('feicebuque.ailaique@facebook.com', 88856899302),
    ('tata.torre87@hotmail.com', 12563330858),
    ('tomado35@gmail.com',       27837882334),
    ('usb.83@aasdasdasd.com',     25616561282);
Comportamento esperado
●   SELECT cpf_valido(59328253241); -- true
●   SELECT 59328253241 #?; -- true
●   SELECT 91416000433 #?; -- false
●   SELECT NOT 37821042003 #?; -- true
●   SELECT email_valido('xpto@net'); -- false
●   SELECT email_valido('xpto@hotmail.com'); -- true
●   SELECT 'rotime@net' @? ; -- false
●   SELECT 'feice@book.net' @? ; -- true
pessoas                         usuarios


                   Validadores
email_valido()                        cpf_valido()



 PL/perl                PL/pgsql          SQL


                 PostgreSQL 9.1
Cara! Show me the code!
Os passos
●   Prepare o código fonte, os testes e a
    documentação
●   Crie o arquivo Makefile
●   Crie o arquivo de controle
●   Escreva testes
●   Escreva o código
●   Documente
Os passos
●   Prepare o código fonte, os testes e a
    documentação
●   Crie o arquivo Makefile
●   Crie o arquivo de controle
●   Escreva testes
●   Escreva o código
●   Documente
Makefile
EXTENSION    = validadores
EXTVERSION   = $(shell grep default_version $
(EXTENSION).control | sed -e
"s/default_version[[:space:]]*=[[:space:]]*'
([^']*)'/1/")

DATA         = $(filter-out $(wildcard sql/*--*.sql),$
(wildcard sql/*.sql))
DOCS         = $(wildcard doc/*.md)
TESTS        = $(wildcard test/sql/*.sql)
REGRESS      = $(patsubst test/sql/%.sql,%,$(TESTS))
REGRESS_OPTS = --inputdir=test --load-language=plpgsql
#Descomente esta linha caso tenha funções em C
#MODULES      = $(patsubst %.c,%,$(wildcard src/*.c))
PG_CONFIG    = pg_config
PG91         = $(shell $(PG_CONFIG) --version | grep -qE
" 8.| 9.0" && echo no || echo yes)
Makefile
ifeq ($(PG91),yes)
all: sql/$(EXTENSION)--$(EXTVERSION).sql

sql/$(EXTENSION)--$(EXTVERSION).sql: sql/$(EXTENSION).sql
   cp $< $@

DATA = $(wildcard sql/*--*.sql) sql/$(EXTENSION)--$
(EXTVERSION).sql
EXTRA_CLEAN = sql/$(EXTENSION)--$(EXTVERSION).sql
endif

PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)
Os passos
●   Prepare o código fonte, os testes e a
    documentação
●   Crie o arquivo Makefile
●   Crie o arquivo de controle
●   Escreva testes
●   Escreva o código
●   Documente
Controlfile: validadores.control
# validadores extension
comment = 'Extensao que contem validadores de CNPJ, CPF'
default_version = '0.0.1'
relocatable = true
Controlfile: validadores.control
# validadores extension
comment = 'Extensao que contem validadores de CNPJ, CPF'
default_version = '0.0.1'
relocatable = true




Learn more ...
http://www.postgresql.org/docs/current/static/extend-extensions.html#AEN51780
Os passos
●   Prepare o código fonte, os testes e a
    documentação
●   Crie o arquivo Makefile
●   Crie o arquivo de controle
●   Escreva testes
●   Escreva o código
●   Documente
Testes?
Em banco?
Os passos
●   Prepare o código fonte, os testes e a
    documentação
●   Crie o arquivo Makefile
●   Crie o arquivo de controle
●   Escreva testes
●   Escreva o código
●   Documente
Os passos
●   Prepare o código fonte, os testes e a
    documentação
●   Crie o arquivo Makefile
●   Crie o arquivo de controle
●   Escreva testes
●   Escreva o código
●   Documente
Gostei! Quero compartilhar!
Como faço?
PGXN!
PGXN

Um índice central de extensões do
          PostgreSQL
                 +
         Documentação
                 +
            Pesquisa
                 +
         Fácil instalação
Obrigado

David E. Wheeler!
     (@theory)
DEMO
PGXN Client


sudo apt­get install python­pip
pip install pgxnclient
pgxn –help

Ex. pgxn install resetsequence
Obrigado

Daniele Varrazzo!
     (@dvarrazzo)
DEMO
PGXN Utils


gem install pgxn_utils
pgxn_utils help
 
Ex. pgxn_utils skeleton teste
DEMO
Então...
Use extensões ao invés
 de scripts que criam
    objetos órfãos
O PostgreSQL vai saber
 que os objetos fazem
parte de um pacote e...
… poderá removê-los
  com um simples:
DROP EXTENSION … ;
pg_dump não vai fazer o
   dump de todos os
  objetos da extensão
O PostgreSQL não vai
 deixar você remover
  objetos individuais
Scripts de modificação
para upgrade de versão
    extensao--1.0.0--1.0.1.sql

  ALTER EXTENSION extensao
        UPDATE TO '1.0.1';
?
Referências
●   WEB
    ●   http://pgxn.org
    ●   http://blog.pgxn.org
    ●   http://www.postgresql.org.br
    ●   http://www.postgresql.org
●   IRC
    ●   irc.freenode.net
        –   Guedes @ #postgresql, #postgresql-br
●   Gtalk
    ●   guedes@guedesoft.net
●   Twitter
    ●   @pgxn
    ●   @guediz
    ●   @pgcasts
Dividindo o Elefante em Problemas Menores

Mais conteúdo relacionado

Mais procurados

Curso de PostgreSQL: Um pouco Além dos Comandos
Curso de PostgreSQL: Um pouco Além dos ComandosCurso de PostgreSQL: Um pouco Além dos Comandos
Curso de PostgreSQL: Um pouco Além dos ComandosMarcos Thomaz
 
T12_LM3: Arrays (2013-2014)
T12_LM3: Arrays (2013-2014)T12_LM3: Arrays (2013-2014)
T12_LM3: Arrays (2013-2014)Carlos Santos
 
Jpa – Java Persistence Api
Jpa – Java Persistence ApiJpa – Java Persistence Api
Jpa – Java Persistence Apiguestf54162
 
Apostila ph pwamp_parte5
Apostila ph pwamp_parte5Apostila ph pwamp_parte5
Apostila ph pwamp_parte5Ilton Barbosa
 

Mais procurados (7)

Aula android 02.pdf
Aula android 02.pdfAula android 02.pdf
Aula android 02.pdf
 
Curso de PostgreSQL: Um pouco Além dos Comandos
Curso de PostgreSQL: Um pouco Além dos ComandosCurso de PostgreSQL: Um pouco Além dos Comandos
Curso de PostgreSQL: Um pouco Além dos Comandos
 
T12_LM3: Arrays (2013-2014)
T12_LM3: Arrays (2013-2014)T12_LM3: Arrays (2013-2014)
T12_LM3: Arrays (2013-2014)
 
Jpa – Java Persistence Api
Jpa – Java Persistence ApiJpa – Java Persistence Api
Jpa – Java Persistence Api
 
Apostila ph pwamp_parte5
Apostila ph pwamp_parte5Apostila ph pwamp_parte5
Apostila ph pwamp_parte5
 
Ecommerce, mais simples do que parece
Ecommerce, mais simples do que pareceEcommerce, mais simples do que parece
Ecommerce, mais simples do que parece
 
Python e bancos NoSQL
Python e bancos NoSQLPython e bancos NoSQL
Python e bancos NoSQL
 

Destaque

Se eu fosse a Microsoft
Se eu fosse a MicrosoftSe eu fosse a Microsoft
Se eu fosse a MicrosoftCesar Brod
 
Como encontrar uma agulha num palheiro de logs
Como encontrar uma agulha num palheiro de logsComo encontrar uma agulha num palheiro de logs
Como encontrar uma agulha num palheiro de logsDickson S. Guedes
 
Overview Sobre Varnish
Overview Sobre VarnishOverview Sobre Varnish
Overview Sobre VarnishLocaweb
 
Isolamento e mvcc
Isolamento e mvccIsolamento e mvcc
Isolamento e mvccLocaweb
 
Dojo PHP (treinanto programação orientada a objetos em PHP)
Dojo PHP (treinanto programação orientada a objetos em PHP)Dojo PHP (treinanto programação orientada a objetos em PHP)
Dojo PHP (treinanto programação orientada a objetos em PHP)Fabrízio Mello
 
Ambient Light Events- Wylkon Queiroz
Ambient Light Events- Wylkon QueirozAmbient Light Events- Wylkon Queiroz
Ambient Light Events- Wylkon QueirozLocaweb
 
Celery for SysAdmins
Celery for SysAdminsCelery for SysAdmins
Celery for SysAdminsLocaweb
 
Postgres Wonderland - Campus Party 2013
Postgres Wonderland - Campus Party 2013Postgres Wonderland - Campus Party 2013
Postgres Wonderland - Campus Party 2013Fabio Telles Rodriguez
 
Comercio eletronico - Dicas práticas
Comercio eletronico - Dicas práticasComercio eletronico - Dicas práticas
Comercio eletronico - Dicas práticasLocaweb
 
Soluções para sua empresa vender na Internet
Soluções para sua empresa vender na InternetSoluções para sua empresa vender na Internet
Soluções para sua empresa vender na InternetLocaweb
 
API Do Email Marketing Locaweb
API Do Email Marketing LocawebAPI Do Email Marketing Locaweb
API Do Email Marketing LocawebLocaweb
 
Princípios de Concorrência em Ruby e Além
Princípios de Concorrência em Ruby e AlémPrincípios de Concorrência em Ruby e Além
Princípios de Concorrência em Ruby e AlémLocaweb
 
Tech talkrubocop
Tech talkrubocopTech talkrubocop
Tech talkrubocopLocaweb
 
Sistemas Distribuidos
Sistemas DistribuidosSistemas Distribuidos
Sistemas DistribuidosLocaweb
 

Destaque (20)

Se eu fosse a Microsoft
Se eu fosse a MicrosoftSe eu fosse a Microsoft
Se eu fosse a Microsoft
 
Como encontrar uma agulha num palheiro de logs
Como encontrar uma agulha num palheiro de logsComo encontrar uma agulha num palheiro de logs
Como encontrar uma agulha num palheiro de logs
 
Overview Sobre Varnish
Overview Sobre VarnishOverview Sobre Varnish
Overview Sobre Varnish
 
Freenas
FreenasFreenas
Freenas
 
Isolamento e mvcc
Isolamento e mvccIsolamento e mvcc
Isolamento e mvcc
 
Dojo PHP (treinanto programação orientada a objetos em PHP)
Dojo PHP (treinanto programação orientada a objetos em PHP)Dojo PHP (treinanto programação orientada a objetos em PHP)
Dojo PHP (treinanto programação orientada a objetos em PHP)
 
Revisão do postgresql.conf
Revisão do postgresql.confRevisão do postgresql.conf
Revisão do postgresql.conf
 
Trabalhando com Logs no PostgreSQL
Trabalhando com Logs no PostgreSQLTrabalhando com Logs no PostgreSQL
Trabalhando com Logs no PostgreSQL
 
Ambient Light Events- Wylkon Queiroz
Ambient Light Events- Wylkon QueirozAmbient Light Events- Wylkon Queiroz
Ambient Light Events- Wylkon Queiroz
 
Celery for SysAdmins
Celery for SysAdminsCelery for SysAdmins
Celery for SysAdmins
 
Storage em Oracle RAC
Storage em Oracle RACStorage em Oracle RAC
Storage em Oracle RAC
 
Postgres Wonderland - Campus Party 2013
Postgres Wonderland - Campus Party 2013Postgres Wonderland - Campus Party 2013
Postgres Wonderland - Campus Party 2013
 
Comercio eletronico - Dicas práticas
Comercio eletronico - Dicas práticasComercio eletronico - Dicas práticas
Comercio eletronico - Dicas práticas
 
Soluções para sua empresa vender na Internet
Soluções para sua empresa vender na InternetSoluções para sua empresa vender na Internet
Soluções para sua empresa vender na Internet
 
Postgres Wonderland - PGDay CE2013
Postgres  Wonderland - PGDay CE2013Postgres  Wonderland - PGDay CE2013
Postgres Wonderland - PGDay CE2013
 
Postgres Big data
Postgres Big dataPostgres Big data
Postgres Big data
 
API Do Email Marketing Locaweb
API Do Email Marketing LocawebAPI Do Email Marketing Locaweb
API Do Email Marketing Locaweb
 
Princípios de Concorrência em Ruby e Além
Princípios de Concorrência em Ruby e AlémPrincípios de Concorrência em Ruby e Além
Princípios de Concorrência em Ruby e Além
 
Tech talkrubocop
Tech talkrubocopTech talkrubocop
Tech talkrubocop
 
Sistemas Distribuidos
Sistemas DistribuidosSistemas Distribuidos
Sistemas Distribuidos
 

Semelhante a Dividindo o Elefante em Problemas Menores

Minicurso PostgreSQl
Minicurso PostgreSQlMinicurso PostgreSQl
Minicurso PostgreSQlCezar Souza
 
Postgresql como NewSQL - DevCamp 2014
Postgresql como NewSQL - DevCamp 2014Postgresql como NewSQL - DevCamp 2014
Postgresql como NewSQL - DevCamp 2014Matheus de Oliveira
 
Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012Fabrízio Mello
 
364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf
364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf
364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdfQuitriaSilva550
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmGuilherme Blanco
 
Mini-Curso de MongoDB
Mini-Curso de MongoDBMini-Curso de MongoDB
Mini-Curso de MongoDBBrunno Gomes
 
PostgreSQL-Prático.pdf
PostgreSQL-Prático.pdfPostgreSQL-Prático.pdf
PostgreSQL-Prático.pdfArleiEvaristo
 
Oracle 11g - Fundamentos
Oracle 11g - FundamentosOracle 11g - Fundamentos
Oracle 11g - FundamentosGustavo Sávio
 
Exemplo e caso prático do uso de base de dados
Exemplo e caso prático do uso de base de dadosExemplo e caso prático do uso de base de dados
Exemplo e caso prático do uso de base de dadosLuis Borges Gouveia
 
MongoDB: um banco de dados orientado a documento
MongoDB: um banco de dados orientado a documentoMongoDB: um banco de dados orientado a documento
MongoDB: um banco de dados orientado a documentoJulio Monteiro
 
Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011Luís Cobucci
 
Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Christiano Anderson
 
pgBouncer: um aglomerador de conexões para PostgreSQL
pgBouncer: um aglomerador de conexões para PostgreSQLpgBouncer: um aglomerador de conexões para PostgreSQL
pgBouncer: um aglomerador de conexões para PostgreSQLelliando dias
 
Oracle para PostgreSQL: Conseguir migrar e não parar UTI
Oracle para PostgreSQL: Conseguir migrar e não parar UTIOracle para PostgreSQL: Conseguir migrar e não parar UTI
Oracle para PostgreSQL: Conseguir migrar e não parar UTIFernando Ike
 
Migração de Oracle para PostgreSQL - FISL
Migração de Oracle para PostgreSQL - FISLMigração de Oracle para PostgreSQL - FISL
Migração de Oracle para PostgreSQL - FISLFabio Telles Rodriguez
 
UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6
UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6
UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6Wagner Bianchi
 
Fluentd/LogStash + elastic search + kibana
Fluentd/LogStash + elastic search + kibanaFluentd/LogStash + elastic search + kibana
Fluentd/LogStash + elastic search + kibanaCésar Araújo
 
Três anos de Scala no NewsMonitor
Três anos de Scala no NewsMonitorTrês anos de Scala no NewsMonitor
Três anos de Scala no NewsMonitorFelipe Hummel
 

Semelhante a Dividindo o Elefante em Problemas Menores (20)

Minicurso PostgreSQl
Minicurso PostgreSQlMinicurso PostgreSQl
Minicurso PostgreSQl
 
Postgresql como NewSQL - DevCamp 2014
Postgresql como NewSQL - DevCamp 2014Postgresql como NewSQL - DevCamp 2014
Postgresql como NewSQL - DevCamp 2014
 
Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012
 
364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf
364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf
364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf
 
Palestra cbq
Palestra cbqPalestra cbq
Palestra cbq
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
 
Mini-Curso de MongoDB
Mini-Curso de MongoDBMini-Curso de MongoDB
Mini-Curso de MongoDB
 
PostgreSQL-Prático.pdf
PostgreSQL-Prático.pdfPostgreSQL-Prático.pdf
PostgreSQL-Prático.pdf
 
Mongodb workshop cinlug
Mongodb workshop cinlugMongodb workshop cinlug
Mongodb workshop cinlug
 
Oracle 11g - Fundamentos
Oracle 11g - FundamentosOracle 11g - Fundamentos
Oracle 11g - Fundamentos
 
Exemplo e caso prático do uso de base de dados
Exemplo e caso prático do uso de base de dadosExemplo e caso prático do uso de base de dados
Exemplo e caso prático do uso de base de dados
 
MongoDB: um banco de dados orientado a documento
MongoDB: um banco de dados orientado a documentoMongoDB: um banco de dados orientado a documento
MongoDB: um banco de dados orientado a documento
 
Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011
 
Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7
 
pgBouncer: um aglomerador de conexões para PostgreSQL
pgBouncer: um aglomerador de conexões para PostgreSQLpgBouncer: um aglomerador de conexões para PostgreSQL
pgBouncer: um aglomerador de conexões para PostgreSQL
 
Oracle para PostgreSQL: Conseguir migrar e não parar UTI
Oracle para PostgreSQL: Conseguir migrar e não parar UTIOracle para PostgreSQL: Conseguir migrar e não parar UTI
Oracle para PostgreSQL: Conseguir migrar e não parar UTI
 
Migração de Oracle para PostgreSQL - FISL
Migração de Oracle para PostgreSQL - FISLMigração de Oracle para PostgreSQL - FISL
Migração de Oracle para PostgreSQL - FISL
 
UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6
UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6
UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6
 
Fluentd/LogStash + elastic search + kibana
Fluentd/LogStash + elastic search + kibanaFluentd/LogStash + elastic search + kibana
Fluentd/LogStash + elastic search + kibana
 
Três anos de Scala no NewsMonitor
Três anos de Scala no NewsMonitorTrês anos de Scala no NewsMonitor
Três anos de Scala no NewsMonitor
 

Mais de Dickson S. Guedes

Ganhando tempo automatizando com SQL
Ganhando tempo automatizando com SQLGanhando tempo automatizando com SQL
Ganhando tempo automatizando com SQLDickson S. Guedes
 
O mínimo necessário que você precisa conhecer sobre computação quântica
O mínimo necessário que você precisa conhecer sobre computação quânticaO mínimo necessário que você precisa conhecer sobre computação quântica
O mínimo necessário que você precisa conhecer sobre computação quânticaDickson S. Guedes
 
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhorPorque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhorDickson S. Guedes
 
Pattern matching - O que é? Onde vive? Do que se alimenta? Como se reproduz?
Pattern matching - O que é? Onde vive? Do que se alimenta? Como se reproduz?Pattern matching - O que é? Onde vive? Do que se alimenta? Como se reproduz?
Pattern matching - O que é? Onde vive? Do que se alimenta? Como se reproduz?Dickson S. Guedes
 
Primeiros passos machine learning PostgreSQL
Primeiros passos machine learning PostgreSQLPrimeiros passos machine learning PostgreSQL
Primeiros passos machine learning PostgreSQLDickson S. Guedes
 
Dicas de sobrevivência de um DBA sem mouse
Dicas de sobrevivência de um DBA sem mouseDicas de sobrevivência de um DBA sem mouse
Dicas de sobrevivência de um DBA sem mouseDickson S. Guedes
 
Curiosidades que você (talvez) não sabia e se sabia vale a pena lembrar
Curiosidades que você (talvez) não sabia e se sabia vale a pena lembrarCuriosidades que você (talvez) não sabia e se sabia vale a pena lembrar
Curiosidades que você (talvez) não sabia e se sabia vale a pena lembrarDickson S. Guedes
 
Como encontrar uma agulha no palheiro de logs do PostgreSQL
Como encontrar uma agulha no palheiro de logs do PostgreSQLComo encontrar uma agulha no palheiro de logs do PostgreSQL
Como encontrar uma agulha no palheiro de logs do PostgreSQLDickson S. Guedes
 
Gerenciando múltiplas versões do PostgreSQL com pgvm
Gerenciando múltiplas versões do PostgreSQL com pgvmGerenciando múltiplas versões do PostgreSQL com pgvm
Gerenciando múltiplas versões do PostgreSQL com pgvmDickson S. Guedes
 
PGXN - Como distribuir suas extensões com o PostgreSQL
PGXN - Como distribuir suas extensões com o PostgreSQLPGXN - Como distribuir suas extensões com o PostgreSQL
PGXN - Como distribuir suas extensões com o PostgreSQLDickson S. Guedes
 
Plante uma árvore, escreva um livro, tenha um filho e contribua com software ...
Plante uma árvore, escreva um livro, tenha um filho e contribua com software ...Plante uma árvore, escreva um livro, tenha um filho e contribua com software ...
Plante uma árvore, escreva um livro, tenha um filho e contribua com software ...Dickson S. Guedes
 
Conhecendo Postgresql.- ENECOMP 2009
Conhecendo Postgresql.- ENECOMP 2009Conhecendo Postgresql.- ENECOMP 2009
Conhecendo Postgresql.- ENECOMP 2009Dickson S. Guedes
 
Minicurso Postgresql - Enecomp 2009
Minicurso Postgresql - Enecomp 2009Minicurso Postgresql - Enecomp 2009
Minicurso Postgresql - Enecomp 2009Dickson S. Guedes
 
Testes unitarios no PostgreSQL com pgTAP
Testes unitarios no PostgreSQL com pgTAPTestes unitarios no PostgreSQL com pgTAP
Testes unitarios no PostgreSQL com pgTAPDickson S. Guedes
 
pgScript: um Elefante de barriga cheia
pgScript: um Elefante de barriga cheiapgScript: um Elefante de barriga cheia
pgScript: um Elefante de barriga cheiaDickson S. Guedes
 

Mais de Dickson S. Guedes (20)

Ganhando tempo automatizando com SQL
Ganhando tempo automatizando com SQLGanhando tempo automatizando com SQL
Ganhando tempo automatizando com SQL
 
O mínimo necessário que você precisa conhecer sobre computação quântica
O mínimo necessário que você precisa conhecer sobre computação quânticaO mínimo necessário que você precisa conhecer sobre computação quântica
O mínimo necessário que você precisa conhecer sobre computação quântica
 
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhorPorque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
 
Pattern matching - O que é? Onde vive? Do que se alimenta? Como se reproduz?
Pattern matching - O que é? Onde vive? Do que se alimenta? Como se reproduz?Pattern matching - O que é? Onde vive? Do que se alimenta? Como se reproduz?
Pattern matching - O que é? Onde vive? Do que se alimenta? Como se reproduz?
 
Primeiros passos machine learning PostgreSQL
Primeiros passos machine learning PostgreSQLPrimeiros passos machine learning PostgreSQL
Primeiros passos machine learning PostgreSQL
 
Dicas de sobrevivência de um DBA sem mouse
Dicas de sobrevivência de um DBA sem mouseDicas de sobrevivência de um DBA sem mouse
Dicas de sobrevivência de um DBA sem mouse
 
Destistificando o EXPLAIN
Destistificando o EXPLAIN Destistificando o EXPLAIN
Destistificando o EXPLAIN
 
Falando "Postgrês"
Falando "Postgrês"Falando "Postgrês"
Falando "Postgrês"
 
Se meu elefante falasse
Se meu elefante falasseSe meu elefante falasse
Se meu elefante falasse
 
Curiosidades que você (talvez) não sabia e se sabia vale a pena lembrar
Curiosidades que você (talvez) não sabia e se sabia vale a pena lembrarCuriosidades que você (talvez) não sabia e se sabia vale a pena lembrar
Curiosidades que você (talvez) não sabia e se sabia vale a pena lembrar
 
O Elefante Poliglota
O Elefante PoliglotaO Elefante Poliglota
O Elefante Poliglota
 
Como encontrar uma agulha no palheiro de logs do PostgreSQL
Como encontrar uma agulha no palheiro de logs do PostgreSQLComo encontrar uma agulha no palheiro de logs do PostgreSQL
Como encontrar uma agulha no palheiro de logs do PostgreSQL
 
Gerenciando múltiplas versões do PostgreSQL com pgvm
Gerenciando múltiplas versões do PostgreSQL com pgvmGerenciando múltiplas versões do PostgreSQL com pgvm
Gerenciando múltiplas versões do PostgreSQL com pgvm
 
PGXN - Como distribuir suas extensões com o PostgreSQL
PGXN - Como distribuir suas extensões com o PostgreSQLPGXN - Como distribuir suas extensões com o PostgreSQL
PGXN - Como distribuir suas extensões com o PostgreSQL
 
Pgxn.pgday
Pgxn.pgdayPgxn.pgday
Pgxn.pgday
 
Plante uma árvore, escreva um livro, tenha um filho e contribua com software ...
Plante uma árvore, escreva um livro, tenha um filho e contribua com software ...Plante uma árvore, escreva um livro, tenha um filho e contribua com software ...
Plante uma árvore, escreva um livro, tenha um filho e contribua com software ...
 
Conhecendo Postgresql.- ENECOMP 2009
Conhecendo Postgresql.- ENECOMP 2009Conhecendo Postgresql.- ENECOMP 2009
Conhecendo Postgresql.- ENECOMP 2009
 
Minicurso Postgresql - Enecomp 2009
Minicurso Postgresql - Enecomp 2009Minicurso Postgresql - Enecomp 2009
Minicurso Postgresql - Enecomp 2009
 
Testes unitarios no PostgreSQL com pgTAP
Testes unitarios no PostgreSQL com pgTAPTestes unitarios no PostgreSQL com pgTAP
Testes unitarios no PostgreSQL com pgTAP
 
pgScript: um Elefante de barriga cheia
pgScript: um Elefante de barriga cheiapgScript: um Elefante de barriga cheia
pgScript: um Elefante de barriga cheia
 

Dividindo o Elefante em Problemas Menores

  • 1. Estripando o Elefante Como estender o PostgreSQL... … estripando sua aplicação e dividindo um problemão em problemas menores utilizando extensões? por Dickson S. Guedes (@guediz) PGBR 2011, 4 de Novembro
  • 2. Estripando o Elefante Como estender o PostgreSQL... … estripando sua aplicação e dividindo um problemão em problemas menores utilizando extensões? por Dickson S. Guedes (@guediz) PGBR 2011, 4 de Novembro
  • 4. ESTA PALESTRA POSSUI CONTEÚDO QUE PODE QUEBRAR CERTOS PARADÍGMAS SEUS
  • 5. “Quando você faz as coisas sempre do mesmo jeito, obterá sempre os mesmos resultados” – Alguém
  • 6. No começo haviam vários bancos espalhados com várias funções...
  • 7. PostgreSQL 9.0 + PL/Perl + Funções definidas pelo usuário
  • 8. … e então perdeu-se o controle.
  • 9. … e então perdeu-se o controle. Gerenciamento manual Não havia controle de versão Falta de abstração, e modularidade Sem reutilização de código
  • 12. Primeiramente entendendo o problema... Pensando fora da caixa!
  • 13. pessoas usuarios email_valido() cpf_valido() PL/perl PL/pgsql SQL PostgreSQL 9.1
  • 14. As aplicações precisavam ser modularizadas...
  • 15. As aplicações precisavam ser modularizadas... … e o banco precisava ser atualizado
  • 16. As aplicações precisavam ser modularizadas... … e o banco precisava ser atualizado
  • 17. Até então não tinhamos.... ● Versionamento de funções no banco ● Gerenciamento de contribs ● saber facilmente quais contribs estão instaladas, por exemplo ● Modularidade ● Reaproveitamento de código ● Contribuições para comunidade ● ...
  • 18. Até então não tinhamos.... ● Versionamento de funções no banco ● Gerenciamento de contribs ● saber facilmente quais contribs estão instaladas, por exemplo ● Modularidade ● Reaproveitamento de código ● Contribuições para comunidade ● ... SIM! Eu consigo dividir para conquistar!
  • 19. Tá! E como o PostgreSQL pode ajudar?
  • 22. Porque o PostgreSQL é divertidamente estendível !
  • 23. Por que o PostgreSQL é divertidamente estendível ?
  • 24. Por que o PostgreSQL é divertidamente estendível ? É guiado por catálogo!
  • 25. Catálogo do sistema Metadados Dicionário de dados
  • 26. Catálogo do sistema Metadados Dicionário de dados Diferença para outros SGDBS?
  • 27. Tabelas Colunas Tipos de dados Funções Domínios Métodos de acesso ...
  • 28. Tabelas Colunas Tipos de dados Funções Domínios Métodos de acesso ...
  • 29. PostgreSQL não é apenas um Sistema Gerenciador de Banco de Dados ...
  • 30. … ele é uma Plataforma de Desenvolvimento de Aplicações
  • 31. Você desenvolve bibliotecas de extensões reutilizáveis …
  • 32. … e as combina para criar aplicações!
  • 34. Banco PostgreSQL 9.0 Varias tabelas Várias funções em varias linguagens Código sem testes Pouco versionamento das funcoes O dump possui o codigo das funcoes Gerenciamento atraves de esquemas
  • 35. Cadastro de pessoas CREATE TABLE pessoas ( nro_cpf cpf PRIMARY KEY, nome text NOT NULL, data_nascimento date );
  • 36. Cadastro de pessoas CREATE TABLE pessoas ( nro_cpf cpf PRIMARY KEY, nome text NOT NULL, data_nascimento date );
  • 37. Cadastro de pessoas INSERT INTO pessoas(nro_cpf, nome, data_nascimento) VALUES (88274557875, 'Adaloso Cachimbinho Lustrado', '1981-04-22'), (96672786465, 'Enelildo Protolino Calado' , '1983-02-13'), (88856899302, 'Feicebuque Ailaique' , '1976-07-06'), (12563330858, 'Torrecilda Tapelia' , '1987-11-16'), (27837882334, 'Almofafio Vasildo Tomado' , '1965-01-08'), (25616561282, 'Uessebelson Blutuf' , '1983-05-11');
  • 38. Cadastro de pessoas INSERT INTO pessoas(nro_cpf, nome, data_nascimento) VALUES (88274557875, 'Adaloso Cachimbinho Lustrado', '1981-04-22'), (96672786465, 'Enelildo Protolino Calado' , '1983-02-13'), (88856899302, 'Feicebuque Ailaique' , '1976-07-06'), (12563330858, 'Torrecilda Tapelia' , '1987-11-16'), (27837882334, 'Almofafio Vasildo Tomado' , '1965-01-08'), (25616561282, 'Uessebelson Blutuf' , '1983-05-11');
  • 39. Cadastro de pessoas INSERT INTO pessoas(nro_cpf, nome, data_nascimento) VALUES (88274557875, 'Adaloso Cachimbinho Lustrado', '1981-04-22'), (96672786465, 'Enelildo Protolino Calado' , '1983-02-13'), (88856899302, 'Feicebuque Ailaique' , '1976-07-06'), (12563330858, 'Torrecilda Tapelia' , '1987-11-16'), (27837882334, 'Almofafio Vasildo Tomado' , '1965-01-08'), (25616561282, 'Uessebelson Blutuf' , '1983-05-11'); Mas... INSERT INTO pessoas(nro_cpf, nome, data_nascimento) VALUES (12312312300, 'Ester Lionata Rio', '1981-04-22')
  • 40. Cadastro de pessoas INSERT INTO pessoas(nro_cpf, nome, data_nascimento) VALUES (88274557875, 'Adaloso Cachimbinho Lustrado', '1981-04-22'), (96672786465, 'Enelildo Protolino Calado' , '1983-02-13'), (88856899302, 'Feicebuque Ailaique' , '1976-07-06'), (12563330858, 'Torrecilda Tapelia' , '1987-11-16'), (27837882334, 'Almofafio Vasildo Tomado' , '1965-01-08'), (25616561282, 'Uessebelson Blutuf' , '1983-05-11'); Mas... INSERT INTO pessoas(nro_cpf, nome, data_nascimento) VALUES VIOLATION! (12312312300, 'Ester Lionata Rio', '1981-04-22')
  • 41. Cadastro de usuarios CREATE TABLE usuarios ( login email PRIMARY KEY, nro_cpf cpf REFERENCES pessoas(nro_cpf) );
  • 42. Cadastro de usuarios CREATE TABLE usuarios ( login email PRIMARY KEY, nro_cpf cpf REFERENCES pessoas(nro_cpf) );
  • 43. Um operador especial CREATE OPERATOR #? ( LEFTARG = numeric, PROCEDURE = cpf_valido );
  • 44. Um operador especial CREATE OPERATOR #? ( LEFTARG = numeric, PROCEDURE = cpf_valido );
  • 45. Um operador especial CREATE OPERATOR @? ( LEFTARG = citext, PROCEDURE = email_valido );
  • 46. Um operador especial CREATE OPERATOR @? ( LEFTARG = citext, PROCEDURE = email_valido );
  • 47. Cadastro de usuarios INSERT INTO usuarios (login, nro_cpf) VALUES ('adaloso@cahimbinho.net', 88856899302), ('enelildo@calado.com', 96672786465), ('feicebuque.ailaique@facebook.com', 88856899302), ('tata.torre87@hotmail.com', 12563330858), ('tomado35@gmail.com', 27837882334), ('usb.83@aasdasdasd.com', 25616561282);
  • 48. Cadastro de usuarios INSERT INTO usuarios (login, nro_cpf) VALUES ('adaloso@cahimbinho.net', 88856899302), ('enelildo@calado.com', 96672786465), ('feicebuque.ailaique@facebook.com', 88856899302), ('tata.torre87@hotmail.com', 12563330858), ('tomado35@gmail.com', 27837882334), ('usb.83@aasdasdasd.com', 25616561282);
  • 49. Comportamento esperado ● SELECT cpf_valido(59328253241); -- true ● SELECT 59328253241 #?; -- true ● SELECT 91416000433 #?; -- false ● SELECT NOT 37821042003 #?; -- true ● SELECT email_valido('xpto@net'); -- false ● SELECT email_valido('xpto@hotmail.com'); -- true ● SELECT 'rotime@net' @? ; -- false ● SELECT 'feice@book.net' @? ; -- true
  • 50. pessoas usuarios Validadores email_valido() cpf_valido() PL/perl PL/pgsql SQL PostgreSQL 9.1
  • 51. Cara! Show me the code!
  • 52. Os passos ● Prepare o código fonte, os testes e a documentação ● Crie o arquivo Makefile ● Crie o arquivo de controle ● Escreva testes ● Escreva o código ● Documente
  • 53. Os passos ● Prepare o código fonte, os testes e a documentação ● Crie o arquivo Makefile ● Crie o arquivo de controle ● Escreva testes ● Escreva o código ● Documente
  • 54. Makefile EXTENSION = validadores EXTVERSION = $(shell grep default_version $ (EXTENSION).control | sed -e "s/default_version[[:space:]]*=[[:space:]]*' ([^']*)'/1/") DATA = $(filter-out $(wildcard sql/*--*.sql),$ (wildcard sql/*.sql)) DOCS = $(wildcard doc/*.md) TESTS = $(wildcard test/sql/*.sql) REGRESS = $(patsubst test/sql/%.sql,%,$(TESTS)) REGRESS_OPTS = --inputdir=test --load-language=plpgsql #Descomente esta linha caso tenha funções em C #MODULES = $(patsubst %.c,%,$(wildcard src/*.c)) PG_CONFIG = pg_config PG91 = $(shell $(PG_CONFIG) --version | grep -qE " 8.| 9.0" && echo no || echo yes)
  • 55. Makefile ifeq ($(PG91),yes) all: sql/$(EXTENSION)--$(EXTVERSION).sql sql/$(EXTENSION)--$(EXTVERSION).sql: sql/$(EXTENSION).sql cp $< $@ DATA = $(wildcard sql/*--*.sql) sql/$(EXTENSION)--$ (EXTVERSION).sql EXTRA_CLEAN = sql/$(EXTENSION)--$(EXTVERSION).sql endif PGXS := $(shell $(PG_CONFIG) --pgxs) include $(PGXS)
  • 56. Os passos ● Prepare o código fonte, os testes e a documentação ● Crie o arquivo Makefile ● Crie o arquivo de controle ● Escreva testes ● Escreva o código ● Documente
  • 57. Controlfile: validadores.control # validadores extension comment = 'Extensao que contem validadores de CNPJ, CPF' default_version = '0.0.1' relocatable = true
  • 58. Controlfile: validadores.control # validadores extension comment = 'Extensao que contem validadores de CNPJ, CPF' default_version = '0.0.1' relocatable = true Learn more ... http://www.postgresql.org/docs/current/static/extend-extensions.html#AEN51780
  • 59. Os passos ● Prepare o código fonte, os testes e a documentação ● Crie o arquivo Makefile ● Crie o arquivo de controle ● Escreva testes ● Escreva o código ● Documente
  • 62. Os passos ● Prepare o código fonte, os testes e a documentação ● Crie o arquivo Makefile ● Crie o arquivo de controle ● Escreva testes ● Escreva o código ● Documente
  • 63. Os passos ● Prepare o código fonte, os testes e a documentação ● Crie o arquivo Makefile ● Crie o arquivo de controle ● Escreva testes ● Escreva o código ● Documente
  • 66. PGXN!
  • 67. PGXN Um índice central de extensões do PostgreSQL + Documentação + Pesquisa + Fácil instalação
  • 69. DEMO
  • 72. DEMO
  • 74. DEMO
  • 76. Use extensões ao invés de scripts que criam objetos órfãos
  • 77. O PostgreSQL vai saber que os objetos fazem parte de um pacote e...
  • 78. … poderá removê-los com um simples: DROP EXTENSION … ;
  • 79. pg_dump não vai fazer o dump de todos os objetos da extensão
  • 80. O PostgreSQL não vai deixar você remover objetos individuais
  • 81. Scripts de modificação para upgrade de versão extensao--1.0.0--1.0.1.sql ALTER EXTENSION extensao UPDATE TO '1.0.1';
  • 82. ?
  • 83. Referências ● WEB ● http://pgxn.org ● http://blog.pgxn.org ● http://www.postgresql.org.br ● http://www.postgresql.org ● IRC ● irc.freenode.net – Guedes @ #postgresql, #postgresql-br ● Gtalk ● guedes@guedesoft.net ● Twitter ● @pgxn ● @guediz ● @pgcasts