[pgbr-geral] Uso de tablespace

2015-04-15 Por tôpico Danilo Silva
Pessoal,

Com a exceção de organização, qual benefício em utilizar tablespace,
estando esta no mesmo disco?

[]s
Danilo
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] MFA em PostgreSQL

2015-04-15 Por tôpico Cleiton Luiz Domazak
Bom dia pessoal.

Alguém já implementou alguma solução de MFA com PostgreSQL em produção para
acesso de usuários?

E existe alguma solução que seja integrada com aplicativos mobile como
Authy?
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Diferença entre campos do tipo string

2015-04-15 Por tôpico Flavio Henrique Araque Gurgel

Existe diferença entre os campos do tipo varchar(n) e text?


Fisicamente, não há diferença.
Logicamente, o varchar tem a limitação no número de caracteres (n) mas é 
apenas uma verificação no momento em que se insere ou se altera o valor.



Qual seria a limitação de caracteres para estes tipos?


1 GiB, não caracteres, afinal alguns caracteres em algumas codificações 
são multi-byte.


[]s
Flavio Gurgel
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] MFA em PostgreSQL

2015-04-15 Por tôpico Cleiton Luiz Domazak
Em 15 de abril de 2015 09:29, Flavio Henrique Araque Gurgel 
fha...@gmail.com escreveu:


  Alguém já implementou alguma solução de MFA com PostgreSQL em produção
 para acesso de usuários?


 MFA pode ser uma infinidade de coisas.


 E existe alguma solução que seja integrada com aplicativos mobile como
 Authy?


 Você está falando de Multi Factor Authentication?

 Se sim, explique direito o que quer fazer.


Alguns engenheiros tem acesso aos dados de produção, e gostaria de aumentar
o nivel de segurança habilitando o Multi Factor Authentication pelo pgAdmin
ou PSQL.


 []s
 Flavio Gurgel
 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] Diferença entre campos do tipo string

2015-04-15 Por tôpico Danilo Silva
Pessoal,

Existe diferença entre os campos do tipo varchar(n) e text?

Qual seria a limitação de caracteres para estes tipos?

[]s
Danilo
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Diferença entre campos do tipo string

2015-04-15 Por tôpico Danilo Silva
Em 15 de abril de 2015 10:09, Flavio Henrique Araque Gurgel 
fha...@gmail.com escreveu:

 Existe diferença entre os campos do tipo varchar(n) e text?


 Fisicamente, não há diferença.
 Logicamente, o varchar tem a limitação no número de caracteres (n) mas é
 apenas uma verificação no momento em que se insere ou se altera o valor.

  Qual seria a limitação de caracteres para estes tipos?


 1 GiB, não caracteres, afinal alguns caracteres em algumas codificações
 são multi-byte.

 Sempre tive essa dúvida, pois até então pensava que o varchar tivesse uma
limitação de 255 caracteres, por isso seguia uma regra minha: se o tamanho
é fixo e menor que 255 caracteres uso char, se o tamanho for variável de
até 255 utilizo varchar, fora isso uso text.

Mas por sua resposta estava errado, pois não tem diferenças entre varchar e
text, apenas limitação de espaço a ser armazenado.

Obrigado.

[]s
Danilo​
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Uso de tablespace

2015-04-15 Por tôpico Flavio Henrique Araque Gurgel



Com a exceção de organização, qual benefício em utilizar tablespace,
estando esta no mesmo disco?


Nenhum.

Por acaso você está fazendo alguma prova on-line e obtendo resposta na 
lista? (curiosidade apenas aqui)


[]s
Flavio Gurgel
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] MFA em PostgreSQL

2015-04-15 Por tôpico Flavio Henrique Araque Gurgel



Alguém já implementou alguma solução de MFA com PostgreSQL em produção
para acesso de usuários?


MFA pode ser uma infinidade de coisas.



E existe alguma solução que seja integrada com aplicativos mobile como
Authy?


Você está falando de Multi Factor Authentication?

Se sim, explique direito o que quer fazer.

[]s
Flavio Gurgel
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Uso de tablespace

2015-04-15 Por tôpico Danilo Silva
Em 15 de abril de 2015 10:10, Flavio Henrique Araque Gurgel 
fha...@gmail.com escreveu:


  Com a exceção de organização, qual benefício em utilizar tablespace,
 estando esta no mesmo disco?


 Nenhum.

 Por acaso você está fazendo alguma prova on-line e obtendo resposta na
 lista? (curiosidade apenas aqui)

 ​Não, apenas uma dúvida que tinha, pois terei que migrar algumas bases e
levantaram a questão de usar tablespace, mas até então disponibilizaram
apenas um disco para o postgres.

Obrigado.

[]s
Danilo​
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] SELECT FOR UPDATE tentando obter lock

2015-04-15 Por tôpico Rosana de Oliveira
Em 15 de abril de 2015 13:27, Marcos Thomaz marcosthom...@gmail.com
escreveu:


 Em 15 de abril de 2015 11:16, Rosana de Oliveira rosana.pi...@gmail.com
 escreveu:


 Boa tarde a todos.

 Gostaria de que me auxiliassem a resolver uma dúvida sobre o que está
 ocorrendo na situação de controle de concorrência abaixo.

 Não me lembro de ter visto esse caso nas literaturas de Banco de Dados.

 Fizemos testes nas versões 9.3.5 e 9.4 do Postgresql.

 O cenário consistem de duas transações sendo executadas concorrentemente
 no Postgresql.
 A transação TA faz inserção em uma tabela animal.
 A transação TB faz update na tabela pessoa, em um campo que não tem nada
 a ver com a chave estrangeira à tabela animal.
 O que acontece é que o update da  transação TB é executado normalmente.
 Porém, se executarmos um SELECT FOR UPDATE, o Postgresql não aceita e dá
 mensagem de erro, não conseguindo obter o lock.



 PERGUNTA-SE:

 1. Qual a explicação literária e do Postgresql para esta tentativa mal
 sucedida de obter o lock?

 1.1 Quem 'lockou' o quê?

 2. Só de curiosidade, fizemos o mesmo teste no Oracle e não ocorreu erro
 algum.
E agora?
Quem poderá nos defender??   rss



 Segue abaixo o script ...





 --1.a tabela
 create table pessoa(
 codp integer primary key,
 nome varchar(10)
 );

 --2.a tabela
 create table animal(
 coda integer primary key,
 raca varchar(10),
 codp integer references pessoa(codp)
 );


 -- inserção de dados
 insert into pessoa values (1, 'rosa');
 insert into pessoa values (2, 'maria');
 insert into pessoa values (3, 'josé');



  -- transacao - TA

 begin;
 insert into animal values (108, 'viralata', 1);

 select * from animal;
 select * from pessoa;



 --transacao  -TB

 begin;
 update pessoa set nome = 'rosana' where nome = 'rosa'; -- executado
 com sucesso

 update pessoa set nome = 'rosa de' where codp=1;  -- executado com
 sucesso

 select nome from pessoa  for update nowait;   -- erro!


 ** Error **

 ERROR: could not obtain lock on row in relation pessoa
 SQL state: 55P03


 Atenciosamente,

 --
 Rosana de Oliveira Santos

 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


 Correndo o risco de estar falando besteira, e sem nenhuma comprovação
 literária, mas quando você dá um update dentro da transação, o registro não
 ficaria bloqueado?
 Digo isso porque se a ideia é bloquear até o final da alteração, o ideal
 seria o uso do select for update antes dos comandos de alteração,
 garantindo o bloqueio, que seria liberado após a conclusão da transação
 (commit/rollback). Se o update por si só já bloquear o registro, o select
 for update iria falhar (pois está sendo colocado depois), não seria isso?

 --


 Marcos Thomaz da Silva
 Analista de Tecnologia da Informação

 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral




O nível de isolamento do Postgresql é o read committed.
Não sei qual é o do Oracle. Esqueçam-no.  Uma resposta da literatura formal
(Date, Navathe, Silberchatz) para mim, seria suficiente.

Só para explicar, o cenário que coloquei foi totalmente didático.
As operações de update, seguido de SELECT for UPDATE não necessariamente
precisam estar em sequência. Não é isto que estou questionando.
E sim, porque o update funciona e o SELECT FOR UPDATE NÃO?


Grata,

-- 
Rosana de Oliveira Santos
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] SELECT FOR UPDATE tentando obter lock

2015-04-15 Por tôpico Rosana de Oliveira
Boa tarde a todos.

Gostaria de que me auxiliassem a resolver uma dúvida sobre o que está
ocorrendo na situação de controle de concorrência abaixo.

Não me lembro de ter visto esse caso nas literaturas de Banco de Dados.

Fizemos testes nas versões 9.3.5 e 9.4 do Postgresql.

O cenário consistem de duas transações sendo executadas concorrentemente no
Postgresql.
A transação TA faz inserção em uma tabela animal.
A transação TB faz update na tabela pessoa, em um campo que não tem nada a
ver com a chave estrangeira à tabela animal.
O que acontece é que o update da  transação TB é executado normalmente.
Porém, se executarmos um SELECT FOR UPDATE, o Postgresql não aceita e dá
mensagem de erro, não conseguindo obter o lock.



PERGUNTA-SE:

1. Qual a explicação literária e do Postgresql para esta tentativa mal
sucedida de obter o lock?

1.1 Quem 'lockou' o quê?

2. Só de curiosidade, fizemos o mesmo teste no Oracle e não ocorreu erro
algum.
   E agora?
   Quem poderá nos defender??   rss



Segue abaixo o script ...





--1.a tabela
create table pessoa(
codp integer primary key,
nome varchar(10)
);

--2.a tabela
create table animal(
coda integer primary key,
raca varchar(10),
codp integer references pessoa(codp)
);


-- inserção de dados
insert into pessoa values (1, 'rosa');
insert into pessoa values (2, 'maria');
insert into pessoa values (3, 'josé');



 -- transacao - TA

begin;
insert into animal values (108, 'viralata', 1);

select * from animal;
select * from pessoa;



--transacao  -TB

begin;
update pessoa set nome = 'rosana' where nome = 'rosa'; -- executado com
sucesso

update pessoa set nome = 'rosa de' where codp=1;  -- executado com sucesso

select nome from pessoa  for update nowait;   -- erro!


** Error **

ERROR: could not obtain lock on row in relation pessoa
SQL state: 55P03


Atenciosamente,

-- 
Rosana de Oliveira Santos
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] SELECT FOR UPDATE tentando obter lock

2015-04-15 Por tôpico Rosana de Oliveira
Em 15 de abril de 2015 13:56, Guimarães Faria Corcete DUTRA, Leandro 
l...@dutras.org escreveu:

 Por favor corte o que não é relevante à sua resposta, facilita quem
 vai responder.



Por favor, seja mais cordial.
Fiz uma pergunta e até agora só recebi críticas de você, Guimarães, como
resposta.
Suas mensagens têm tom apelativo.
Se não pode me ajudar, abstenha-se de responder.

Não quero fugir do tema.
Estou aguardando o tempo que for necessário os demais colegas responderem.


-- 
Rosana de Oliveira Santos
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] SELECT FOR UPDATE tentando obter lock

2015-04-15 Por tôpico Marcos Thomaz
Em 15 de abril de 2015 11:16, Rosana de Oliveira rosana.pi...@gmail.com
escreveu:


 Boa tarde a todos.

 Gostaria de que me auxiliassem a resolver uma dúvida sobre o que está
 ocorrendo na situação de controle de concorrência abaixo.

 Não me lembro de ter visto esse caso nas literaturas de Banco de Dados.

 Fizemos testes nas versões 9.3.5 e 9.4 do Postgresql.

 O cenário consistem de duas transações sendo executadas concorrentemente
 no Postgresql.
 A transação TA faz inserção em uma tabela animal.
 A transação TB faz update na tabela pessoa, em um campo que não tem nada a
 ver com a chave estrangeira à tabela animal.
 O que acontece é que o update da  transação TB é executado normalmente.
 Porém, se executarmos um SELECT FOR UPDATE, o Postgresql não aceita e dá
 mensagem de erro, não conseguindo obter o lock.



 PERGUNTA-SE:

 1. Qual a explicação literária e do Postgresql para esta tentativa mal
 sucedida de obter o lock?

 1.1 Quem 'lockou' o quê?

 2. Só de curiosidade, fizemos o mesmo teste no Oracle e não ocorreu erro
 algum.
E agora?
Quem poderá nos defender??   rss



 Segue abaixo o script ...





 --1.a tabela
 create table pessoa(
 codp integer primary key,
 nome varchar(10)
 );

 --2.a tabela
 create table animal(
 coda integer primary key,
 raca varchar(10),
 codp integer references pessoa(codp)
 );


 -- inserção de dados
 insert into pessoa values (1, 'rosa');
 insert into pessoa values (2, 'maria');
 insert into pessoa values (3, 'josé');



  -- transacao - TA

 begin;
 insert into animal values (108, 'viralata', 1);

 select * from animal;
 select * from pessoa;



 --transacao  -TB

 begin;
 update pessoa set nome = 'rosana' where nome = 'rosa'; -- executado
 com sucesso

 update pessoa set nome = 'rosa de' where codp=1;  -- executado com sucesso

 select nome from pessoa  for update nowait;   -- erro!


 ** Error **

 ERROR: could not obtain lock on row in relation pessoa
 SQL state: 55P03


 Atenciosamente,

 --
 Rosana de Oliveira Santos

 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Correndo o risco de estar falando besteira, e sem nenhuma comprovação
literária, mas quando você dá um update dentro da transação, o registro não
ficaria bloqueado?
Digo isso porque se a ideia é bloquear até o final da alteração, o ideal
seria o uso do select for update antes dos comandos de alteração,
garantindo o bloqueio, que seria liberado após a conclusão da transação
(commit/rollback). Se o update por si só já bloquear o registro, o select
for update iria falhar (pois está sendo colocado depois), não seria isso?

-- 


Marcos Thomaz da Silva
Analista de Tecnologia da Informação
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] SELECT FOR UPDATE tentando obter lock

2015-04-15 Por tôpico Guimarães Faria Corcete DUTRA , Leandro
Por favor corte o que não é relevante à sua resposta, facilita quem
vai responder.

2015-04-15 13:47 GMT-03:00 Rosana de Oliveira rosana.pi...@gmail.com:

 O nível de isolamento do Postgresql é o read committed.
 Não sei qual é o do Oracle.

O padrão do Oracle me parece ser o mesmo.


 Esqueçam-no.

Por quê?  Às vezes é mais fácil lembrar dos níveis de isolamento
comparando o comportamento que direto dos conceitos.


 Uma resposta da literatura formal
 (Date, Navathe, Silberchatz) para mim, seria suficiente.

Claro.  Só não está fresco na minha mente, e não posso parar para
relembrar aqui.  Tenha um pouco de paciência, normalmente esse tipo de
pergunta é respondido na lista no mesmo dia, talvez no seguinte.


 Só para explicar, o cenário que coloquei foi totalmente didático.

Nem precisava explicar isso, até pelas relações extremamente simples e
sem chaves naturais.


-- 
skype:leandro.gfc.dutra?chat  Yahoo!: ymsgr:sendIM?lgcdutra
+55 (61) 3546 7191  gTalk: xmpp:leand...@jabber.org
+55 (61) 9302 2691ICQ/AIM: aim:GoIM?screenname=61287803
BRAZIL GMT−3  MSN: msnim:chat?contact=lean...@dutra.fastmail.fm
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] SELECT FOR UPDATE tentando obter lock

2015-04-15 Por tôpico MIGUEL JOSE DE LIMA
  Correndo o risco de estar falando besteira, e sem nenhuma comprovação
 literária, mas quando você dá um update dentro da transação, o registro não
 ficaria bloqueado?
  Digo isso porque se a ideia é bloquear até o final da alteração, o ideal
 seria o uso do select for update antes dos comandos de alteração,
 garantindo o bloqueio, que seria liberado após a conclusão da transação
 (commit/rollback).  Se o update por si só já bloquear o registro, o select
 for update iria falhar (pois está sendo colocado depois), não seria isso?

 --


Sim é verdade, mas no exemplo ditático acima... por que o SELECT FOR
UPDATE tentou obter lock? Pelo que eu entendi e testei cada teste da
trasação 2 esta sendo feito isoladamente, não tem nada haver com update na
mesma transação.
Sendo assim,  minha dúvida é a mesma.
Atenciosamente.
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] SELECT FOR UPDATE tentando obter lock

2015-04-15 Por tôpico Guimarães Faria Corcete DUTRA , Leandro
Por favor, evite mensagens HTML.  Ler código em Comic Sans não é muito
agradável…


2015-04-15 13:16 GMT-03:00 Rosana de Oliveira rosana.pi...@gmail.com:

 2. Só de curiosidade, fizemos o mesmo teste no Oracle e não ocorreu erro
 algum.

Quais os respectivos níveis de isolamento?


-- 
skype:leandro.gfc.dutra?chat  Yahoo!: ymsgr:sendIM?lgcdutra
+55 (61) 3546 7191  gTalk: xmpp:leand...@jabber.org
+55 (61) 9302 2691ICQ/AIM: aim:GoIM?screenname=61287803
BRAZIL GMT−3  MSN: msnim:chat?contact=lean...@dutra.fastmail.fm
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] SELECT FOR UPDATE tentando obter lock

2015-04-15 Por tôpico Sebastian Webber
Em 15 de abril de 2015 13:16, Rosana de Oliveira rosana.pi...@gmail.com
escreveu:


 PERGUNTA-SE:

 1. Qual a explicação literária e do Postgresql para esta tentativa mal
 sucedida de obter o lock?


Eu passei por isso a um tempo atrás e tinha a ver com prepared
transactions. dá uma olhada na doc[1].


 1.1 Quem 'lockou' o quê?


Qual é o conteudo da view pg_locks? Tens como mandar a saida antes e depois
de iniciar o teu teste?


 2. Só de curiosidade, fizemos o mesmo teste no Oracle e não ocorreu erro
 algum.
E agora?
Quem poderá nos defender??


Sem dúvida, o Chapolin  Colorado!


[1] http://www.postgresql.org/docs/9.4/static/view-pg-locks.html


-- 
Sebastian Webber
http://swebber.me
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] Função retorna chave composta

2015-04-15 Por tôpico Matheus Saraiva
Uma função deve inserir um registro em uma tabela e retornar a PK do
registro inserido, porém, a PK da tabela é uma chave composta. Qual deve
ser o tipo de retorno da função e como fazer o retormo?

Exemplo:

TBLCONTA
-
cliente integer PK
tipoconta smallint PK
banco varchar(30)
agencia varchar(10)
conta varchar(10)

Em uma chave simples eu posso usar a clausula RETURNING do INSERT para
obter a PK do registro inserido. Mas como fazer isso com uma chave
composta?

Eu pensei em criar um tipo composto com os tipos (integer e smallint), e
usar como sendo o retorno da função mas como fazer o retorno do corpo da
mesma?

___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] RES: SELECT FOR UPDATE tentando obter lock

2015-04-15 Por tôpico Márcio A . Sepp


--1.a tabela 
create table pessoa(
codp integer primary key,
nome varchar(10)
);

--2.a tabela 
create table animal( 
coda integer primary key,
raca varchar(10),
codp integer references pessoa(codp)
);


-- inserção de dados 
insert into pessoa values (1, 'rosa');
insert into pessoa values (2, 'maria');
insert into pessoa values (3, 'josé');



 -- transacao - TA

begin;
insert into animal values (108, 'viralata', 1); 
select * from animal;
select * from pessoa;


--transacao  -TB

begin;
update pessoa set nome = 'rosana' where nome = 'rosa';     -- executado com
sucesso
update pessoa set nome = 'rosa de' where codp=1;  -- executado com sucesso
select nome from pessoa  for update nowait;   -- erro! 


** Error **

ERROR: could not obtain lock on row in relation pessoa
SQL state: 55P03



Testei o script exatamente como vc postou aqui, mas não obtive este lock.
Minha versão do postgres é 9.3.2. 

Na versão 9.0 o comando:
update pessoa set nome = 'rosana' where nome = 'rosa'; 

fica aguardando a transação anterior. 
 


Att.
Márcio A. Sepp

___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] SELECT FOR UPDATE tentando obter lock

2015-04-15 Por tôpico Euler Taveira
On 15-04-2015 13:16, Rosana de Oliveira wrote:
 1. Qual a explicação literária e do Postgresql para esta tentativa mal
 sucedida de obter o lock?
 
Vamos entender o que ocorreu na transação A.

begin;
insert into animal values (108, 'viralata', 1);

euler=# select relation::regclass,locktype,virtualtransaction as
vtxn,pid,mode from pg_locks order by pid,relation;
  relation   |   locktype| vtxn | pid  |   mode
-+---+--+--+--
 pessoa  | relation  | 2/21 | 2794 | RowShareLock
 pessoa_pkey | relation  | 2/21 | 2794 | AccessShareLock
 animal  | relation  | 2/21 | 2794 | RowExclusiveLock
 | virtualxid| 2/21 | 2794 | ExclusiveLock
 | transactionid | 2/21 | 2794 | ExclusiveLock

A inserção foi na tabela animal mas como há uma chave estrangeira para
tabela pessoa, o SGBD tem que garantir que ninguém irá modificar o
registro envolvido (por isso ele coloca um RowShareLock na tabela pessoa).

 1.1 Quem 'lockou' o quê?
 
Na segunda transação:

euler=# begin;
BEGIN
euler=# select nome from pessoa  for update;

euler=# select relation::regclass,locktype,virtualtransaction as
vtxn,pid,mode from pg_locks order by pid,relation;
  relation   |   locktype| vtxn | pid  |mode
-+---+--+--+-
 pessoa  | relation  | 3/41 | 2728 | RowShareLock
 pessoa  | tuple | 3/41 | 2728 | AccessExclusiveLock
 pessoa_pkey | relation  | 3/41 | 2728 | AccessShareLock
 | transactionid | 3/41 | 2728 | ShareLock
 | virtualxid| 3/41 | 2728 | ExclusiveLock
 pessoa  | relation  | 2/21 | 2794 | RowShareLock
 pessoa_pkey | relation  | 2/21 | 2794 | AccessShareLock
 animal  | relation  | 2/21 | 2794 | RowExclusiveLock
 | transactionid | 2/21 | 2794 | ExclusiveLock
 | virtualxid| 2/21 | 2794 | ExclusiveLock

[não usei o NOWAIT para deixar a transação B esperando para que eu possa
obter a saída dos locks]

O SELECT ... FOR UPDATE tenta obter um AccessExclusiveLock (segunda
linha) em todas as tuplas da tabela mas isso não é possível porque uma
das tuplas (codp = 1) está com um lock FOR KEY SHARE (vide tabela 13-3
em [1]) para impossibilitar alguém de alterar o codp da tupla 1 ou mesmo
remover a tupla 1 (essa garantia é necessária para manter a integridade
dos dados).

 2. Só de curiosidade, fizemos o mesmo teste no Oracle e não ocorreu erro
 algum.
E agora?
Quem poderá nos defender??   rss
 
Muito estranho ele não falhar (no caso do NOWAIT) ou ficar esperando
(sem NOWAIT) pois isso pode acarretar perda de integridade. O que
acontece se na transação B você alterar o codp de 1 para 2?

Vale ressaltar que em versões anteriores a 9.3, UPDATE em tuplas de uma
chave estrangeira (como é o caso dos seus UPDATEs na transação B) ficam
bloqueados. A partir da 9.3, eles podem ser feitos desde que você *não*
altere a chave primária da tabela pessoa.


[1] http://www.postgresql.org/docs/9.4/static/explicit-locking.html


-- 
   Euler Taveira   Timbira - http://www.timbira.com.br/
   PostgreSQL: Consultoria, Desenvolvimento, Suporte 24x7 e Treinamento
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] SELECT FOR UPDATE tentando obter lock

2015-04-15 Por tôpico Matheus de Oliveira
2015-04-15 13:16 GMT-03:00 Rosana de Oliveira rosana.pi...@gmail.com:

 1. Qual a explicação literária e do Postgresql para esta tentativa mal
 sucedida de obter o lock?


O erro especificamente foi devido ao parâmetro NOWAIT, se removesse este, a
segunda transação ficaria bloqueada aguardando a primeira.


 1.1 Quem 'lockou' o quê?


Ok, vamos simplificar o exemplo para entender melhor:

* Preparação (igual ao seu):

CREATE TABLE pessoa(codp integer RIMARY KEY, nome varchar(10));
CREATE TABLE animal(coda integer PRIMARY KEY, raca varchar(10), codp
integer REFERENCES pessoa(codp));
INSERT INTO pessoa VALUES (1, 'rosa');
INSERT INTO pessoa VALUES (2, 'maria');
INSERT INTO pessoa VALUES (3, 'josé');

* Transação TA:

BEGIN;
INSERT INTO animal VALUES (108, 'viralata', 1);

* Transação TB:

BEGIN;
SELECT * FROM pessoa FOR UPDATE NOWAIT; -- ERRO!

O que aconteceu foi, quando você fez o INSERT de animal na TA, o
PostgreSQL bloqueou a tupla que esta se refere na tabela pessoa, nesse
caso a que possue codp = 1, isso para garantir que a chave estrangeira
não seja removida durante a operação. Internamente o PostgreSQL usa o
seguinte comando quando você faz o INSERT:

SELECT 1 FROM ONLY pessoa x WHERE x.codp = 1 FOR KEY SHARE OF x;

E quando você executou o SELECT em TB, você incluiu a linha com codp=1,
que já estava bloqueado pelo comando acima (executado implicitamente com o
INSERT), causando assim um conflito e, como usou o NOWAIT, retornando um
erro. Se quiser verificar isso, exclua o codp=1 do SELECT em TB e verá
que o erro não é retornado:

SELECT * FROM pessoa WHERE codp  1 FOR UPDATE NOWAIT;

Se você está usando FOR UPDATE, mas sabe que não vai alterar nenhuma chave
UK/PK da tabela, você pode usar o FOR NO KEY UPDATE, que é mutuamente
exclusivo mas não conflita com FOR KEY SHARE (usando pelas chaves
estrangeiras). Veja os demais níveis em [1].

OBS: FOR KEY SHARE é relativamente novo, 9.3 se não me engano.

[1]
http://www.postgresql.org/docs/current/static/explicit-locking.html#LOCKING-ROWS

Atenciosamente,
-- 
Matheus de Oliveira
Analista de Banco de Dados
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Função retorna chave composta

2015-04-15 Por tôpico Matheus de Oliveira
2015-04-15 15:45 GMT-03:00 Matheus Saraiva matheus.sara...@gmail.com:

 Uma função deve inserir um registro em uma tabela e retornar a PK do
 registro inserido, porém, a PK da tabela é uma chave composta. Qual deve
 ser o tipo de retorno da função e como fazer o retormo?

 Exemplo:

 TBLCONTA
 -
 cliente integer PK
 tipoconta smallint PK
 banco varchar(30)
 agencia varchar(10)
 conta varchar(10)


Eu usaria parâmetros OUT, exemplo:

CREATE FUNCTION sua_funcao(p_banco varchar, p_agencia varchar, p_conta
varchar, OUT p_cliente integer, OUT p_tipoconta smallint)
LANGUAGE plpgsql AS $$
BEGIN
INSERT INTO tblconta(...)
VALUES()
RETURNING cliente, tipoconta INTO p_cliente, p_tipoconta
END;
$$;

Assim sua função retorna na saída os valores que estiverem em p_cliente e
p_tipoconta, ou seja, ela irá retornar uma linha e duas colunas.

Atenciosamente,
-- 
Matheus de Oliveira
Analista de Banco de Dados
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Função retorna chave composta

2015-04-15 Por tôpico Matheus Saraiva
Em Qua, 2015-04-15 às 16:10 -0300, Fabio Roberto escreveu:
 
 Em 15 de abril de 2015 15:45, Matheus Saraiva
 matheus.sara...@gmail.com escreveu:
 Em uma chave simples eu posso usar a clausula RETURNING do
 INSERT para
 obter a PK do registro inserido. Mas como fazer isso com uma
 chave
 composta?
 
 Opa Matheus,
 
 
 Mas você também pode utilizar o returning numa chave composta também.
 Por exemplo:
 insert into TBLCONTA values (1,'1') returning cliente, tipoconta;
 
 
 Isto trará o resultado desejado.
 
U.. Eu lembro de ter tando fazer isso em outra situação mas recebi
um erro de sintaxe.

Mas, conseguindo pegar os dois valores com RETURNING, como eu faria a
função retorná-los?

Li alguma coisa sobre retornos RECORD, mas não encontre ainda uma forma
de usar RECORD para resolver isso.



___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Função retorna chave composta

2015-04-15 Por tôpico Fabio Roberto
Em 15 de abril de 2015 15:45, Matheus Saraiva matheus.sara...@gmail.com
escreveu:

 Em uma chave simples eu posso usar a clausula RETURNING do INSERT para
 obter a PK do registro inserido. Mas como fazer isso com uma chave
 composta?


Opa Matheus,

Mas você também pode utilizar o returning numa chave composta também.
Por exemplo:
insert into TBLCONTA values (1,'1') returning cliente, tipoconta;

Isto trará o resultado desejado.

Fábio Roberto de Araújo e Vasconcelos
Administrador de Banco de Dados
Especialista em Banco de Dados
Tecnólogo em Redes de Computadores - IFPB
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] Ajuda com trigger

2015-04-15 Por tôpico Márcio A . Sepp

Preciso criar uma trigger em uma tabela que faça inserts/updates nela mesma.

Como faço para resolver o problema do loop?  


Att.
Márcio A. Sepp

___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com trigger

2015-04-15 Por tôpico Marcos Thomaz
Em 15 de abril de 2015 19:38, Márcio A. Sepp mar...@zyontecnologia.com.br
escreveu:


 Preciso criar uma trigger em uma tabela que faça inserts/updates nela
 mesma.

 Como faço para resolver o problema do loop?


 Att.
 Márcio A. Sepp

 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Procure por pg_trigger_depth()

[1] http://www.postgresql.org/docs/9.2/static/functions-info.html
[2] http://www.depesz.com/2012/02/01/waiting-for-9-2-trigger-depth/

-- 


Marcos Thomaz da Silva
Analista de Tecnologia da Informação
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] SELECT FOR UPDATE tentando obter lock

2015-04-15 Por tôpico Rosana de Oliveira
Muito obrigada pela explicação, Euler!
Show de bola!!!
Imaginava que o SGBD controlaria  somente reativamente para o controle da
restrição de integridade referencial.
Nesse caso ele prefere agir preventivamente.
Caso contrário, ele precisaria implementar um  lock por atributo e não por
tupla, não é mesmo?
Acredito que ele prefere exceder no zelo com essa ação preventiva e lockar
a tupla toda...






 Muito estranho ele (Oracle) não falhar (no caso do NOWAIT) ou ficar
 esperando
 (sem NOWAIT) pois isso pode acarretar perda de integridade. O que
 acontece se na transação B você alterar o codp de 1 para 2?


Mais um ponto para o Postgresql então!!!




 Vale ressaltar que em versões anteriores a 9.3, UPDATE em tuplas de uma
 chave estrangeira (como é o caso dos seus UPDATEs na transação B) ficam
 bloqueados. A partir da 9.3, eles podem ser feitos desde que você *não*
 altere a chave primária da tabela pessoa.


isso aconteceu conosco também na versão 9.2


Obrigada novamente!

Rosana de Oliveira Santos
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] SELECT FOR UPDATE tentando obter lock

2015-04-15 Por tôpico Rosana de Oliveira
Em 15 de abril de 2015 17:33, Matheus de Oliveira matioli.math...@gmail.com
 escreveu:





Obrigada pela explicação Matheus
Valeu demais !!!
Esse grupo é mesmo muito eficiente!

Att.

Rosana de Oliveira Santos
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral