[pgbr-geral] DELETE - violates foreign key constraint

2018-03-14 Por tôpico Zan

Boa tarde a todos.

Ao tentar deletar um registro recebo a seguinte mensagem de erro:
ERROR:  update or delete on table "tb_tipos_referencias" violates 
foreign key constraint "tb_referencias_fk_01" on table "tb_referencias"

DETAIL:  Key (id)=(1) is still referenced from table "tb_referencias".

A chave estrangeira criada está como ON DELETE NO ACTION, por isso está 
dando o erro.


Minha dúvida é se tenho como tratar um DELETE antes de executar. Para 
esta tabela é simples tratar, pois é apenas uma tabela de referência. Eu 
estou com a mesma situação para a tabela de usuários, onde no caso nem 
sei contar quantas tabelas fazem referência a mesma.


Qual a melhor maneira de fazer esse tratamento?

Desde já peço desculpa caso a pergunta seja tola. Estou procurando já 
faz um tempo no Google como fazer isso, mas não encontrei nada. Acredito 
não estar fazendo a busca da maneira correta.


Obrigado.

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

Re: [pgbr-geral] Delete

2017-12-19 Por tôpico Fábio Telles Rodriguez
>
> ​A minha tabela possui uma outra com históricos​, então eu tenho o
> seguinte cenário:
> Tabela principal com 79 colunas, 1,5 milhões de registros e 596 MB de
> tamanho;
> Tabela de historico com 20 colunas, 10 milhões de registros e 1,2 GB de
> tamanho;
>
> Para excluir os registros da tabela principal, eu tenho que excluir
> primeiro na tabela de historicos, então eu excluí os 20 mil registros
> utilizando o operador "IN" e o delete foi rápido, porém, na tabela
> principal não, o campo utilizado no delete não é a PK mas um índice único.
> Será que pode ter ocorrido algum problema na tabela principal como um
> índice corrompido?
>
> No explain utilizando o "IN" eu tenho: Delete on tabela_a
> (cost=25.50..96449.56 rows=20059 width=6)
> ​Utilizando o método proposto pelo Telles eu tenho: ​Delete on tabela_a
> (cost=356.43..1324.56 rows=843680 width=12)
>

Rode o EXPLAIN ANALYZE ao invés do EXPLAIN simples. Outra coisa que pode
ajudar é depois de fazer o INSERT na tabela 'f', rodar um ANALYZE na tabela
'f'. Assim o otimizador deverá fazer um trabalho melhor.

-- 
Atenciosamente,
Fábio Telles Rodriguez
blog: http:// s
avepoint.blog.br
e-mail / gtalk / MSN: fabio.tel...@gmail.com
Skype: fabio_telles

Timbira - A empresa brasileira de Postgres
http://www.timbira.com.br
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Re: [pgbr-geral] Delete

2017-12-19 Por tôpico Leandro Guimarães Faria Corcete DUTRA
Le lun. 18 déc. 2017 à 17:15, Danilo Silva 
 a écrit :


Qual seria a melhor prática para deletar 20 mil registros em uma 
tabela com 1,5 milhões de registros, vale ressaltar que o campo 
condicional do delete é a pk da tabela:


a) Deletar os 20 mil de uma só vez com a condição "IN" no WHERE;
b) Fazer um loop na aplicação e deletar um por vez;


Lembra que SQL é orientado a conjuntos (baseado no modelo relacional, 
que combina lógica dos predicados com teoria dos conjuntos); 
naturalmente, geralmente será bem melhor trabalhar com conjuntos que 
com iterações de operações individuais.



--
skype:leandro.gfc.dutra?chat  Yahoo!: ymsgr:sendIM?lgcdutra
+55 (61)  3546 7191 gTalk: xmpp:leand...@jabber.org
+55 (61) 99302 2691   ICQ/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] Delete

2017-12-19 Por tôpico Danilo Silva
Em 18 de dezembro de 2017 18:32, Fábio Telles Rodriguez <
fabio.tel...@gmail.com> escreveu:

> vamos imaginar que a tabela 't' tem o campo 'id' que você quer remover as
> 20 mil linhas:
>
> postgres=# create table t (id integer);
> CREATE TABLE
> postgres=# insert into t select * from generate_series(1,150);
> LOG:  temporary file: path "pg_tblspc/581531196/PG_9.3_
> 201306121/pgsql_tmp/pgsql_tmp29753.0", size 2100
> INSERT 0 150
>
> Agora vou criar uma tabela temporária que tenha 20 mil registros
> aleatórios. Serão os registros que eu vou querer apagar da tabela 't'
>
> postgres=# create temporary table f (id integer);
> CREATE TABLE
> postgres=# insert into f select round(random()*150) from
> generate_series(1,2);
> INSERT 0 2
>
> Agora eu faço o DELETE dos registros que escolhi:
>
> postgres=# delete from t where exists (select 1 from f where f.id=t.id);
> DELETE 19866
>
> Ou seja, eu prefiro fazer um SUBSELECT para apagar tudo.
>
> ​A minha tabela possui uma outra com históricos​, então eu tenho o
seguinte cenário:
Tabela principal com 79 colunas, 1,5 milhões de registros e 596 MB de
tamanho;
Tabela de historico com 20 colunas, 10 milhões de registros e 1,2 GB de
tamanho;

Para excluir os registros da tabela principal, eu tenho que excluir
primeiro na tabela de historicos, então eu excluí os 20 mil registros
utilizando o operador "IN" e o delete foi rápido, porém, na tabela
principal não, o campo utilizado no delete não é a PK mas um índice único.
Será que pode ter ocorrido algum problema na tabela principal como um
índice corrompido?

No explain utilizando o "IN" eu tenho: Delete on tabela_a
(cost=25.50..96449.56 rows=20059 width=6)
​Utilizando o método proposto pelo Telles eu tenho: ​Delete on tabela_a
(cost=356.43..1324.56 rows=843680 width=12)


[]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] Delete

2017-12-18 Por tôpico Fábio Telles Rodriguez
vamos imaginar que a tabela 't' tem o campo 'id' que você quer remover as
20 mil linhas:

postgres=# create table t (id integer);
CREATE TABLE
postgres=# insert into t select * from generate_series(1,150);
LOG:  temporary file: path
"pg_tblspc/581531196/PG_9.3_201306121/pgsql_tmp/pgsql_tmp29753.0", size
2100
INSERT 0 150

Agora vou criar uma tabela temporária que tenha 20 mil registros
aleatórios. Serão os registros que eu vou querer apagar da tabela 't'

postgres=# create temporary table f (id integer);
CREATE TABLE
postgres=# insert into f select round(random()*150) from
generate_series(1,2);
INSERT 0 2

Agora eu faço o DELETE dos registros que escolhi:

postgres=# delete from t where exists (select 1 from f where f.id=t.id);
DELETE 19866

Ou seja, eu prefiro fazer um SUBSELECT para apagar tudo.


Em 18 de dezembro de 2017 17:15, Danilo Silva 
escreveu:

> Pessoal,
>
> Qual seria a melhor prática para deletar 20 mil registros em uma tabela
> com 1,5 milhões de registros, vale ressaltar que o campo condicional do
> delete é a pk da tabela:
>
> a) Deletar os 20 mil de uma só vez com a condição "IN" no WHERE;
> b) Fazer um loop na aplicação e deletar um por vez;
> c) Outra técnica (qual?);
>
> Existe alguma forma de melhorar a rapidez do delete? Algum parâmetro no
> .conf?
>
> []s
> Danilo
>
> ___
> pgbr-geral mailing list
> pgbr-geral@listas.postgresql.org.br
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>



-- 
Atenciosamente,
Fábio Telles Rodriguez
blog: http:// s
avepoint.blog.br
e-mail / gtalk / MSN: fabio.tel...@gmail.com
Skype: fabio_telles

Timbira - A empresa brasileira de Postgres
http://www.timbira.com.br
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

[pgbr-geral] Delete

2017-12-18 Por tôpico Danilo Silva
Pessoal,

Qual seria a melhor prática para deletar 20 mil registros em uma tabela com
1,5 milhões de registros, vale ressaltar que o campo condicional do delete
é a pk da tabela:

a) Deletar os 20 mil de uma só vez com a condição "IN" no WHERE;
b) Fazer um loop na aplicação e deletar um por vez;
c) Outra técnica (qual?);

Existe alguma forma de melhorar a rapidez do delete? Algum parâmetro no
.conf?

[]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] Delete ou Update em dois registros identicos

2017-10-23 Por tôpico Edelson Regis de Lima
Isso mesmo Fábio, resolvi com o CTID!

Valew pessoal!

Edelson

Em 23 de outubro de 2017 14:48, Fábio Telles Rodriguez <
fabio.tel...@gmail.com> escreveu:

> Veja se assim fica claro:
>
> http://www.savepoint.blog.br/2017/10/23/removendo-registros-identicos-no-
> postgresql/
>
> Em 16 de outubro de 2017 13:03, Edelson Regis de Lima 
> escreveu:
>
>> Olá pessoal.
>>
>> To com um problema que não sei se tem solução...
>>
>> Tem um cliente que tem um banco de dados com uma tabela com dois
>> registros identicos, e preciso dar um update ou um delete em um dos
>> registros, porém como todos os campos são iguais, ainda não achei uma
>> solução.
>>
>> Exmplo: tenho a minha_tabela, com as colunas col_a e col_b. Nessa tabela
>> tem dois registros identicos:
>>
>> col_a | col_B
>>
>> aaa | bbb
>>
>> aaa | bbb
>>
>> Eu gostaria de apagar a linha dois por exemplo, ou dar um update mudando
>> as informações para ccc | ddd.
>>
>> Já vi o uso do ROW_NUMBER () OVER (ORDER BY id), porém só achei exemplos
>> que funcionasse com o SELECT.
>>
>> Já tentei:
>>
>> UPDATE minha_tabela SET col_a = 'ccc', col_b = 'ddd' where col_a = 'aaa'
>> and col_b = 'bbb' and ROW_NUMBER () OVER (ORDER BY id) = 2;
>>
>> Porém dá: ERROR:  cannot use window function in UPDATE
>>
>> Alguém teria uma solução?
>>
>> Agradeço desde já!
>>
>> --
>> *Edelson Regis de Lima*
>>
>> ___
>> pgbr-geral mailing list
>> pgbr-geral@listas.postgresql.org.br
>> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>>
>
>
>
> --
> Atenciosamente,
> Fábio Telles Rodriguez
> blog: http:// s
> avepoint.blog.br
> e-mail / gtalk / MSN: fabio.tel...@gmail.com
> Skype: fabio_telles
>
> Timbira - A empresa brasileira de Postgres
> http://www.timbira.com.br
>
> ___
> 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

Re: [pgbr-geral] Delete ou Update em dois registros identicos

2017-10-23 Por tôpico Fábio Telles Rodriguez
Veja se assim fica claro:

http://www.savepoint.blog.br/2017/10/23/removendo-registros-identicos-no-postgresql/

Em 16 de outubro de 2017 13:03, Edelson Regis de Lima 
escreveu:

> Olá pessoal.
>
> To com um problema que não sei se tem solução...
>
> Tem um cliente que tem um banco de dados com uma tabela com dois registros
> identicos, e preciso dar um update ou um delete em um dos registros, porém
> como todos os campos são iguais, ainda não achei uma solução.
>
> Exmplo: tenho a minha_tabela, com as colunas col_a e col_b. Nessa tabela
> tem dois registros identicos:
>
> col_a | col_B
>
> aaa | bbb
>
> aaa | bbb
>
> Eu gostaria de apagar a linha dois por exemplo, ou dar um update mudando
> as informações para ccc | ddd.
>
> Já vi o uso do ROW_NUMBER () OVER (ORDER BY id), porém só achei exemplos
> que funcionasse com o SELECT.
>
> Já tentei:
>
> UPDATE minha_tabela SET col_a = 'ccc', col_b = 'ddd' where col_a = 'aaa'
> and col_b = 'bbb' and ROW_NUMBER () OVER (ORDER BY id) = 2;
>
> Porém dá: ERROR:  cannot use window function in UPDATE
>
> Alguém teria uma solução?
>
> Agradeço desde já!
>
> --
> *Edelson Regis de Lima*
>
> ___
> pgbr-geral mailing list
> pgbr-geral@listas.postgresql.org.br
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>



-- 
Atenciosamente,
Fábio Telles Rodriguez
blog: http:// s
avepoint.blog.br
e-mail / gtalk / MSN: fabio.tel...@gmail.com
Skype: fabio_telles

Timbira - A empresa brasileira de Postgres
http://www.timbira.com.br
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Re: [pgbr-geral] Delete ou Update em dois registros identicos

2017-10-23 Por tôpico Fábio Telles Rodriguez
Em 23 de outubro de 2017 12:59, Luiz Carlos L. Nogueira Jr. <
lcnogueir...@gmail.com> escreveu:

> Fazer um update com limit 1 não funcionaria?
>

O LIMIT se aplica ao SELECT, a condição do UPDATE vem pelo WHERE. Você tem
que fazer algo assim:

SELECT *ctid, ** FROM tabela;

UPDATE tabela SET ...  WHERE *ctid = ( xxx, yyy)::tid*


Onde xxx e yyy são o par de números exibidos no ctid que você recebeu no
seu SELECT.



> Em 17 de outubro de 2017 10:17, Edelson Regis de Lima 
> escreveu:
>
>> Obrigado pessoal!
>> Obrigado a todos pela ajuda!
>>
>> Grande abraço!
>>
>> --
>> *Edelson Regis de Lima*
>>
>> Em 16 de outubro de 2017 15:01, Michel Luiz Milezzi <
>> michelmile...@gmail.com> escreveu:
>>
>>> Edelson, neste caso você deve usar a localização física dos registros
>>> (coluna implícita ctid).
>>>
>>> https://www.postgresql.org/docs/current/static/ddl-system-columns.html
>>>
>>> Em 16 de outubro de 2017 15:51, Danilo Silva >> > escreveu:
>>>


 Danilo Gomes

 Em 16 de outubro de 2017 15:32, Edelson Regis de Lima <
 edre...@gmail.com> escreveu:

> Olá Flávio.
>
> Mas com esse exemplo você está supondo que na tabela exista o campo
> "id" que seria uma chave única, correto?
> O problema é que nessa tabela que mencionei não sei porque raios não
> existe essa chave única. Tem um campo id, auto incremento, que seria essa
> chave única, mas não sei como o sistema conseguiu inserir dois registros
> identicos, inclusive o valor do id...
> Então eu teria que ver se dá para identificar de outra maneira, pela
> posição física do registro, sei lá...
> Não sei se isso é possível... rs
>
> ​Você tem duas opções:
 a) se a tabela possuir o campo OID (essa coluna normalmente fica
 invisível, depende do método de criação da tabela), você pode deletar por
 esse registro, exemplo: SELECT OID, col_a,
 col_
 ​b FROM tabela, e depois deletar: DELETE FROM tabela WHERE (OID = ?)

 b) se a tabela não for muito grande, você pode adicionar uma nova
 coluna com ​
 ​

 ​o tipo sendo serial: ALTER TABLE tabela ADD COLUMN cod_delete serial.
 Com isso você consegue deletar através do código dessa coluna.

 []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 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 mailing list
> pgbr-geral@listas.postgresql.org.br
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>



-- 
Atenciosamente,
Fábio Telles Rodriguez
blog: http:// s
avepoint.blog.br
e-mail / gtalk / MSN: fabio.tel...@gmail.com
Skype: fabio_telles

Timbira - A empresa brasileira de Postgres
http://www.timbira.com.br
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Re: [pgbr-geral] Delete ou Update em dois registros identicos

2017-10-23 Por tôpico Luiz Carlos L. Nogueira Jr.
Fazer um update com limit 1 não funcionaria?

Em 17 de outubro de 2017 10:17, Edelson Regis de Lima 
escreveu:

> Obrigado pessoal!
> Obrigado a todos pela ajuda!
>
> Grande abraço!
>
> --
> *Edelson Regis de Lima*
>
> Em 16 de outubro de 2017 15:01, Michel Luiz Milezzi <
> michelmile...@gmail.com> escreveu:
>
>> Edelson, neste caso você deve usar a localização física dos registros
>> (coluna implícita ctid).
>>
>> https://www.postgresql.org/docs/current/static/ddl-system-columns.html
>>
>> Em 16 de outubro de 2017 15:51, Danilo Silva 
>> escreveu:
>>
>>>
>>>
>>> Danilo Gomes
>>>
>>> Em 16 de outubro de 2017 15:32, Edelson Regis de Lima >> > escreveu:
>>>
 Olá Flávio.

 Mas com esse exemplo você está supondo que na tabela exista o campo
 "id" que seria uma chave única, correto?
 O problema é que nessa tabela que mencionei não sei porque raios não
 existe essa chave única. Tem um campo id, auto incremento, que seria essa
 chave única, mas não sei como o sistema conseguiu inserir dois registros
 identicos, inclusive o valor do id...
 Então eu teria que ver se dá para identificar de outra maneira, pela
 posição física do registro, sei lá...
 Não sei se isso é possível... rs

 ​Você tem duas opções:
>>> a) se a tabela possuir o campo OID (essa coluna normalmente fica
>>> invisível, depende do método de criação da tabela), você pode deletar por
>>> esse registro, exemplo: SELECT OID, col_a,
>>> col_
>>> ​b FROM tabela, e depois deletar: DELETE FROM tabela WHERE (OID = ?)
>>>
>>> b) se a tabela não for muito grande, você pode adicionar uma nova coluna
>>> com ​
>>> ​
>>>
>>> ​o tipo sendo serial: ALTER TABLE tabela ADD COLUMN cod_delete serial.
>>> Com isso você consegue deletar através do código dessa coluna.
>>>
>>> []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 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 mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Re: [pgbr-geral] Delete ou Update em dois registros identicos

2017-10-17 Por tôpico Edelson Regis de Lima
Obrigado pessoal!
Obrigado a todos pela ajuda!

Grande abraço!

-- 
*Edelson Regis de Lima*

Em 16 de outubro de 2017 15:01, Michel Luiz Milezzi  escreveu:

> Edelson, neste caso você deve usar a localização física dos registros
> (coluna implícita ctid).
>
> https://www.postgresql.org/docs/current/static/ddl-system-columns.html
>
> Em 16 de outubro de 2017 15:51, Danilo Silva 
> escreveu:
>
>>
>>
>> Danilo Gomes
>>
>> Em 16 de outubro de 2017 15:32, Edelson Regis de Lima 
>> escreveu:
>>
>>> Olá Flávio.
>>>
>>> Mas com esse exemplo você está supondo que na tabela exista o campo "id"
>>> que seria uma chave única, correto?
>>> O problema é que nessa tabela que mencionei não sei porque raios não
>>> existe essa chave única. Tem um campo id, auto incremento, que seria essa
>>> chave única, mas não sei como o sistema conseguiu inserir dois registros
>>> identicos, inclusive o valor do id...
>>> Então eu teria que ver se dá para identificar de outra maneira, pela
>>> posição física do registro, sei lá...
>>> Não sei se isso é possível... rs
>>>
>>> ​Você tem duas opções:
>> a) se a tabela possuir o campo OID (essa coluna normalmente fica
>> invisível, depende do método de criação da tabela), você pode deletar por
>> esse registro, exemplo: SELECT OID, col_a,
>> col_
>> ​b FROM tabela, e depois deletar: DELETE FROM tabela WHERE (OID = ?)
>>
>> b) se a tabela não for muito grande, você pode adicionar uma nova coluna
>> com ​
>> ​
>>
>> ​o tipo sendo serial: ALTER TABLE tabela ADD COLUMN cod_delete serial.
>> Com isso você consegue deletar através do código dessa coluna.
>>
>> []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 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

Re: [pgbr-geral] Delete ou Update em dois registros identicos

2017-10-16 Por tôpico Michel Luiz Milezzi
Edelson, neste caso você deve usar a localização física dos registros
(coluna implícita ctid).

https://www.postgresql.org/docs/current/static/ddl-system-columns.html

Em 16 de outubro de 2017 15:51, Danilo Silva 
escreveu:

>
>
> Danilo Gomes
>
> Em 16 de outubro de 2017 15:32, Edelson Regis de Lima 
> escreveu:
>
>> Olá Flávio.
>>
>> Mas com esse exemplo você está supondo que na tabela exista o campo "id"
>> que seria uma chave única, correto?
>> O problema é que nessa tabela que mencionei não sei porque raios não
>> existe essa chave única. Tem um campo id, auto incremento, que seria essa
>> chave única, mas não sei como o sistema conseguiu inserir dois registros
>> identicos, inclusive o valor do id...
>> Então eu teria que ver se dá para identificar de outra maneira, pela
>> posição física do registro, sei lá...
>> Não sei se isso é possível... rs
>>
>> ​Você tem duas opções:
> a) se a tabela possuir o campo OID (essa coluna normalmente fica
> invisível, depende do método de criação da tabela), você pode deletar por
> esse registro, exemplo: SELECT OID, col_a,
> col_
> ​b FROM tabela, e depois deletar: DELETE FROM tabela WHERE (OID = ?)
>
> b) se a tabela não for muito grande, você pode adicionar uma nova coluna
> com ​
> ​
>
> ​o tipo sendo serial: ALTER TABLE tabela ADD COLUMN cod_delete serial. Com
> isso você consegue deletar através do código dessa coluna.
>
> []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 mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Re: [pgbr-geral] Delete ou Update em dois registros identicos

2017-10-16 Por tôpico Danilo Silva
Danilo Gomes

Em 16 de outubro de 2017 15:32, Edelson Regis de Lima 
escreveu:

> Olá Flávio.
>
> Mas com esse exemplo você está supondo que na tabela exista o campo "id"
> que seria uma chave única, correto?
> O problema é que nessa tabela que mencionei não sei porque raios não
> existe essa chave única. Tem um campo id, auto incremento, que seria essa
> chave única, mas não sei como o sistema conseguiu inserir dois registros
> identicos, inclusive o valor do id...
> Então eu teria que ver se dá para identificar de outra maneira, pela
> posição física do registro, sei lá...
> Não sei se isso é possível... rs
>
> ​Você tem duas opções:
a) se a tabela possuir o campo OID (essa coluna normalmente fica invisível,
depende do método de criação da tabela), você pode deletar por esse
registro, exemplo: SELECT OID, col_a,
col_
​b FROM tabela, e depois deletar: DELETE FROM tabela WHERE (OID = ?)

b) se a tabela não for muito grande, você pode adicionar uma nova coluna
com ​
​

​o tipo sendo serial: ALTER TABLE tabela ADD COLUMN cod_delete serial. Com
isso você consegue deletar através do código dessa coluna.

[]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] Delete ou Update em dois registros identicos

2017-10-16 Por tôpico Edelson Regis de Lima
Olá Flávio.

Mas com esse exemplo você está supondo que na tabela exista o campo "id"
que seria uma chave única, correto?
O problema é que nessa tabela que mencionei não sei porque raios não existe
essa chave única. Tem um campo id, auto incremento, que seria essa chave
única, mas não sei como o sistema conseguiu inserir dois registros
identicos, inclusive o valor do id...
Então eu teria que ver se dá para identificar de outra maneira, pela
posição física do registro, sei lá...
Não sei se isso é possível... rs

-- 
*Edelson Regis de Lima*


Em 16 de outubro de 2017 12:14, Flavio Henrique Araque Gurgel <
fha...@gmail.com> escreveu:

>
>
> Em seg, 16 de out de 2017 às 17:03, Edelson Regis de Lima <
> edre...@gmail.com> escreveu:
>
>> Olá pessoal.
>>
>> To com um problema que não sei se tem solução...
>>
>> Tem um cliente que tem um banco de dados com uma tabela com dois
>> registros identicos, e preciso dar um update ou um delete em um dos
>> registros, porém como todos os campos são iguais, ainda não achei uma
>> solução.
>>
>> Exmplo: tenho a minha_tabela, com as colunas col_a e col_b. Nessa tabela
>> tem dois registros identicos:
>>
>> col_a | col_B
>>
>> aaa | bbb
>>
>> aaa | bbb
>>
>> Eu gostaria de apagar a linha dois por exemplo, ou dar um update mudando
>> as informações para ccc | ddd.
>>
>> Já vi o uso do ROW_NUMBER () OVER (ORDER BY id), porém só achei exemplos
>> que funcionasse com o SELECT.
>>
>> Já tentei:
>>
>> UPDATE minha_tabela SET col_a = 'ccc', col_b = 'ddd' where col_a = 'aaa'
>> and col_b = 'bbb' and ROW_NUMBER () OVER (ORDER BY id) = 2;
>>
>> Porém dá: ERROR:  cannot use window function in UPDATE
>>
>> Alguém teria uma solução?
>>
> Tente com uma CTE:
>
> WITH results_to_delete AS
> ( SELECT max(id) AS id_to_delete,  col_a, col_b FROM sua_tabela HAVING
> count(id) > 1 GROUP BY 2, 3)
> DELETE FROM sua_tabela USING results_to_delete WHERE id = id_to_delete;
>
> Note que não testei isto, então, pode ter erro de sintaxe ou mesmo de
> semântica se não entendi bem seu problema.
> Teste antes numa cópia do banco de dados ou da tabela, ou utilise uma
> transação para que possa fazer rollback em caso de erro.
>
> []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

Re: [pgbr-geral] Delete ou Update em dois registros identicos

2017-10-16 Por tôpico Flavio Henrique Araque Gurgel
Em seg, 16 de out de 2017 às 17:14, Flavio Henrique Araque Gurgel <
fha...@gmail.com> escreveu:

> Em seg, 16 de out de 2017 às 17:03, Edelson Regis de Lima <
> edre...@gmail.com> escreveu:
>
>> Olá pessoal.
>>
>> To com um problema que não sei se tem solução...
>>
>> Tem um cliente que tem um banco de dados com uma tabela com dois
>> registros identicos, e preciso dar um update ou um delete em um dos
>> registros, porém como todos os campos são iguais, ainda não achei uma
>> solução.
>>
>> Exmplo: tenho a minha_tabela, com as colunas col_a e col_b. Nessa tabela
>> tem dois registros identicos:
>>
>> col_a | col_B
>>
>> aaa | bbb
>>
>> aaa | bbb
>>
>> Eu gostaria de apagar a linha dois por exemplo, ou dar um update mudando
>> as informações para ccc | ddd.
>>
>> Já vi o uso do ROW_NUMBER () OVER (ORDER BY id), porém só achei exemplos
>> que funcionasse com o SELECT.
>>
>> Já tentei:
>>
>> UPDATE minha_tabela SET col_a = 'ccc', col_b = 'ddd' where col_a = 'aaa'
>> and col_b = 'bbb' and ROW_NUMBER () OVER (ORDER BY id) = 2;
>>
>> Porém dá: ERROR:  cannot use window function in UPDATE
>>
>> Alguém teria uma solução?
>>
> Tente com uma CTE:
>
> WITH results_to_delete AS
> ( SELECT max(id) AS id_to_delete,  col_a, col_b FROM sua_tabela HAVING
> count(id) > 1 GROUP BY 2, 3)
> DELETE FROM sua_tabela USING results_to_delete WHERE id = id_to_delete;
>

Esqueci de dizer, você pode mudar a parte do DELETE para UPDATE se
preferir, tente re-escrever com a lógica que deseja.

[]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] Delete ou Update em dois registros identicos

2017-10-16 Por tôpico Flavio Henrique Araque Gurgel
Em seg, 16 de out de 2017 às 17:03, Edelson Regis de Lima 
escreveu:

> Olá pessoal.
>
> To com um problema que não sei se tem solução...
>
> Tem um cliente que tem um banco de dados com uma tabela com dois registros
> identicos, e preciso dar um update ou um delete em um dos registros, porém
> como todos os campos são iguais, ainda não achei uma solução.
>
> Exmplo: tenho a minha_tabela, com as colunas col_a e col_b. Nessa tabela
> tem dois registros identicos:
>
> col_a | col_B
>
> aaa | bbb
>
> aaa | bbb
>
> Eu gostaria de apagar a linha dois por exemplo, ou dar um update mudando
> as informações para ccc | ddd.
>
> Já vi o uso do ROW_NUMBER () OVER (ORDER BY id), porém só achei exemplos
> que funcionasse com o SELECT.
>
> Já tentei:
>
> UPDATE minha_tabela SET col_a = 'ccc', col_b = 'ddd' where col_a = 'aaa'
> and col_b = 'bbb' and ROW_NUMBER () OVER (ORDER BY id) = 2;
>
> Porém dá: ERROR:  cannot use window function in UPDATE
>
> Alguém teria uma solução?
>
Tente com uma CTE:

WITH results_to_delete AS
( SELECT max(id) AS id_to_delete,  col_a, col_b FROM sua_tabela HAVING
count(id) > 1 GROUP BY 2, 3)
DELETE FROM sua_tabela USING results_to_delete WHERE id = id_to_delete;

Note que não testei isto, então, pode ter erro de sintaxe ou mesmo de
semântica se não entendi bem seu problema.
Teste antes numa cópia do banco de dados ou da tabela, ou utilise uma
transação para que possa fazer rollback em caso de erro.

[]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] Delete ou Update em dois registros identicos

2017-10-16 Por tôpico Edelson Regis de Lima
Olá pessoal.

To com um problema que não sei se tem solução...

Tem um cliente que tem um banco de dados com uma tabela com dois registros
identicos, e preciso dar um update ou um delete em um dos registros, porém
como todos os campos são iguais, ainda não achei uma solução.

Exmplo: tenho a minha_tabela, com as colunas col_a e col_b. Nessa tabela
tem dois registros identicos:

col_a | col_B

aaa | bbb

aaa | bbb

Eu gostaria de apagar a linha dois por exemplo, ou dar um update mudando as
informações para ccc | ddd.

Já vi o uso do ROW_NUMBER () OVER (ORDER BY id), porém só achei exemplos
que funcionasse com o SELECT.

Já tentei:

UPDATE minha_tabela SET col_a = 'ccc', col_b = 'ddd' where col_a = 'aaa'
and col_b = 'bbb' and ROW_NUMBER () OVER (ORDER BY id) = 2;

Porém dá: ERROR:  cannot use window function in UPDATE

Alguém teria uma solução?

Agradeço desde já!

-- 
*Edelson Regis de Lima*
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

[pgbr-geral] Delete demorado

2011-05-18 Por tôpico Cesar Pedroso
Boa tarde a todos,

Estou fazendo uma limpeza em uma tabela e são 200k de registros para serem
apagados.

Acredito que por causa da PK esses deletes estam demorando muito acredito
que é pelo fato dele atualizar o index. Quando dropei a PK ele executou
quase instantaneo.

Existe uma maneira de eu fazer esse delete de forma mais rapida sem eu ter
que apagar a PK por exemplo atualizando o index somente no final.

Desde ja agradeço a ajuda.

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


Re: [pgbr-geral] Delete demorado

2011-05-18 Por tôpico Flavio Henrique Araque Gurgel
Em 18 de maio de 2011 16:13, Cesar Pedroso cesar.cs...@gmail.com escreveu:
 Boa tarde a todos,

 Estou fazendo uma limpeza em uma tabela e são 200k de registros para serem
 apagados.

 Acredito que por causa da PK esses deletes estam demorando muito acredito
 que é pelo fato dele atualizar o index. Quando dropei a PK ele executou
 quase instantaneo.

 Existe uma maneira de eu fazer esse delete de forma mais rapida sem eu ter
 que apagar a PK por exemplo atualizando o index somente no final.

 Desde ja agradeço a ajuda.

Você está limpando a tabela toda (zerando todas as linhas)?
Se sim, use o TRUNCATE.
O DELETE tem certa demora por causa dos mecanismos de MVCC e Write
Ahead Logging.

[]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] Delete demorado

2011-05-18 Por tôpico Osvaldo Kussama
Em 18/05/11, Cesar Pedrosocesar.cs...@gmail.com escreveu:
 Boa tarde a todos,

 Estou fazendo uma limpeza em uma tabela e são 200k de registros para serem
 apagados.

 Acredito que por causa da PK esses deletes estam demorando muito acredito
 que é pelo fato dele atualizar o index. Quando dropei a PK ele executou
 quase instantaneo.

 Existe uma maneira de eu fazer esse delete de forma mais rapida sem eu ter
 que apagar a PK por exemplo atualizando o index somente no final.

 Desde ja agradeço a ajuda.



Leia este post do Fábio Telles:
http://www.midstorm.org/~telles/2007/11/29/nao-use-delete-use-insert/

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


Re: [pgbr-geral] Delete demorado

2011-05-18 Por tôpico Cesar Pedroso
Opa Flavio não estou apagando todos os registros da tabelas, realmente seria
mais facil dar um Truncate.

Então Osvaldo pelo que entendi do post uma solução seria criar uma tabela
temporaria, mas se for criar uma tabela temporaria para mandar os registros
para la e depois apagar a outra tabela é mais facil eu apagar a PK dar o
delete e depois recriar a PK, menos trabalho.

Realmente queria uma solucação que nao tivesse que alterar a estrutura do
banco.

Obrigado pela ajuda

2011/5/18 Osvaldo Kussama osvaldo.kuss...@gmail.com

 Em 18/05/11, Cesar Pedrosocesar.cs...@gmail.com escreveu:
  Boa tarde a todos,
 
  Estou fazendo uma limpeza em uma tabela e são 200k de registros para
 serem
  apagados.
 
  Acredito que por causa da PK esses deletes estam demorando muito acredito
  que é pelo fato dele atualizar o index. Quando dropei a PK ele executou
  quase instantaneo.
 
  Existe uma maneira de eu fazer esse delete de forma mais rapida sem eu
 ter
  que apagar a PK por exemplo atualizando o index somente no final.
 
  Desde ja agradeço a ajuda.
 


 Leia este post do Fábio Telles:
 http://www.midstorm.org/~telles/2007/11/29/nao-use-delete-use-insert/

 Osvaldo
 ___
 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] Delete é muito lento

2011-01-27 Por tôpico sergio santos
Pessoal
Estive procurando pela lista sobre Delete muito lento e encontrei um
artigo do Fábio Telles Rodriguez em:
http://www.midstorm.org/~telles/2007/11/29/nao-use-delete-use-insert/
Também vi que já aconteceu uma grande discussão sobre este assunto em:
http://www.mail-archive.com/pgbr-geral@listas.postgresql.org.br/msg04746.html

No entanto, depois de ler tudo isso, não consegui fazer com que o meu
comando

DELETE FROM Esquema.TABELA1  WHERE CAMPO2 IN(
SELECT CAMPO2 from Esquema.TABELA1
WHERE CAMPO1 = 'D_E_L'
LIMIT 3
);

se torne viável.

A consulta se refere a uma tabela de 1.352.996 registros e pelo menos 6
FOREIGN KEY.

Não posso simplesmente dar um TRUNCATE na TABELA1 uma vez que é uma tabela
em produção.
Não posso também deletar as FOREIGN KEY e depois habilitá-las novamente,
pois acho isso muito arriscado, a tabela é muito importante aqui na empresa.

Alguém tem alguma dica de como melhorar a performance em um DELETE ?

O Query Plan segue abaixo

Nested Loop  (cost=54559.52..55425.84 rows=200 width=6)
  -  HashAggregate  (cost=54559.52..54561.52 rows=200 width=4)
-  Limit  (cost=0.00..54184.52 rows=3 width=4)
  -  Seq Scan on TABELA1  (cost=0.00..69348.96 rows=38396
width=4)
Filter: ((CAMPO1)::text = 'D_E_L'::text)
  -  Index Scan using pedido_pkey on pedido  (cost=0.00..4.31 rows=1
width=10)
Index Cond: (Esquema.TABELA1.CAMPO2 = Esquema.TABELA1.CAMPO2)


Obrigado


Sérgio Antônio dos Santos
Bacharel em Sistemas de Informação

Cel: (31) 8601-5207
Residencia: (31) 3885-2346
site: http://www.clientside.com.br
Twitter: @serginhosant
Linkedin: http://br.linkedin.com/in/serginhosant
Delicious: http://www.delicious.com/serginhosant
Fotos: http://picasaweb.google.com/sergio.serginhosant


---
“Rogo a Deus como se esperasse tudo d’Ele, mas trabalho como se esperasse
tudo de mim” S.Tomás de Aquino
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Delete é muito lento

2011-01-27 Por tôpico Fábio Gibon - Comex System
Sérgio,
  se você quer deletar de 30 em 30mil, então o limit está no local 
incorreto. Este seu comando não é o mesmo que:

DELETE FROM Esquema.TABELA1  
WHERE  CAMPO1 = 'D_E_L'

// no máximo com um and campo2 is not null)

???

sds
Fábio Gibon


  - Original Message - 
  From: sergio santos 
  To: pgbr-geral@listas.postgresql.org.br 
  Sent: Thursday, January 27, 2011 1:32 PM
  Subject: [pgbr-geral] Delete é muito lento


  Pessoal
  Estive procurando pela lista sobre Delete muito lento e encontrei um artigo 
do Fábio Telles Rodriguez em: 
http://www.midstorm.org/~telles/2007/11/29/nao-use-delete-use-insert/
  Também vi que já aconteceu uma grande discussão sobre este assunto em: 
http://www.mail-archive.com/pgbr-geral@listas.postgresql.org.br/msg04746.html

  No entanto, depois de ler tudo isso, não consegui fazer com que o meu comando

  DELETE FROM Esquema.TABELA1  WHERE CAMPO2 IN(
  SELECT CAMPO2 from Esquema.TABELA1
  WHERE CAMPO1 = 'D_E_L'
  LIMIT 3
  );

  se torne viável. 

  A consulta se refere a uma tabela de 1.352.996 registros e pelo menos 6 
FOREIGN KEY.

  Não posso simplesmente dar um TRUNCATE na TABELA1 uma vez que é uma tabela em 
produção.
  Não posso também deletar as FOREIGN KEY e depois habilitá-las novamente, pois 
acho isso muito arriscado, a tabela é muito importante aqui na empresa.

  Alguém tem alguma dica de como melhorar a performance em um DELETE ?

  O Query Plan segue abaixo

  Nested Loop  (cost=54559.52..55425.84 rows=200 width=6)
-  HashAggregate  (cost=54559.52..54561.52 rows=200 width=4)
  -  Limit  (cost=0.00..54184.52 rows=3 width=4)
-  Seq Scan on TABELA1  (cost=0.00..69348.96 rows=38396 
width=4)
  Filter: ((CAMPO1)::text = 'D_E_L'::text)
-  Index Scan using pedido_pkey on pedido  (cost=0.00..4.31 rows=1 
width=10)
  Index Cond: (Esquema.TABELA1.CAMPO2 = Esquema.TABELA1.CAMPO2)


  Obrigado

  
  Sérgio Antônio dos Santos
  Bacharel em Sistemas de Informação

  Cel: (31) 8601-5207
  Residencia: (31) 3885-2346
  site: http://www.clientside.com.br
  Twitter: @serginhosant
  Linkedin: http://br.linkedin.com/in/serginhosant
  Delicious: http://www.delicious.com/serginhosant
  Fotos: http://picasaweb.google.com/sergio.serginhosant


  ---
  “Rogo a Deus como se esperasse tudo d’Ele, mas trabalho como se esperasse 
tudo de mim” S.Tomás de Aquino



--


  ___
  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


Re: [pgbr-geral] Delete é muito lento

2011-01-27 Por tôpico Fabrízio de Royes Mello
Em 27 de janeiro de 2011 14:32, sergio santos sergio.serginhos...@gmail.com
 escreveu:


 DELETE FROM Esquema.TABELA1  WHERE CAMPO2 IN(
 SELECT CAMPO2 from Esquema.TABELA1
 WHERE CAMPO1 = 'D_E_L'
 LIMIT 3
 );



Não sei se entendi muito bem, mas vc esta tentando excluir os registros da
tabela fazendo uma consulta na própria tabela??? Será que isso é
necessário???

Vc não poderia simplesmente:

DELETE FROM Esquema.TABELA1  WHERE CAMPO1 = 'D_E_L' ;


E pelo que vi o Pg esta fazendo um seqscan com esse 'CAMPO1', não está
faltando um indice para ele ?


-- 
Fabrízio de Royes Mello
 Blog sobre TI: http://fabriziomello.blogspot.com
 Perfil Linkedin: http://br.linkedin.com/in/fabriziomello
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Delete é muito lento

2011-01-27 Por tôpico Fernando N. Rodrigues
Talvez possa resolver isso na aplicação.
Monte um script que gere um processo de remoção, passe parâmetros e
deixo-o fazendo este trabalho.

Fernando



Em 27 de janeiro de 2011 14:32, sergio santos
sergio.serginhos...@gmail.com escreveu:
 Pessoal
 Estive procurando pela lista sobre Delete muito lento e encontrei um
 artigo do Fábio Telles Rodriguez em:
 http://www.midstorm.org/~telles/2007/11/29/nao-use-delete-use-insert/
 Também vi que já aconteceu uma grande discussão sobre este assunto em:
 http://www.mail-archive.com/pgbr-geral@listas.postgresql.org.br/msg04746.html

 No entanto, depois de ler tudo isso, não consegui fazer com que o meu
 comando

 DELETE FROM Esquema.TABELA1  WHERE CAMPO2 IN(
     SELECT CAMPO2 from Esquema.TABELA1
     WHERE CAMPO1 = 'D_E_L'
     LIMIT 3
 );

 se torne viável.

 A consulta se refere a uma tabela de 1.352.996 registros e pelo menos 6
 FOREIGN KEY.

 Não posso simplesmente dar um TRUNCATE na TABELA1 uma vez que é uma tabela
 em produção.
 Não posso também deletar as FOREIGN KEY e depois habilitá-las novamente,
 pois acho isso muito arriscado, a tabela é muito importante aqui na empresa.

 Alguém tem alguma dica de como melhorar a performance em um DELETE ?

 O Query Plan segue abaixo

 Nested Loop  (cost=54559.52..55425.84 rows=200 width=6)
   -  HashAggregate  (cost=54559.52..54561.52 rows=200 width=4)
     -  Limit  (cost=0.00..54184.52 rows=3 width=4)
   -  Seq Scan on TABELA1  (cost=0.00..69348.96 rows=38396
 width=4)
     Filter: ((CAMPO1)::text = 'D_E_L'::text)
   -  Index Scan using pedido_pkey on pedido  (cost=0.00..4.31 rows=1
 width=10)
     Index Cond: (Esquema.TABELA1.CAMPO2 = Esquema.TABELA1.CAMPO2)


 Obrigado

 
 Sérgio Antônio dos Santos
 Bacharel em Sistemas de Informação

 Cel: (31) 8601-5207
 Residencia: (31) 3885-2346
 site: http://www.clientside.com.br
 Twitter: @serginhosant
 Linkedin: http://br.linkedin.com/in/serginhosant
 Delicious: http://www.delicious.com/serginhosant
 Fotos: http://picasaweb.google.com/sergio.serginhosant


 ---
 “Rogo a Deus como se esperasse tudo d’Ele, mas trabalho como se esperasse
 tudo de mim” S.Tomás de Aquino

 ___
 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


Re: [pgbr-geral] Delete é muito lento

2011-01-27 Por tôpico Fernando N. Rodrigues
Percebi nesta sua query, que não existe uma tabela 2, então pra quê
realizar IN SELECT (.)?



Em 27 de janeiro de 2011 14:32, sergio santos
sergio.serginhos...@gmail.com escreveu:
 Pessoal
 Estive procurando pela lista sobre Delete muito lento e encontrei um
 artigo do Fábio Telles Rodriguez em:
 http://www.midstorm.org/~telles/2007/11/29/nao-use-delete-use-insert/
 Também vi que já aconteceu uma grande discussão sobre este assunto em:
 http://www.mail-archive.com/pgbr-geral@listas.postgresql.org.br/msg04746.html

 No entanto, depois de ler tudo isso, não consegui fazer com que o meu
 comando

 DELETE FROM Esquema.TABELA1  WHERE CAMPO2 IN(
     SELECT CAMPO2 from Esquema.TABELA1
     WHERE CAMPO1 = 'D_E_L'
     LIMIT 3
 );

 se torne viável.

 A consulta se refere a uma tabela de 1.352.996 registros e pelo menos 6
 FOREIGN KEY.

 Não posso simplesmente dar um TRUNCATE na TABELA1 uma vez que é uma tabela
 em produção.
 Não posso também deletar as FOREIGN KEY e depois habilitá-las novamente,
 pois acho isso muito arriscado, a tabela é muito importante aqui na empresa.

 Alguém tem alguma dica de como melhorar a performance em um DELETE ?

 O Query Plan segue abaixo

 Nested Loop  (cost=54559.52..55425.84 rows=200 width=6)
   -  HashAggregate  (cost=54559.52..54561.52 rows=200 width=4)
     -  Limit  (cost=0.00..54184.52 rows=3 width=4)
   -  Seq Scan on TABELA1  (cost=0.00..69348.96 rows=38396
 width=4)
     Filter: ((CAMPO1)::text = 'D_E_L'::text)
   -  Index Scan using pedido_pkey on pedido  (cost=0.00..4.31 rows=1
 width=10)
     Index Cond: (Esquema.TABELA1.CAMPO2 = Esquema.TABELA1.CAMPO2)


 Obrigado

 
 Sérgio Antônio dos Santos
 Bacharel em Sistemas de Informação

 Cel: (31) 8601-5207
 Residencia: (31) 3885-2346
 site: http://www.clientside.com.br
 Twitter: @serginhosant
 Linkedin: http://br.linkedin.com/in/serginhosant
 Delicious: http://www.delicious.com/serginhosant
 Fotos: http://picasaweb.google.com/sergio.serginhosant


 ---
 “Rogo a Deus como se esperasse tudo d’Ele, mas trabalho como se esperasse
 tudo de mim” S.Tomás de Aquino

 ___
 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


Re: [pgbr-geral] Delete é muito lento

2011-01-27 Por tôpico sergio santos
Eu fiz um IN SELECT por causa do LIMIT para ele não percorrer a tabela
inteira. Eu estou fazendo um limite de 3 numa tentativa de deixar o
DELETE mais rápido pois se fosse para excluir todos os registros mesmo seria
uns 8 mil e na minha opinião ficaria muito mais lendo.

Sérgio Antônio dos Santos
Bacharel em Sistemas de Informação

Cel: (31) 8601-5207
Residencia: (31) 3885-2346
site: http://www.clientside.com.br
Twitter: @serginhosant
Linkedin: http://br.linkedin.com/in/serginhosant
Delicious: http://www.delicious.com/serginhosant
Fotos: http://picasaweb.google.com/sergio.serginhosant


---
“Rogo a Deus como se esperasse tudo d’Ele, mas trabalho como se esperasse
tudo de mim” S.Tomás de Aquino


Em 27 de janeiro de 2011 14:55, Fernando N. Rodrigues 
fernandonon...@gmail.com escreveu:

 Percebi nesta sua query, que não existe uma tabela 2, então pra quê
 realizar IN SELECT (.)?



 Em 27 de janeiro de 2011 14:32, sergio santos
 sergio.serginhos...@gmail.com escreveu:
  Pessoal
  Estive procurando pela lista sobre Delete muito lento e encontrei um
  artigo do Fábio Telles Rodriguez em:
  http://www.midstorm.org/~telles/2007/11/29/nao-use-delete-use-insert/http://www.midstorm.org/%7Etelles/2007/11/29/nao-use-delete-use-insert/
  Também vi que já aconteceu uma grande discussão sobre este assunto em:
 
 http://www.mail-archive.com/pgbr-geral@listas.postgresql.org.br/msg04746.html
 
  No entanto, depois de ler tudo isso, não consegui fazer com que o meu
  comando
 
  DELETE FROM Esquema.TABELA1  WHERE CAMPO2 IN(
  SELECT CAMPO2 from Esquema.TABELA1
  WHERE CAMPO1 = 'D_E_L'
  LIMIT 3
  );
 
  se torne viável.
 
  A consulta se refere a uma tabela de 1.352.996 registros e pelo menos 6
  FOREIGN KEY.
 
  Não posso simplesmente dar um TRUNCATE na TABELA1 uma vez que é uma
 tabela
  em produção.
  Não posso também deletar as FOREIGN KEY e depois habilitá-las novamente,
  pois acho isso muito arriscado, a tabela é muito importante aqui na
 empresa.
 
  Alguém tem alguma dica de como melhorar a performance em um DELETE ?
 
  O Query Plan segue abaixo
 
  Nested Loop  (cost=54559.52..55425.84 rows=200 width=6)
-  HashAggregate  (cost=54559.52..54561.52 rows=200 width=4)
  -  Limit  (cost=0.00..54184.52 rows=3 width=4)
-  Seq Scan on TABELA1  (cost=0.00..69348.96 rows=38396
  width=4)
  Filter: ((CAMPO1)::text = 'D_E_L'::text)
-  Index Scan using pedido_pkey on pedido  (cost=0.00..4.31 rows=1
  width=10)
  Index Cond: (Esquema.TABELA1.CAMPO2 = Esquema.TABELA1.CAMPO2)
 
 
  Obrigado
 
  
  Sérgio Antônio dos Santos
  Bacharel em Sistemas de Informação
 
  Cel: (31) 8601-5207
  Residencia: (31) 3885-2346
  site: http://www.clientside.com.br
  Twitter: @serginhosant
  Linkedin: http://br.linkedin.com/in/serginhosant
  Delicious: http://www.delicious.com/serginhosant
  Fotos: http://picasaweb.google.com/sergio.serginhosant
 
 
  ---
  “Rogo a Deus como se esperasse tudo d’Ele, mas trabalho como se esperasse
  tudo de mim” S.Tomás de Aquino
 
  ___
  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 mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Delete é muito lento

2011-01-27 Por tôpico sergio santos
Existe um índice para esta tabela que é justamente a data de cadastro. Posso
tentar mudar para:

DELETE FROM Esquema.TABELA1  WHERE CAMPO2 IN(
SELECT CAMPO2 from Esquema.TABELA1
WHERE CAMPO1 = 'D_E_L'
AND datahora BETWEEN '2011/01/01' AND '2011/01/27 23:59:'
LIMIT 3
);

acho que melhorar um pouco pois assim vai usar um índice, veja:

Nested Loop  (cost=11074.07..12757.22 rows=200 width=6)
  -  HashAggregate  (cost=11074.07..11076.07 rows=200 width=4)
-  Limit  (cost=0.00..11070.32 rows=300 width=4)
  -  Index Scan using idx_TABELA1_datahora on TABELA1
(cost=0.00..30959.99 rows=839 width=4)
Index Cond: ((datahora = '2011-01-01
00:00:00'::timestamp without time zone) AND (datahora = '2011-01-27
23:59:00'::timestamp without time zone))
Filter: ((CAMPO1)::text = 'D_E_L'::text)
  -  Index Scan using TABELA1_pkey on TABELA1  (cost=0.00..8.39 rows=1
width=10)
Index Cond: (Esquema.TABELA1.CAMPO2 = Esquema.TABELA1.CAMPO2)


Sérgio Antônio dos Santos
Bacharel em Sistemas de Informação

Cel: (31) 8601-5207
Residencia: (31) 3885-2346
site: http://www.clientside.com.br
Twitter: @serginhosant
Linkedin: http://br.linkedin.com/in/serginhosant
Delicious: http://www.delicious.com/serginhosant
Fotos: http://picasaweb.google.com/sergio.serginhosant


---
“Rogo a Deus como se esperasse tudo d’Ele, mas trabalho como se esperasse
tudo de mim” S.Tomás de Aquino


Em 27 de janeiro de 2011 14:52, Fabrízio de Royes Mello 
fabriziome...@gmail.com escreveu:



 Em 27 de janeiro de 2011 14:32, sergio santos 
 sergio.serginhos...@gmail.com escreveu:


 DELETE FROM Esquema.TABELA1  WHERE CAMPO2 IN(
 SELECT CAMPO2 from Esquema.TABELA1
 WHERE CAMPO1 = 'D_E_L'
 LIMIT 3
 );



 Não sei se entendi muito bem, mas vc esta tentando excluir os registros da
 tabela fazendo uma consulta na própria tabela??? Será que isso é
 necessário???

 Vc não poderia simplesmente:

 DELETE FROM Esquema.TABELA1  WHERE CAMPO1 = 'D_E_L' ;


 E pelo que vi o Pg esta fazendo um seqscan com esse 'CAMPO1', não está
 faltando um indice para ele ?


 --
 Fabrízio de Royes Mello
  Blog sobre TI: http://fabriziomello.blogspot.com
  Perfil Linkedin: http://br.linkedin.com/in/fabriziomello


 ___
 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


Re: [pgbr-geral] Delete é muito lento

2011-01-27 Por tôpico Fabrízio de Royes Mello
Em 27 de janeiro de 2011 15:21, sergio santos sergio.serginhos...@gmail.com
 escreveu:

 Existe um índice para esta tabela que é justamente a data de cadastro.
 Posso tentar mudar para:


 DELETE FROM Esquema.TABELA1  WHERE CAMPO2 IN(
 SELECT CAMPO2 from Esquema.TABELA1
 WHERE CAMPO1 = 'D_E_L'
 AND datahora BETWEEN '2011/01/01' AND '2011/01/27 23:59:'
 LIMIT 3
 );


O teu plano melhorou, mas vc nao pensou em criar um indice pelo campo
'CAMPO1' ??? Creio que assim vc poderia rodar um DELETE direto na tabela...
ou tb fazer um pouco diferente:

DELETE FROM Esquema.TABELA1 WHERE EXISTS (SELECT 1 FROM Esquema.TABELA1 x
WHERE x.CAMPO2 = TABELA1.CAMPO2 AND x.CAMPO1 = 'D_E_L' AND datahora BETWEEN
'2011/01/01' AND '2011/01/27 23:59:');


-- 
Fabrízio de Royes Mello
 Blog sobre TI: http://fabriziomello.blogspot.com
 Perfil Linkedin: http://br.linkedin.com/in/fabriziomello
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Delete é muito lento

2011-01-27 Por tôpico luiz
Buenas

tente

Create index  on TABELA1 (campo,datahora);
analyze tabela1;
explain  DELETE FROM Esquema.TABELA1  WHERE CAMPO2 IN(
 SELECT CAMPO2 from Esquema.TABELA1
 WHERE CAMPO1 = 'D_E_L'
 AND datahora BETWEEN '2011/01/01' AND '2011/01/27 23:59:'

mostre ai o plano gerado

[]s
Luiz

 Existe um índice para esta tabela que é justamente a data de cadastro.
 Posso
 tentar mudar para:

 DELETE FROM Esquema.TABELA1  WHERE CAMPO2 IN(
 SELECT CAMPO2 from Esquema.TABELA1
 WHERE CAMPO1 = 'D_E_L'
 AND datahora BETWEEN '2011/01/01' AND '2011/01/27 23:59:'
 LIMIT 3
 );

 acho que melhorar um pouco pois assim vai usar um índice, veja:

 Nested Loop  (cost=11074.07..12757.22 rows=200 width=6)
   -  HashAggregate  (cost=11074.07..11076.07 rows=200 width=4)
 -  Limit  (cost=0.00..11070.32 rows=300 width=4)
   -  Index Scan using idx_TABELA1_datahora on TABELA1
 (cost=0.00..30959.99 rows=839 width=4)
 Index Cond: ((datahora = '2011-01-01
 00:00:00'::timestamp without time zone) AND (datahora = '2011-01-27
 23:59:00'::timestamp without time zone))
 Filter: ((CAMPO1)::text = 'D_E_L'::text)
   -  Index Scan using TABELA1_pkey on TABELA1  (cost=0.00..8.39 rows=1
 width=10)
 Index Cond: (Esquema.TABELA1.CAMPO2 = Esquema.TABELA1.CAMPO2)


 Sérgio Antônio dos Santos
 Bacharel em Sistemas de Informação

 Cel: (31) 8601-5207
 Residencia: (31) 3885-2346
 site: http://www.clientside.com.br
 Twitter: @serginhosant
 Linkedin: http://br.linkedin.com/in/serginhosant
 Delicious: http://www.delicious.com/serginhosant
 Fotos: http://picasaweb.google.com/sergio.serginhosant


 ---
 “Rogo a Deus como se esperasse tudo d’Ele, mas trabalho como se esperasse
 tudo de mim” S.Tomás de Aquino


 Em 27 de janeiro de 2011 14:52, Fabrízio de Royes Mello 
 fabriziome...@gmail.com escreveu:



 Em 27 de janeiro de 2011 14:32, sergio santos 
 sergio.serginhos...@gmail.com escreveu:


 DELETE FROM Esquema.TABELA1  WHERE CAMPO2 IN(
 SELECT CAMPO2 from Esquema.TABELA1
 WHERE CAMPO1 = 'D_E_L'
 LIMIT 3
 );



 Não sei se entendi muito bem, mas vc esta tentando excluir os registros
 da
 tabela fazendo uma consulta na própria tabela??? Será que isso é
 necessário???

 Vc não poderia simplesmente:

 DELETE FROM Esquema.TABELA1  WHERE CAMPO1 = 'D_E_L' ;


 E pelo que vi o Pg esta fazendo um seqscan com esse 'CAMPO1', não está
 faltando um indice para ele ?


 --
 Fabrízio de Royes Mello
  Blog sobre TI: http://fabriziomello.blogspot.com
  Perfil Linkedin: http://br.linkedin.com/in/fabriziomello


 ___
 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 mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Delete *

2010-07-29 Por tôpico Johnny Chaves
Em Quinta-feira 22 Julho 2010, às 13:32:58, JotaComm escreveu:
 Olá,
 
 Em 22 de julho de 2010 13:21, Vinicius Marconi Vasconcelos Berni 
 
 vinicius.marc...@gmail.com escreveu:
  Quero garantir que não aconteça nas duas situações.
 
 Pela aplicação você garante usando a função que comentei no email anterior.
 Quanto ao acesso direto ao banco o usuário não deveria ter privilégio de
 acesso direto e se tiver deveria no meu modo de ver apenas de SELECT. O
 único que deveria ter os privilégios de UPDATE, INSERT e DELETE deveria ser
 o administrador.

Isso, isso, isso...
Mas como não vivemos num mundo ideal, as pessoas têm motivos para fazer as 
coisas da forma não ideal, seguindo essa rota, talvez um gatilho, que seria 
a prova até administradores às 03:30h da madrugada.

 
  Em 22 de julho de 2010 11:38, JotaComm jota.c...@gmail.com escreveu:
  
  Olá,
  
  Em 22 de julho de 2010 11:25, Candido Vieira da Silva Neto cvieira.br@
  
  gmail.com escreveu:
  Vinicius, existe o controle de transacoes para evitar 'acidentes'.
  BEGIN e COMMIT/SAVEPOINT/ROLLBACK
  
  On 7/22/10, Vinicius Marconi Vasconcelos Berni
  
  vinicius.marc...@gmail.com wrote:
   Não permitir que seja executado delete na base de dados sem fornecer
   clausula where,  quero fazer isto para evitar 'acidentes'.
   
   Ex.: delete from pessoa -  Esta query não deve ser permitida.
   
  delete from pessoa where id=2 - Esta será permitida
  
  Uma pergunta. As exclusões serão feitas pela aplicação ou o usuário pode
  ir manualmente na base e executar um comando delete em qualquer tabela?
  
  Que tal criar uma função simples para fazer a deleção dos usuários se
  este procedimento for executado pela aplicação, com por exemplo:
  
  CREATE OR REPLACE FUNCTION exclusao(INTEGER)
  
  RETURNS BOOLEAN AS $$
  
  BEGIN
  
  DELETE FROM tabela WHERE campo_chave=$1;
  
  IF FOUND THEN
  
  RAISE NOTICE 'O registro % foi excluido.',$1;
  
  RETURN TRUE;
  
  END IF;
  
  RAISE NOTICE 'O registro % não foi encontrado.',$1;
  
  RETURN FALSE;
  
  END;
  
  $$ LANGUAGE PLPGSQL RETURNS NULL ON NULL INPUT;
  
   Em 22 de julho de 2010 11:12, JotaComm jota.c...@gmail.com escreveu:
   Olá,
   
   Em 22 de julho de 2010 09:31, Vinicius Marconi Vasconcelos Berni 
   
   vinicius.marc...@gmail.com escreveu:
   Olá.
   
   Existe uma maneira de restringir 'delete' sem cláusula 'where' ?
   
   Como assim? O que exatamente você deseja?
   
   Desde já agradeço. No aguardo.
   
   --
   
   Ass.:
 Vinicius Marconi Vasconcelos  Berni
 
  51 - 96608087
  51 - 32482071
   
   ___
   pgbr-geral mailing list
   pgbr-geral@listas.postgresql.org.br
   https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-gera
   l
   
   []s
   --
   JotaComm
   http://jotacomm.wordpress.com
   
   ___
   pgbr-geral mailing list
   pgbr-geral@listas.postgresql.org.br
   https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
   
   --
   
   Ass.:
 Vinicius Marconi Vasconcelos  Berni
 
  51 - 96608087
  51 - 32482071
  
  ___
  pgbr-geral mailing list
  pgbr-geral@listas.postgresql.org.br
  https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
  
  []s
  --
  JotaComm
  http://jotacomm.wordpress.com
  
  ___
  pgbr-geral mailing list
  pgbr-geral@listas.postgresql.org.br
  https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
  
  --
  
  Ass.:
Vinicius Marconi Vasconcelos  Berni

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


Re: [pgbr-geral] Delete *

2010-07-28 Por tôpico poste9
Pelo que eu entendi a idéia é evitar erros do administrador mas tudo bem...

Em 22 de julho de 2010 13:32, JotaComm jota.c...@gmail.com escreveu:

 Olá,

 Em 22 de julho de 2010 13:21, Vinicius Marconi Vasconcelos Berni 
 vinicius.marc...@gmail.com escreveu:

 Quero garantir que não aconteça nas duas situações.


 Pela aplicação você garante usando a função que comentei no email anterior.
 Quanto ao acesso direto ao banco o usuário não deveria ter privilégio de
 acesso direto e se tiver deveria no meu modo de ver apenas de SELECT. O
 único que deveria ter os privilégios de UPDATE, INSERT e DELETE deveria ser
 o administrador.


 Em 22 de julho de 2010 11:38, JotaComm jota.c...@gmail.com escreveu:

 Olá,

 Em 22 de julho de 2010 11:25, Candido Vieira da Silva Neto cvieira.br@
 gmail.com escreveu:

 Vinicius, existe o controle de transacoes para evitar 'acidentes'.
 BEGIN e COMMIT/SAVEPOINT/ROLLBACK

 On 7/22/10, Vinicius Marconi Vasconcelos Berni
 vinicius.marc...@gmail.com wrote:
  Não permitir que seja executado delete na base de dados sem fornecer
  clausula where,  quero fazer isto para evitar 'acidentes'.
 
  Ex.: delete from pessoa -  Esta query não deve ser permitida.
 
 delete from pessoa where id=2 - Esta será permitida


 Uma pergunta. As exclusões serão feitas pela aplicação ou o usuário pode
 ir manualmente na base e executar um comando delete em qualquer tabela?

 Que tal criar uma função simples para fazer a deleção dos usuários se
 este procedimento for executado pela aplicação, com por exemplo:

 CREATE OR REPLACE FUNCTION exclusao(INTEGER)

 RETURNS BOOLEAN AS $$

 BEGIN

 DELETE FROM tabela WHERE campo_chave=$1;

 IF FOUND THEN

 RAISE NOTICE 'O registro % foi excluido.',$1;

 RETURN TRUE;

 END IF;

 RAISE NOTICE 'O registro % não foi encontrado.',$1;

 RETURN FALSE;

 END;

 $$ LANGUAGE PLPGSQL RETURNS NULL ON NULL INPUT;


  
 
 
  Em 22 de julho de 2010 11:12, JotaComm jota.c...@gmail.com
 escreveu:
 
  Olá,
 
  Em 22 de julho de 2010 09:31, Vinicius Marconi Vasconcelos Berni 
  vinicius.marc...@gmail.com escreveu:
 
  Olá.
 
  Existe uma maneira de restringir 'delete' sem cláusula 'where' ?
 
 
  Como assim? O que exatamente você deseja?
 
 
  Desde já agradeço. No aguardo.
 
  --
  Ass.:
Vinicius Marconi Vasconcelos  Berni
 51 - 96608087
 51 - 32482071
 
  ___
  pgbr-geral mailing list
  pgbr-geral@listas.postgresql.org.br
 
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
 
 
 
  []s
  --
  JotaComm
  http://jotacomm.wordpress.com
 
  ___
  pgbr-geral mailing list
  pgbr-geral@listas.postgresql.org.br
  https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
 
 
 
 
  --
  Ass.:
Vinicius Marconi Vasconcelos  Berni
 51 - 96608087
 51 - 32482071
 
 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral



 []s
 --
 JotaComm
 http://jotacomm.wordpress.com

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




 --
 Ass.:
   Vinicius Marconi Vasconcelos  Berni
51 - 96608087
51 - 32482071

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



 []s
 --
 JotaComm
 http://jotacomm.wordpress.com

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




-- 

Rafael Lúcio
http://www.hangarnet.com.br
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Delete *

2010-07-28 Por tôpico Emerson Hermann
/*
Gostei da dica da store function exclusao de JotaComm
Baseado nas mesma function incrementei algumas funcionalidades.
*/

DROP FUNCTION IF EXISTS public.exclusao(esquema_tabelax VARCHAR(255),
campox VARCHAR(255), idx INTEGER);
CREATE OR REPLACE FUNCTION public.exclusao(esquema_tabelax
VARCHAR(255), campox VARCHAR(255), idx INTEGER)
RETURNS BOOLEAN AS $$

DECLARE

  ds_comando   TEXT;
  deletado BIGINT;

BEGIN

 IF (esquema_tabelax IS NULL) THEN
  RAISE EXCEPTION 'ESQUEMA TABELA COM VALOR NULO!'; -- caso o
parametro venha nulo
 END IF;

 IF (campox IS NULL) THEN
  RAISE EXCEPTION 'CAMPO COM VALOR NULO!'; -- caso o parametro
venha nulo
 END IF;

 IF (idx IS NULL) THEN
  RAISE EXCEPTION 'ID COM VALOR NULO!'; -- caso o parametro venha nulo
 END IF;


 ds_comando := 'DELETE FROM ' || esquema_tabelax || ' WHERE '
|| campox || '=' || idx;

EXECUTE ds_comando;

GET DIAGNOSTICS deletado = ROW_COUNT;

IF deletado  0 THEN

RAISE NOTICE '%', ds_comando;
RAISE NOTICE 'Total de registro(s) deletado(s): %',deletado;
RETURN TRUE;

END IF;

 RAISE NOTICE '%', ds_comando;
 RAISE NOTICE 'Total de registro(s) deletado(s): %',deletado;
RAISE NOTICE 'O registro % não foi encontrado. NADA FOI 
DELETADO!!.',idx;
RETURN FALSE;

END;
$$ LANGUAGE 'plpgsql' RETURNS NULL ON NULL INPUT
;
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] Delete *

2010-07-22 Por tôpico Vinicius Marconi Vasconcelos Berni
Olá.

Existe uma maneira de restringir 'delete' sem cláusula 'where' ?

Desde já agradeço. No aguardo.

-- 
Ass.:
  Vinicius Marconi Vasconcelos  Berni
   51 - 96608087
   51 - 32482071
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Delete *

2010-07-22 Por tôpico André Pignata
Talvez uma rule em que você avalie a query passada, vendo se existe a
cláusula where... acho que funcionaria

Em 22 de julho de 2010 09:31, Vinicius Marconi Vasconcelos Berni 
vinicius.marc...@gmail.com escreveu:

 Olá.

 Existe uma maneira de restringir 'delete' sem cláusula 'where' ?

 Desde já agradeço. No aguardo.

 --
 Ass.:
   Vinicius Marconi Vasconcelos  Berni
51 - 96608087
51 - 32482071

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




-- 
André Luiz Martins Pignata
Integral Convênios Odontológicos
Gerente de TI
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Delete *

2010-07-22 Por tôpico JotaComm
Olá,

Em 22 de julho de 2010 09:31, Vinicius Marconi Vasconcelos Berni 
vinicius.marc...@gmail.com escreveu:

 Olá.

 Existe uma maneira de restringir 'delete' sem cláusula 'where' ?


Como assim? O que exatamente você deseja?


 Desde já agradeço. No aguardo.

 --
 Ass.:
   Vinicius Marconi Vasconcelos  Berni
51 - 96608087
51 - 32482071

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



[]s
-- 
JotaComm
http://jotacomm.wordpress.com
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Delete *

2010-07-22 Por tôpico Vinicius Marconi Vasconcelos Berni
Não permitir que seja executado delete na base de dados sem fornecer
clausula where,  quero fazer isto para evitar 'acidentes'.

Ex.: delete from pessoa -  Esta query não deve ser permitida.

   delete from pessoa where id=2 - Esta será permitida



Em 22 de julho de 2010 11:12, JotaComm jota.c...@gmail.com escreveu:

 Olá,

 Em 22 de julho de 2010 09:31, Vinicius Marconi Vasconcelos Berni 
 vinicius.marc...@gmail.com escreveu:

 Olá.

 Existe uma maneira de restringir 'delete' sem cláusula 'where' ?


 Como assim? O que exatamente você deseja?


 Desde já agradeço. No aguardo.

 --
 Ass.:
   Vinicius Marconi Vasconcelos  Berni
51 - 96608087
51 - 32482071

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



 []s
 --
 JotaComm
 http://jotacomm.wordpress.com

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




-- 
Ass.:
  Vinicius Marconi Vasconcelos  Berni
   51 - 96608087
   51 - 32482071
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Delete *

2010-07-22 Por tôpico Candido Vieira da Silva Neto
Vinicius, existe o controle de transacoes para evitar 'acidentes'.
BEGIN e COMMIT/SAVEPOINT/ROLLBACK

On 7/22/10, Vinicius Marconi Vasconcelos Berni
vinicius.marc...@gmail.com wrote:
 Não permitir que seja executado delete na base de dados sem fornecer
 clausula where,  quero fazer isto para evitar 'acidentes'.

 Ex.: delete from pessoa -  Esta query não deve ser permitida.

delete from pessoa where id=2 - Esta será permitida



 Em 22 de julho de 2010 11:12, JotaComm jota.c...@gmail.com escreveu:

 Olá,

 Em 22 de julho de 2010 09:31, Vinicius Marconi Vasconcelos Berni 
 vinicius.marc...@gmail.com escreveu:

 Olá.

 Existe uma maneira de restringir 'delete' sem cláusula 'where' ?


 Como assim? O que exatamente você deseja?


 Desde já agradeço. No aguardo.

 --
 Ass.:
   Vinicius Marconi Vasconcelos  Berni
51 - 96608087
51 - 32482071

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



 []s
 --
 JotaComm
 http://jotacomm.wordpress.com

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




 --
 Ass.:
   Vinicius Marconi Vasconcelos  Berni
51 - 96608087
51 - 32482071

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


Re: [pgbr-geral] Delete *

2010-07-22 Por tôpico Vinicius Marconi Vasconcelos Berni
Conheço transações, mas mesmo assim o erro pode ocorrer

Em 22 de julho de 2010 11:25, Candido Vieira da Silva Neto cvieira.br@
gmail.com escreveu:

 Vinicius, existe o controle de transacoes para evitar 'acidentes'.
 BEGIN e COMMIT/SAVEPOINT/ROLLBACK

 On 7/22/10, Vinicius Marconi Vasconcelos Berni
 vinicius.marc...@gmail.com wrote:
  Não permitir que seja executado delete na base de dados sem fornecer
  clausula where,  quero fazer isto para evitar 'acidentes'.
 
  Ex.: delete from pessoa -  Esta query não deve ser permitida.
 
 delete from pessoa where id=2 - Esta será permitida
 
 
 
  Em 22 de julho de 2010 11:12, JotaComm jota.c...@gmail.com escreveu:
 
  Olá,
 
  Em 22 de julho de 2010 09:31, Vinicius Marconi Vasconcelos Berni 
  vinicius.marc...@gmail.com escreveu:
 
  Olá.
 
  Existe uma maneira de restringir 'delete' sem cláusula 'where' ?
 
 
  Como assim? O que exatamente você deseja?
 
 
  Desde já agradeço. No aguardo.
 
  --
  Ass.:
Vinicius Marconi Vasconcelos  Berni
 51 - 96608087
 51 - 32482071
 
  ___
  pgbr-geral mailing list
  pgbr-geral@listas.postgresql.org.br
  https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
 
 
 
  []s
  --
  JotaComm
  http://jotacomm.wordpress.com
 
  ___
  pgbr-geral mailing list
  pgbr-geral@listas.postgresql.org.br
  https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
 
 
 
 
  --
  Ass.:
Vinicius Marconi Vasconcelos  Berni
 51 - 96608087
 51 - 32482071
 
 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral




-- 
Ass.:
  Vinicius Marconi Vasconcelos  Berni
   51 - 96608087
   51 - 32482071
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Delete *

2010-07-22 Por tôpico JotaComm
Olá,

Em 22 de julho de 2010 11:25, Candido Vieira da Silva Neto cvieira.br@
gmail.com escreveu:

 Vinicius, existe o controle de transacoes para evitar 'acidentes'.
 BEGIN e COMMIT/SAVEPOINT/ROLLBACK

 On 7/22/10, Vinicius Marconi Vasconcelos Berni
 vinicius.marc...@gmail.com wrote:
  Não permitir que seja executado delete na base de dados sem fornecer
  clausula where,  quero fazer isto para evitar 'acidentes'.
 
  Ex.: delete from pessoa -  Esta query não deve ser permitida.
 
 delete from pessoa where id=2 - Esta será permitida


Uma pergunta. As exclusões serão feitas pela aplicação ou o usuário pode ir
manualmente na base e executar um comando delete em qualquer tabela?

Que tal criar uma função simples para fazer a deleção dos usuários se este
procedimento for executado pela aplicação, com por exemplo:

CREATE OR REPLACE FUNCTION exclusao(INTEGER)

RETURNS BOOLEAN AS $$

BEGIN

DELETE FROM tabela WHERE campo_chave=$1;

IF FOUND THEN

RAISE NOTICE 'O registro % foi excluido.',$1;

RETURN TRUE;

END IF;

RAISE NOTICE 'O registro % não foi encontrado.',$1;

RETURN FALSE;

END;

$$ LANGUAGE PLPGSQL RETURNS NULL ON NULL INPUT;


 
 
 
  Em 22 de julho de 2010 11:12, JotaComm jota.c...@gmail.com escreveu:
 
  Olá,
 
  Em 22 de julho de 2010 09:31, Vinicius Marconi Vasconcelos Berni 
  vinicius.marc...@gmail.com escreveu:
 
  Olá.
 
  Existe uma maneira de restringir 'delete' sem cláusula 'where' ?
 
 
  Como assim? O que exatamente você deseja?
 
 
  Desde já agradeço. No aguardo.
 
  --
  Ass.:
Vinicius Marconi Vasconcelos  Berni
 51 - 96608087
 51 - 32482071
 
  ___
  pgbr-geral mailing list
  pgbr-geral@listas.postgresql.org.br
  https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
 
 
 
  []s
  --
  JotaComm
  http://jotacomm.wordpress.com
 
  ___
  pgbr-geral mailing list
  pgbr-geral@listas.postgresql.org.br
  https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
 
 
 
 
  --
  Ass.:
Vinicius Marconi Vasconcelos  Berni
 51 - 96608087
 51 - 32482071
 
 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral



[]s
-- 
JotaComm
http://jotacomm.wordpress.com
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Delete *

2010-07-22 Por tôpico Vinicius Marconi Vasconcelos Berni
Quero garantir que não aconteça nas duas situações.

Em 22 de julho de 2010 11:38, JotaComm jota.c...@gmail.com escreveu:

 Olá,

 Em 22 de julho de 2010 11:25, Candido Vieira da Silva Neto cvieira.br@
 gmail.com escreveu:

 Vinicius, existe o controle de transacoes para evitar 'acidentes'.
 BEGIN e COMMIT/SAVEPOINT/ROLLBACK

 On 7/22/10, Vinicius Marconi Vasconcelos Berni
 vinicius.marc...@gmail.com wrote:
  Não permitir que seja executado delete na base de dados sem fornecer
  clausula where,  quero fazer isto para evitar 'acidentes'.
 
  Ex.: delete from pessoa -  Esta query não deve ser permitida.
 
 delete from pessoa where id=2 - Esta será permitida


 Uma pergunta. As exclusões serão feitas pela aplicação ou o usuário pode ir
 manualmente na base e executar um comando delete em qualquer tabela?

 Que tal criar uma função simples para fazer a deleção dos usuários se este
 procedimento for executado pela aplicação, com por exemplo:

 CREATE OR REPLACE FUNCTION exclusao(INTEGER)

 RETURNS BOOLEAN AS $$

 BEGIN

 DELETE FROM tabela WHERE campo_chave=$1;

 IF FOUND THEN

 RAISE NOTICE 'O registro % foi excluido.',$1;

 RETURN TRUE;

 END IF;

 RAISE NOTICE 'O registro % não foi encontrado.',$1;

 RETURN FALSE;

 END;

 $$ LANGUAGE PLPGSQL RETURNS NULL ON NULL INPUT;


  
 
 
  Em 22 de julho de 2010 11:12, JotaComm jota.c...@gmail.com escreveu:
 
  Olá,
 
  Em 22 de julho de 2010 09:31, Vinicius Marconi Vasconcelos Berni 
  vinicius.marc...@gmail.com escreveu:
 
  Olá.
 
  Existe uma maneira de restringir 'delete' sem cláusula 'where' ?
 
 
  Como assim? O que exatamente você deseja?
 
 
  Desde já agradeço. No aguardo.
 
  --
  Ass.:
Vinicius Marconi Vasconcelos  Berni
 51 - 96608087
 51 - 32482071
 
  ___
  pgbr-geral mailing list
  pgbr-geral@listas.postgresql.org.br
  https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
 
 
 
  []s
  --
  JotaComm
  http://jotacomm.wordpress.com
 
  ___
  pgbr-geral mailing list
  pgbr-geral@listas.postgresql.org.br
  https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
 
 
 
 
  --
  Ass.:
Vinicius Marconi Vasconcelos  Berni
 51 - 96608087
 51 - 32482071
 
 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral



 []s
 --
 JotaComm
 http://jotacomm.wordpress.com

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




-- 
Ass.:
  Vinicius Marconi Vasconcelos  Berni
   51 - 96608087
   51 - 32482071
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Delete *

2010-07-22 Por tôpico Alexsander Rosa
Se o usuário tem username/senha para logar direto no banco, tendo GRANT
suficiente ele pode dar até um DROP DATABASE. Acho muito perigoso deixar
usuários com permissão para mexer direto no banco.

Em 22 de julho de 2010 11:38, JotaComm jota.c...@gmail.com escreveu:

 Olá,

 Em 22 de julho de 2010 11:25, Candido Vieira da Silva Neto cvieira.br@
 gmail.com escreveu:

 Vinicius, existe o controle de transacoes para evitar 'acidentes'.

 BEGIN e COMMIT/SAVEPOINT/ROLLBACK

 On 7/22/10, Vinicius Marconi Vasconcelos Berni
 vinicius.marc...@gmail.com wrote:
  Não permitir que seja executado delete na base de dados sem fornecer
  clausula where,  quero fazer isto para evitar 'acidentes'.
 
  Ex.: delete from pessoa -  Esta query não deve ser permitida.
 
 delete from pessoa where id=2 - Esta será permitida


 Uma pergunta. As exclusões serão feitas pela aplicação ou o usuário pode ir
 manualmente na base e executar um comando delete em qualquer tabela?

 Que tal criar uma função simples para fazer a deleção dos usuários se este
 procedimento for executado pela aplicação, com por exemplo:

 CREATE OR REPLACE FUNCTION exclusao(INTEGER)

 RETURNS BOOLEAN AS $$

 BEGIN

 DELETE FROM tabela WHERE campo_chave=$1;

 IF FOUND THEN

 RAISE NOTICE 'O registro % foi excluido.',$1;

 RETURN TRUE;

 END IF;

 RAISE NOTICE 'O registro % não foi encontrado.',$1;

 RETURN FALSE;

 END;

 $$ LANGUAGE PLPGSQL RETURNS NULL ON NULL INPUT;


  
 
 
  Em 22 de julho de 2010 11:12, JotaComm jota.c...@gmail.com escreveu:
 
  Olá,
 
  Em 22 de julho de 2010 09:31, Vinicius Marconi Vasconcelos Berni 
  vinicius.marc...@gmail.com escreveu:
 
  Olá.
 
  Existe uma maneira de restringir 'delete' sem cláusula 'where' ?
 
 
  Como assim? O que exatamente você deseja?
 
 
  Desde já agradeço. No aguardo.
 
  --
  Ass.:
Vinicius Marconi Vasconcelos  Berni
 51 - 96608087
 51 - 32482071
 
  ___
  pgbr-geral mailing list
  pgbr-geral@listas.postgresql.org.br
  https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
 
 
 
  []s
  --
  JotaComm
  http://jotacomm.wordpress.com
 
  ___
  pgbr-geral mailing list
  pgbr-geral@listas.postgresql.org.br
  https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
 
 
 
 
  --
  Ass.:
Vinicius Marconi Vasconcelos  Berni
 51 - 96608087
 51 - 32482071
 
 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral



 []s
 --
 JotaComm
 http://jotacomm.wordpress.com

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




-- 
Atenciosamente,
Alexsander da Rosa
Linux User #113925

Extremismo na defesa da liberdade não é defeito.
Moderação na busca por justiça não é virtude.
-- Barry Goldwater
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Delete *

2010-07-22 Por tôpico JotaComm
Olá,

Em 22 de julho de 2010 13:21, Vinicius Marconi Vasconcelos Berni 
vinicius.marc...@gmail.com escreveu:

 Quero garantir que não aconteça nas duas situações.


Pela aplicação você garante usando a função que comentei no email anterior.
Quanto ao acesso direto ao banco o usuário não deveria ter privilégio de
acesso direto e se tiver deveria no meu modo de ver apenas de SELECT. O
único que deveria ter os privilégios de UPDATE, INSERT e DELETE deveria ser
o administrador.


 Em 22 de julho de 2010 11:38, JotaComm jota.c...@gmail.com escreveu:

 Olá,

 Em 22 de julho de 2010 11:25, Candido Vieira da Silva Neto cvieira.br@
 gmail.com escreveu:

 Vinicius, existe o controle de transacoes para evitar 'acidentes'.
 BEGIN e COMMIT/SAVEPOINT/ROLLBACK

 On 7/22/10, Vinicius Marconi Vasconcelos Berni
 vinicius.marc...@gmail.com wrote:
  Não permitir que seja executado delete na base de dados sem fornecer
  clausula where,  quero fazer isto para evitar 'acidentes'.
 
  Ex.: delete from pessoa -  Esta query não deve ser permitida.
 
 delete from pessoa where id=2 - Esta será permitida


 Uma pergunta. As exclusões serão feitas pela aplicação ou o usuário pode
 ir manualmente na base e executar um comando delete em qualquer tabela?

 Que tal criar uma função simples para fazer a deleção dos usuários se este
 procedimento for executado pela aplicação, com por exemplo:

 CREATE OR REPLACE FUNCTION exclusao(INTEGER)

 RETURNS BOOLEAN AS $$

 BEGIN

 DELETE FROM tabela WHERE campo_chave=$1;

 IF FOUND THEN

 RAISE NOTICE 'O registro % foi excluido.',$1;

 RETURN TRUE;

 END IF;

 RAISE NOTICE 'O registro % não foi encontrado.',$1;

 RETURN FALSE;

 END;

 $$ LANGUAGE PLPGSQL RETURNS NULL ON NULL INPUT;


  
 
 
  Em 22 de julho de 2010 11:12, JotaComm jota.c...@gmail.com escreveu:
 
  Olá,
 
  Em 22 de julho de 2010 09:31, Vinicius Marconi Vasconcelos Berni 
  vinicius.marc...@gmail.com escreveu:
 
  Olá.
 
  Existe uma maneira de restringir 'delete' sem cláusula 'where' ?
 
 
  Como assim? O que exatamente você deseja?
 
 
  Desde já agradeço. No aguardo.
 
  --
  Ass.:
Vinicius Marconi Vasconcelos  Berni
 51 - 96608087
 51 - 32482071
 
  ___
  pgbr-geral mailing list
  pgbr-geral@listas.postgresql.org.br
  https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
 
 
 
  []s
  --
  JotaComm
  http://jotacomm.wordpress.com
 
  ___
  pgbr-geral mailing list
  pgbr-geral@listas.postgresql.org.br
  https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
 
 
 
 
  --
  Ass.:
Vinicius Marconi Vasconcelos  Berni
 51 - 96608087
 51 - 32482071
 
 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral



 []s
 --
 JotaComm
 http://jotacomm.wordpress.com

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




 --
 Ass.:
   Vinicius Marconi Vasconcelos  Berni
51 - 96608087
51 - 32482071

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



[]s
-- 
JotaComm
http://jotacomm.wordpress.com
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] DELETE com ARRAY

2008-11-10 Por tôpico Rogerio Grando
Ola pessoal!

Estou tentando criar um delete com arry mas não estou conseguindo, estou 
fazendo alguns testes para verificar no qual consigo obter melhor 
performance. O estou querendo fazer é mais ou menos o seguinte:
DELETE FROM tabela1 WHERE co_campo = ANY (SELECT (array(SELECT DISTINCT 
co_campo FROM tabela2 )))
Se algum souber ou tiver uma dica de como conseguir um melhor desempenho 
agradeço.
Versão: Postgres 7.4

Obrigado a todos. 

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


Re: [pgbr-geral] DELETE com ARRAY

2008-11-10 Por tôpico Evandro
Rogerio Grando wrote:
 Ola pessoal!

 Estou tentando criar um delete com arry mas não estou conseguindo, estou 
 fazendo alguns testes para verificar no qual consigo obter melhor 
 performance. O estou querendo fazer é mais ou menos o seguinte:
 DELETE FROM tabela1 WHERE co_campo = ANY (SELECT (array(SELECT DISTINCT 
 co_campo FROM tabela2 )))
Porque não simplesmente
DELETE FROM tabela1 WHERE co_campo IN (SELECT DISTINCT co_campo FROM 
tabela2)

Acho que o desempenho será maior.

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


Re: [pgbr-geral] Delete

2008-03-08 Por tôpico Fábio Telles Rodriguez
2008/3/5, km [EMAIL PROTECTED]:


 Eu tenho uma tabela,que tem um registro q eu quero excluir..
 Apos fazer o delete from table where id_codigo = parametro que eu passo,ele
 data a seguinte mensagem no pgadmim
 Query returned successfully: 0 rows affected, 63 ms execution time.

Veja que o seu parâmetro não coincidiu com o valor que você reria
excluir... pode haver alguma diferença capciosa no parâmetro que está
no banco e o que você está passando na consulta, como um espaço em
branco (no caso de uma string). Observe que o PostgreSQL está lhe
avisando que não excluiu nada ao dizer:  0 rows affected.

Isto significa: Olha, não achei nenhuma linha com este critério...
mas tudo bem, não houve nenhum erro de sintaxe e a tabela existe.

 mas eu dou select na tabela o registro existe..
 em outras tabelas eu consigo dar delete..
 Pode ser erro de permissão?


Não... se não houvesse permissão, você não teria uma menssagem: Query
returned successfully


[]s
Fábio Telles
-- 
blog: http://www.midstorm.org/~telles/
e-mail / jabber: [EMAIL PROTECTED]
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] Delete

2008-03-07 Por tôpico km
Eu tenho uma tabela,que tem um registro q eu quero excluir..
Apos fazer o delete from table where id_codigo = parametro que eu passo,ele
data a seguinte mensagem no pgadmim
Query returned successfully: 0 rows affected, 63 ms execution time.
mas eu dou select na tabela o registro existe..
em outras tabelas eu consigo dar delete..
Pode ser erro de permissão?

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


Re: [pgbr-geral] Delete

2008-03-07 Por tôpico Leandro DUTRA
2008/3/5, km [EMAIL PROTECTED]:

 Eu tenho uma tabela,que tem um registro q eu quero excluir..
 Apos fazer o delete from table where id_codigo = parametro que eu passo,ele
 data a seguinte mensagem no pgadmim
 Query returned successfully: 0 rows affected, 63 ms execution time.
 mas eu dou select na tabela o registro existe..

Acho que a representação do parâmetro que você passa não está
consistente com a do resultado da consulta; em outras palavras, o seu
cliente mostra a mesma coisa mas o PostgreSQL não está recebendo a
mesma coisa.

Exemplos concretos ajudariam, com detalhes de codificação e configuração.

-- 
skype:leandro.gfc.dutra?chat  Yahoo!: ymsgr:sendIM?lgcdutra
+55 (11) 3040 7300 r155 gTalk: xmpp:[EMAIL PROTECTED]
+55 (11) 9406 7191ICQ/AIM: aim:GoIM?screenname=61287803
+55 (11) 5685 2219MSN: msnim:[EMAIL PROTECTED]
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] DELETE LENTO

2007-11-30 Por tôpico Dickson Guedes
-BEGIN PGP SIGNED MESSAGE-
Hash: SHA1

Euler Taveira de Oliveira escreveu:
 Em nenhuma! Porque isto não está implementado e nem sei se vai ser
 implementado..

Que pena... :-(

No Oracle isso já me ajudou muitas vezes.

[ ]s
Guedes

-BEGIN PGP SIGNATURE-
Version: GnuPG v1.4.2 (GNU/Linux)
Comment: Using GnuPG with SUSE - http://enigmail.mozdev.org

iD8DBQFHT+i1fNj5A+QkLMoRAkfMAJ4wyiqvetIGpMHduLMn+0baBdEEiACg1Dpg
VAXxlndN5japqP7BqLZZ5F8=
=SswE
-END PGP SIGNATURE-

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


Re: [pgbr-geral] DELETE LENTO

2007-11-29 Por tôpico Fabio Telles
Em 28/11/07, Brasil Software[EMAIL PROTECTED] escreveu:
 Pessoal !
 Estou com um grande problema, migrei minha base do firebird para
 postgresql e quando estou deletando um registro o tempo
 chega a ser vergonhoso em relação ao firebird.

 Alguem pode me ajudar.
 minha base tem:
 293 tabelas
 algumas com 2 milhões de registros.


Se você tem que deletar muitos registros a melhor coisa a fazer para
acelerar a operação é utilizar um TRUNCATE. Se você vai excluir poucos
registros, um índice para pesquisar o campo de seleção da cláusula
WHERE deve resolver.

Ao excluir muitos registros, o DELETE é proibitivo. Você tem três
alternativas interessantes:

1) Executar o TRUNCATE e pronto. Isso funciona somente se você quer
excluir TODOS registros da tabela. Nem sempre é o caso!

2) Particionar a tabela e depois dar um TRUNCATE apenas na partição
que lhe interessa. Esta é com certeza uma excelente opção para bases
grandes onde você consegue prever uma exclusão de rotina em um grupo
previsível de dados, como os registros do último trimestre.
Particionar tabelas grandes tem uma série de outros benefícios
colaterais que melhoram substancialmente o desempenho e diminuem o
gasto com os discos.

3) Se você não consegue prever o ponto de corte para excluir seus
dados, impedindo-o de particionar sua tabela de forma adequada, há um
último recurso que é utilizar o INSERT no lugar do DELETE:
- Mova os dados que NÃO serão excluÍdos para outra tabela auxiliar com
um CREATE TABLE AS SELECT (...) WHERE (...)
- Dê um TRUNCATE na tabela original.
- Carrege os dados na tabela original com um INSERT (...) SELECT (...)
- Dê um DROP TABLE na tabela auxiliar.

Uma variação ainda mais rápida, mas mais delicada é você fazer a
tabela auxiliar se transformar em tabela original. Com isto, após
criar a tabela auxiliar, você precisa excluir a tabela original e
renomear a tabela auxiliar. O problema é que você terá depois que
recriar todos os CONSTRAINTS na mão. Em uma rotina bem planejada a
variante é mais rápida ainda.


Em ambientes realmente grandes eu vejo as pessoas aplicarem uma
combinação das técnicas 2 e 3. Quando se tem um volume que passa da
casa dos 500GB o particionamento é obrigatório. Quando o número de
linhas a excluir é grande, o DELETE nunca é eficiente, não apenas no
PostgreSQL, mas no Oracle e DB2 também...

Espero ter ajudado.

[]s
Fábio Telles
-- 
blog: http://www.midstorm.org/~telles/
e-mail / jabber: [EMAIL PROTECTED]
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] DELETE LENTO

2007-11-29 Por tôpico Fabio Telles
Hum... me empolguei um pouco e resolvi escrever sobre o assunto no meu
blog. É claro que se trata de um caso particular de DELETE, mas fica a
dica:

http://www.midstorm.org/~telles/2007/11/29/nao-use-delete-use-insert/

[]s

Em 29/11/07, Fabio Telles[EMAIL PROTECTED] escreveu:
 Em 28/11/07, Brasil Software[EMAIL PROTECTED] escreveu:
  Pessoal !
  Estou com um grande problema, migrei minha base do firebird para
  postgresql e quando estou deletando um registro o tempo
  chega a ser vergonhoso em relação ao firebird.
 
  Alguem pode me ajudar.
  minha base tem:
  293 tabelas
  algumas com 2 milhões de registros.
 

 Se você tem que deletar muitos registros a melhor coisa a fazer para
 acelerar a operação é utilizar um TRUNCATE. Se você vai excluir poucos
 registros, um índice para pesquisar o campo de seleção da cláusula
 WHERE deve resolver.

 Ao excluir muitos registros, o DELETE é proibitivo. Você tem três
 alternativas interessantes:

 1) Executar o TRUNCATE e pronto. Isso funciona somente se você quer
 excluir TODOS registros da tabela. Nem sempre é o caso!

 2) Particionar a tabela e depois dar um TRUNCATE apenas na partição
 que lhe interessa. Esta é com certeza uma excelente opção para bases
 grandes onde você consegue prever uma exclusão de rotina em um grupo
 previsível de dados, como os registros do último trimestre.
 Particionar tabelas grandes tem uma série de outros benefícios
 colaterais que melhoram substancialmente o desempenho e diminuem o
 gasto com os discos.

 3) Se você não consegue prever o ponto de corte para excluir seus
 dados, impedindo-o de particionar sua tabela de forma adequada, há um
 último recurso que é utilizar o INSERT no lugar do DELETE:
 - Mova os dados que NÃO serão excluÍdos para outra tabela auxiliar com
 um CREATE TABLE AS SELECT (...) WHERE (...)
 - Dê um TRUNCATE na tabela original.
 - Carrege os dados na tabela original com um INSERT (...) SELECT (...)
 - Dê um DROP TABLE na tabela auxiliar.

 Uma variação ainda mais rápida, mas mais delicada é você fazer a
 tabela auxiliar se transformar em tabela original. Com isto, após
 criar a tabela auxiliar, você precisa excluir a tabela original e
 renomear a tabela auxiliar. O problema é que você terá depois que
 recriar todos os CONSTRAINTS na mão. Em uma rotina bem planejada a
 variante é mais rápida ainda.


 Em ambientes realmente grandes eu vejo as pessoas aplicarem uma
 combinação das técnicas 2 e 3. Quando se tem um volume que passa da
 casa dos 500GB o particionamento é obrigatório. Quando o número de
 linhas a excluir é grande, o DELETE nunca é eficiente, não apenas no
 PostgreSQL, mas no Oracle e DB2 também...

 Espero ter ajudado.

 []s
 Fábio Telles
 --
 blog: http://www.midstorm.org/~telles/
 e-mail / jabber: [EMAIL PROTECTED]



-- 
blog: http://www.midstorm.org/~telles/
e-mail / jabber: [EMAIL PROTECTED]
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] DELETE LENTO

2007-11-29 Por tôpico sergio
Li essa resposta, mas preciso perguntar.
Se tiver trigger ou Foreign Key?
O truncate não vai servir, aí então só mesmo o delete?


- Original Message - 
From: Fabio Telles [EMAIL PROTECTED]
To: Comunidade PostgreSQL Brasileira pgbr-geral@listas.postgresql.org.br
Sent: Thursday, November 29, 2007 5:28 AM
Subject: Re: [pgbr-geral] DELETE LENTO


Em 28/11/07, Brasil Software[EMAIL PROTECTED] escreveu:
 Pessoal !
 Estou com um grande problema, migrei minha base do firebird para
 postgresql e quando estou deletando um registro o tempo
 chega a ser vergonhoso em relação ao firebird.

 Alguem pode me ajudar.
 minha base tem:
 293 tabelas
 algumas com 2 milhões de registros.


Se você tem que deletar muitos registros a melhor coisa a fazer para
acelerar a operação é utilizar um TRUNCATE. Se você vai excluir poucos
registros, um índice para pesquisar o campo de seleção da cláusula
WHERE deve resolver.

Ao excluir muitos registros, o DELETE é proibitivo. Você tem três
alternativas interessantes:

1) Executar o TRUNCATE e pronto. Isso funciona somente se você quer
excluir TODOS registros da tabela. Nem sempre é o caso!

2) Particionar a tabela e depois dar um TRUNCATE apenas na partição
que lhe interessa. Esta é com certeza uma excelente opção para bases
grandes onde você consegue prever uma exclusão de rotina em um grupo
previsível de dados, como os registros do último trimestre.
Particionar tabelas grandes tem uma série de outros benefícios
colaterais que melhoram substancialmente o desempenho e diminuem o
gasto com os discos.

3) Se você não consegue prever o ponto de corte para excluir seus
dados, impedindo-o de particionar sua tabela de forma adequada, há um
último recurso que é utilizar o INSERT no lugar do DELETE:
- Mova os dados que NÃO serão excluÍdos para outra tabela auxiliar com
um CREATE TABLE AS SELECT (...) WHERE (...)
- Dê um TRUNCATE na tabela original.
- Carrege os dados na tabela original com um INSERT (...) SELECT (...)
- Dê um DROP TABLE na tabela auxiliar.

Uma variação ainda mais rápida, mas mais delicada é você fazer a
tabela auxiliar se transformar em tabela original. Com isto, após
criar a tabela auxiliar, você precisa excluir a tabela original e
renomear a tabela auxiliar. O problema é que você terá depois que
recriar todos os CONSTRAINTS na mão. Em uma rotina bem planejada a
variante é mais rápida ainda.


Em ambientes realmente grandes eu vejo as pessoas aplicarem uma
combinação das técnicas 2 e 3. Quando se tem um volume que passa da
casa dos 500GB o particionamento é obrigatório. Quando o número de
linhas a excluir é grande, o DELETE nunca é eficiente, não apenas no
PostgreSQL, mas no Oracle e DB2 também...

Espero ter ajudado.

[]s
Fábio Telles
-- 
blog: http://www.midstorm.org/~telles/
e-mail / jabber: [EMAIL PROTECTED]
___
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


Re: [pgbr-geral] DELETE LENTO

2007-11-29 Por tôpico Joao
http://www.midstorm.org/~telles/2007/11/29/nao-use-delete-use-insert/
Cara show de bola esse artigo, alias como sempre né! :P
Abraços!!

- Original Message - 
From: Fabio Telles [EMAIL PROTECTED]
To: Comunidade PostgreSQL Brasileira pgbr-geral@listas.postgresql.org.br
Sent: Thursday, November 29, 2007 6:52 AM
Subject: Re: [pgbr-geral] DELETE LENTO


Hum... me empolguei um pouco e resolvi escrever sobre o assunto no meu
blog. É claro que se trata de um caso particular de DELETE, mas fica a
dica:

http://www.midstorm.org/~telles/2007/11/29/nao-use-delete-use-insert/

[]s

Em 29/11/07, Fabio Telles[EMAIL PROTECTED] escreveu:
 Em 28/11/07, Brasil Software[EMAIL PROTECTED] escreveu:
  Pessoal !
  Estou com um grande problema, migrei minha base do firebird para
  postgresql e quando estou deletando um registro o tempo
  chega a ser vergonhoso em relação ao firebird.
 
  Alguem pode me ajudar.
  minha base tem:
  293 tabelas
  algumas com 2 milhões de registros.
 

 Se você tem que deletar muitos registros a melhor coisa a fazer para
 acelerar a operação é utilizar um TRUNCATE. Se você vai excluir poucos
 registros, um índice para pesquisar o campo de seleção da cláusula
 WHERE deve resolver.

 Ao excluir muitos registros, o DELETE é proibitivo. Você tem três
 alternativas interessantes:

 1) Executar o TRUNCATE e pronto. Isso funciona somente se você quer
 excluir TODOS registros da tabela. Nem sempre é o caso!

 2) Particionar a tabela e depois dar um TRUNCATE apenas na partição
 que lhe interessa. Esta é com certeza uma excelente opção para bases
 grandes onde você consegue prever uma exclusão de rotina em um grupo
 previsível de dados, como os registros do último trimestre.
 Particionar tabelas grandes tem uma série de outros benefícios
 colaterais que melhoram substancialmente o desempenho e diminuem o
 gasto com os discos.

 3) Se você não consegue prever o ponto de corte para excluir seus
 dados, impedindo-o de particionar sua tabela de forma adequada, há um
 último recurso que é utilizar o INSERT no lugar do DELETE:
 - Mova os dados que NÃO serão excluÍdos para outra tabela auxiliar com
 um CREATE TABLE AS SELECT (...) WHERE (...)
 - Dê um TRUNCATE na tabela original.
 - Carrege os dados na tabela original com um INSERT (...) SELECT (...)
 - Dê um DROP TABLE na tabela auxiliar.

 Uma variação ainda mais rápida, mas mais delicada é você fazer a
 tabela auxiliar se transformar em tabela original. Com isto, após
 criar a tabela auxiliar, você precisa excluir a tabela original e
 renomear a tabela auxiliar. O problema é que você terá depois que
 recriar todos os CONSTRAINTS na mão. Em uma rotina bem planejada a
 variante é mais rápida ainda.


 Em ambientes realmente grandes eu vejo as pessoas aplicarem uma
 combinação das técnicas 2 e 3. Quando se tem um volume que passa da
 casa dos 500GB o particionamento é obrigatório. Quando o número de
 linhas a excluir é grande, o DELETE nunca é eficiente, não apenas no
 PostgreSQL, mas no Oracle e DB2 também...

 Espero ter ajudado.

 []s
 Fábio Telles
 --
 blog: http://www.midstorm.org/~telles/
 e-mail / jabber: [EMAIL PROTECTED]



-- 
blog: http://www.midstorm.org/~telles/
e-mail / jabber: [EMAIL PROTECTED]
___
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


Re: [pgbr-geral] DELETE LENTO

2007-11-29 Por tôpico jota . comm
Olá,

Depende da versão do PostgreSQL que você está utilizando.
Senão estou enganado, a partir da versão 8.2 é possível fazer truncate
cascade.

[]s


Em 29/11/07, sergio [EMAIL PROTECTED] escreveu:

 Li essa resposta, mas preciso perguntar.
 Se tiver trigger ou Foreign Key?
 O truncate não vai servir, aí então só mesmo o delete?


 - Original Message -
 From: Fabio Telles [EMAIL PROTECTED]
 To: Comunidade PostgreSQL Brasileira 
 pgbr-geral@listas.postgresql.org.br
 Sent: Thursday, November 29, 2007 5:28 AM
 Subject: Re: [pgbr-geral] DELETE LENTO


 Em 28/11/07, Brasil Software[EMAIL PROTECTED] escreveu:
  Pessoal !
  Estou com um grande problema, migrei minha base do firebird para
  postgresql e quando estou deletando um registro o tempo
  chega a ser vergonhoso em relação ao firebird.
 
  Alguem pode me ajudar.
  minha base tem:
  293 tabelas
  algumas com 2 milhões de registros.
 

 Se você tem que deletar muitos registros a melhor coisa a fazer para
 acelerar a operação é utilizar um TRUNCATE. Se você vai excluir poucos
 registros, um índice para pesquisar o campo de seleção da cláusula
 WHERE deve resolver.

 Ao excluir muitos registros, o DELETE é proibitivo. Você tem três
 alternativas interessantes:

 1) Executar o TRUNCATE e pronto. Isso funciona somente se você quer
 excluir TODOS registros da tabela. Nem sempre é o caso!

 2) Particionar a tabela e depois dar um TRUNCATE apenas na partição
 que lhe interessa. Esta é com certeza uma excelente opção para bases
 grandes onde você consegue prever uma exclusão de rotina em um grupo
 previsível de dados, como os registros do último trimestre.
 Particionar tabelas grandes tem uma série de outros benefícios
 colaterais que melhoram substancialmente o desempenho e diminuem o
 gasto com os discos.

 3) Se você não consegue prever o ponto de corte para excluir seus
 dados, impedindo-o de particionar sua tabela de forma adequada, há um
 último recurso que é utilizar o INSERT no lugar do DELETE:
 - Mova os dados que NÃO serão excluÍdos para outra tabela auxiliar com
 um CREATE TABLE AS SELECT (...) WHERE (...)
 - Dê um TRUNCATE na tabela original.
 - Carrege os dados na tabela original com um INSERT (...) SELECT (...)
 - Dê um DROP TABLE na tabela auxiliar.

 Uma variação ainda mais rápida, mas mais delicada é você fazer a
 tabela auxiliar se transformar em tabela original. Com isto, após
 criar a tabela auxiliar, você precisa excluir a tabela original e
 renomear a tabela auxiliar. O problema é que você terá depois que
 recriar todos os CONSTRAINTS na mão. Em uma rotina bem planejada a
 variante é mais rápida ainda.


 Em ambientes realmente grandes eu vejo as pessoas aplicarem uma
 combinação das técnicas 2 e 3. Quando se tem um volume que passa da
 casa dos 500GB o particionamento é obrigatório. Quando o número de
 linhas a excluir é grande, o DELETE nunca é eficiente, não apenas no
 PostgreSQL, mas no Oracle e DB2 também...

 Espero ter ajudado.

 []s
 Fábio Telles
 --
 blog: http://www.midstorm.org/~telles/
 e-mail / jabber: [EMAIL PROTECTED]
 ___
 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 mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] DELETE LENTO

2007-11-29 Por tôpico Fabio Telles
Em 29/11/07, sergio[EMAIL PROTECTED] escreveu:
 Li essa resposta, mas preciso perguntar.
 Se tiver trigger ou Foreign Key?
 O truncate não vai servir, aí então só mesmo o delete?


Em QUALQUER operação de carga, seja UPDATE, INSERT ou DELETE, você
deveria desabilitar todos constraints, triggers, índices, etc. Só
depois de concluída a transação você habilita/recria tudo novamente.
Se você não faz isso (não apenas no PostgreSQL, mas em qualquer SGDB)
o seu desempenho é muito ruim.

Vide comentários no artigo.

Atenciosamente,
Fábio Telles


 - Original Message -
 From: Fabio Telles [EMAIL PROTECTED]
 To: Comunidade PostgreSQL Brasileira pgbr-geral@listas.postgresql.org.br
 Sent: Thursday, November 29, 2007 5:28 AM
 Subject: Re: [pgbr-geral] DELETE LENTO


 Em 28/11/07, Brasil Software[EMAIL PROTECTED] escreveu:
  Pessoal !
  Estou com um grande problema, migrei minha base do firebird para
  postgresql e quando estou deletando um registro o tempo
  chega a ser vergonhoso em relação ao firebird.
 
  Alguem pode me ajudar.
  minha base tem:
  293 tabelas
  algumas com 2 milhões de registros.
 

 Se você tem que deletar muitos registros a melhor coisa a fazer para
 acelerar a operação é utilizar um TRUNCATE. Se você vai excluir poucos
 registros, um índice para pesquisar o campo de seleção da cláusula
 WHERE deve resolver.

 Ao excluir muitos registros, o DELETE é proibitivo. Você tem três
 alternativas interessantes:

 1) Executar o TRUNCATE e pronto. Isso funciona somente se você quer
 excluir TODOS registros da tabela. Nem sempre é o caso!

 2) Particionar a tabela e depois dar um TRUNCATE apenas na partição
 que lhe interessa. Esta é com certeza uma excelente opção para bases
 grandes onde você consegue prever uma exclusão de rotina em um grupo
 previsível de dados, como os registros do último trimestre.
 Particionar tabelas grandes tem uma série de outros benefícios
 colaterais que melhoram substancialmente o desempenho e diminuem o
 gasto com os discos.

 3) Se você não consegue prever o ponto de corte para excluir seus
 dados, impedindo-o de particionar sua tabela de forma adequada, há um
 último recurso que é utilizar o INSERT no lugar do DELETE:
 - Mova os dados que NÃO serão excluÍdos para outra tabela auxiliar com
 um CREATE TABLE AS SELECT (...) WHERE (...)
 - Dê um TRUNCATE na tabela original.
 - Carrege os dados na tabela original com um INSERT (...) SELECT (...)
 - Dê um DROP TABLE na tabela auxiliar.

 Uma variação ainda mais rápida, mas mais delicada é você fazer a
 tabela auxiliar se transformar em tabela original. Com isto, após
 criar a tabela auxiliar, você precisa excluir a tabela original e
 renomear a tabela auxiliar. O problema é que você terá depois que
 recriar todos os CONSTRAINTS na mão. Em uma rotina bem planejada a
 variante é mais rápida ainda.


 Em ambientes realmente grandes eu vejo as pessoas aplicarem uma
 combinação das técnicas 2 e 3. Quando se tem um volume que passa da
 casa dos 500GB o particionamento é obrigatório. Quando o número de
 linhas a excluir é grande, o DELETE nunca é eficiente, não apenas no
 PostgreSQL, mas no Oracle e DB2 também...

 Espero ter ajudado.

 []s
 Fábio Telles
 --
 blog: http://www.midstorm.org/~telles/
 e-mail / jabber: [EMAIL PROTECTED]
 ___
 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



-- 
blog: http://www.midstorm.org/~telles/
e-mail / jabber: [EMAIL PROTECTED]
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] DELETE LENTO

2007-11-29 Por tôpico Joao
existem muitos indices nessa tabela?
- Original Message - 
From: Brasil Software [EMAIL PROTECTED]
To: pgbr-geral@listas.postgresql.org.br
Sent: Wednesday, November 28, 2007 5:59 PM
Subject: [pgbr-geral] DELETE LENTO


Pessoal !
Estou com um grande problema, migrei minha base do firebird para
postgresql e quando estou deletando um registro o tempo
chega a ser vergonhoso em relação ao firebird.

Alguem pode me ajudar.
minha base tem:
293 tabelas
algumas com 2 milhões de registros.



___
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


Re: [pgbr-geral] DELETE LENTO

2007-11-29 Por tôpico Joao
Fábio so um errinho de portugues!!
Vejamos uma forma de rezover problema de excluir muitos registros utilizando o 
INSERT
Oo leitor chato!!!
Abraços!!!
  - Original Message - 
  From: jota.comm 
  To: Comunidade PostgreSQL Brasileira 
  Sent: Thursday, November 29, 2007 8:54 AM
  Subject: Re: [pgbr-geral] DELETE LENTO


  Olá, Fábio

  Acabei de ler o artigo, muito bom!

  Abraços


  Em 29/11/07, Fabio Telles [EMAIL PROTECTED]  escreveu:
Hum... me empolguei um pouco e resolvi escrever sobre o assunto no meu 
blog. É claro que se trata de um caso particular de DELETE, mas fica a
dica:

http://www.midstorm.org/~telles/2007/11/29/nao-use-delete-use-insert/ 

[]s

Em 29/11/07, Fabio Telles[EMAIL PROTECTED] escreveu:
 Em 28/11/07, Brasil Software [EMAIL PROTECTED] escreveu:
  Pessoal !
  Estou com um grande problema, migrei minha base do firebird para
  postgresql e quando estou deletando um registro o tempo
  chega a ser vergonhoso em relação ao firebird.
 
  Alguem pode me ajudar.
  minha base tem:
  293 tabelas
  algumas com 2 milhões de registros.
  

 Se você tem que deletar muitos registros a melhor coisa a fazer para
 acelerar a operação é utilizar um TRUNCATE. Se você vai excluir poucos
 registros, um índice para pesquisar o campo de seleção da cláusula 
 WHERE deve resolver.

 Ao excluir muitos registros, o DELETE é proibitivo. Você tem três
 alternativas interessantes:

 1) Executar o TRUNCATE e pronto. Isso funciona somente se você quer 
 excluir TODOS registros da tabela. Nem sempre é o caso!

 2) Particionar a tabela e depois dar um TRUNCATE apenas na partição
 que lhe interessa. Esta é com certeza uma excelente opção para bases 
 grandes onde você consegue prever uma exclusão de rotina em um grupo
 previsível de dados, como os registros do último trimestre.
 Particionar tabelas grandes tem uma série de outros benefícios 
 colaterais que melhoram substancialmente o desempenho e diminuem o
 gasto com os discos.

 3) Se você não consegue prever o ponto de corte para excluir seus
 dados, impedindo-o de particionar sua tabela de forma adequada, há um 
 último recurso que é utilizar o INSERT no lugar do DELETE:
 - Mova os dados que NÃO serão excluÍdos para outra tabela auxiliar com
 um CREATE TABLE AS SELECT (...) WHERE (...)
 - Dê um TRUNCATE na tabela original. 
 - Carrege os dados na tabela original com um INSERT (...) SELECT (...)
 - Dê um DROP TABLE na tabela auxiliar.

 Uma variação ainda mais rápida, mas mais delicada é você fazer a
 tabela auxiliar se transformar em tabela original. Com isto, após 
 criar a tabela auxiliar, você precisa excluir a tabela original e
 renomear a tabela auxiliar. O problema é que você terá depois que
 recriar todos os CONSTRAINTS na mão. Em uma rotina bem planejada a 
 variante é mais rápida ainda.


 Em ambientes realmente grandes eu vejo as pessoas aplicarem uma
 combinação das técnicas 2 e 3. Quando se tem um volume que passa da
 casa dos 500GB o particionamento é obrigatório. Quando o número de 
 linhas a excluir é grande, o DELETE nunca é eficiente, não apenas no
 PostgreSQL, mas no Oracle e DB2 também...

 Espero ter ajudado.

 []s
 Fábio Telles
 --
 blog: http://www.midstorm.org/~telles/
 e-mail / jabber: [EMAIL PROTECTED]



--
blog: http://www.midstorm.org/~telles/
e-mail / jabber: [EMAIL PROTECTED]
___
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 mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] DELETE LENTO

2007-11-29 Por tôpico Dickson Guedes
-BEGIN PGP SIGNED MESSAGE-
Hash: SHA1

Fabio Telles escreveu:
 Em QUALQUER operação de carga, seja UPDATE, INSERT ou DELETE, você
 deveria desabilitar todos constraints, triggers, índices, etc.

Para desabilitar as Triggers no PG eu posso executar um /ALTER TABLE/
ou posso utilizar /-X disable-triggers/ num restore, mas aí vai uma
pergunta:

Quando no PostgreSQL eu poderei desabilitar CONSTRAINTS via /ALTER
TABLE/ por exemplo?

[ ]s
Guedes

-BEGIN PGP SIGNATURE-
Version: GnuPG v1.4.2 (GNU/Linux)
Comment: Using GnuPG with SUSE - http://enigmail.mozdev.org

iD8DBQFHTruhfNj5A+QkLMoRAmWgAJ9Uf8WKBwLO2+f+SKy10Myg9lCKBACgsqTW
nlBV8CeSlHz0M3ouWTgJ4J8=
=aUrx
-END PGP SIGNATURE-

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


Re: [pgbr-geral] DELETE LENTO

2007-11-29 Por tôpico Leandro DUTRA
2007/11/29, Fabio Telles [EMAIL PROTECTED]:
 Em 29/11/07, sergio[EMAIL PROTECTED] escreveu:
  Li essa resposta, mas preciso perguntar.
  Se tiver trigger ou Foreign Key?
  O truncate não vai servir, aí então só mesmo o delete?

 Em QUALQUER operação de carga, seja UPDATE, INSERT ou DELETE, você
 deveria desabilitar todos constraints, triggers, índices, etc. Só
 depois de concluída a transação você habilita/recria tudo novamente.

Telles, isso vale também para o TRUNCATE?  No Oracle ele é análogo ao
exp DIRECT = Y, passando por fora de todo tipo de conferência.
Conceitualmente, nem devia fazer parte da linguagem SQL.


-- 
+55 (11) 5685 2219   xmpp:[EMAIL PROTECTED]
+55 (11) 9406 7191  Yahoo!: ymsgr:sendIM?lgcdutra
+55 (11) 3040 7300  ICQ/AIM: aim:GoIM?screenname=61287803
MSN: msnim:[EMAIL PROTECTED]
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] DELETE LENTO

2007-11-29 Por tôpico Fabio Telles
Em 29/11/07, Joao[EMAIL PROTECTED] escreveu:


 Fábio so um errinho de portugues!!
 Vejamos uma forma de rezover problema de excluir muitos registros
 utilizando o INSERT
 Oo leitor chato!!!
 Abraços!!!

Got you! Eu já tinha corrigido antes de você postar Como escrevi
isso de manhã antes de sair para o trabalho... dei uma revisada
depois!

Mas é sempre bom saber que tem gente dando uma ajuda para os artigos
ficarem sem estes erros escabrosos.

Obrigado pela força.

[]s

 - Original Message -
 From: jota.comm
 To: Comunidade PostgreSQL Brasileira
 Sent: Thursday, November 29, 2007 8:54 AM
 Subject: Re: [pgbr-geral] DELETE LENTO

 Olá, Fábio

 Acabei de ler o artigo, muito bom!

 Abraços


 Em 29/11/07, Fabio Telles [EMAIL PROTECTED]  escreveu:
  Hum... me empolguei um pouco e resolvi escrever sobre o assunto no meu
  blog. É claro que se trata de um caso particular de DELETE, mas fica a
  dica:
 
 
 http://www.midstorm.org/~telles/2007/11/29/nao-use-delete-use-insert/
 
  []s
 
  Em 29/11/07, Fabio Telles[EMAIL PROTECTED] escreveu:
   Em 28/11/07, Brasil Software
 [EMAIL PROTECTED] escreveu:
Pessoal !
Estou com um grande problema, migrei minha base do firebird para
postgresql e quando estou deletando um registro o tempo
chega a ser vergonhoso em relação ao firebird.
   
Alguem pode me ajudar.
minha base tem:
293 tabelas
algumas com 2 milhões de registros.
   
  
   Se você tem que deletar muitos registros a melhor coisa a fazer para
   acelerar a operação é utilizar um TRUNCATE. Se você vai excluir poucos
   registros, um índice para pesquisar o campo de seleção da cláusula
   WHERE deve resolver.
  
   Ao excluir muitos registros, o DELETE é proibitivo. Você tem três
   alternativas interessantes:
  
   1) Executar o TRUNCATE e pronto. Isso funciona somente se você quer
   excluir TODOS registros da tabela. Nem sempre é o caso!
  
   2) Particionar a tabela e depois dar um TRUNCATE apenas na partição
   que lhe interessa. Esta é com certeza uma excelente opção para bases
   grandes onde você consegue prever uma exclusão de rotina em um grupo
   previsível de dados, como os registros do último trimestre.
   Particionar tabelas grandes tem uma série de outros benefícios
   colaterais que melhoram substancialmente o desempenho e diminuem o
   gasto com os discos.
  
   3) Se você não consegue prever o ponto de corte para excluir seus
   dados, impedindo-o de particionar sua tabela de forma adequada, há um
   último recurso que é utilizar o INSERT no lugar do DELETE:
   - Mova os dados que NÃO serão excluÍdos para outra tabela auxiliar com
   um CREATE TABLE AS SELECT (...) WHERE (...)
   - Dê um TRUNCATE na tabela original.
   - Carrege os dados na tabela original com um INSERT (...) SELECT (...)
   - Dê um DROP TABLE na tabela auxiliar.
  
   Uma variação ainda mais rápida, mas mais delicada é você fazer a
   tabela auxiliar se transformar em tabela original. Com isto, após
   criar a tabela auxiliar, você precisa excluir a tabela original e
   renomear a tabela auxiliar. O problema é que você terá depois que
   recriar todos os CONSTRAINTS na mão. Em uma rotina bem planejada a
   variante é mais rápida ainda.
  
  
   Em ambientes realmente grandes eu vejo as pessoas aplicarem uma
   combinação das técnicas 2 e 3. Quando se tem um volume que passa da
   casa dos 500GB o particionamento é obrigatório. Quando o número de
   linhas a excluir é grande, o DELETE nunca é eficiente, não apenas no
   PostgreSQL, mas no Oracle e DB2 também...
  
   Espero ter ajudado.
  
   []s
   Fábio Telles
   --
   blog: http://www.midstorm.org/~telles/
   e-mail / jabber: [EMAIL PROTECTED]
  
 
 
  --
  blog: http://www.midstorm.org/~telles/
  e-mail / jabber: [EMAIL PROTECTED]
  ___
  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 mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral




-- 
blog: http://www.midstorm.org/~telles/
e-mail / jabber: [EMAIL PROTECTED]
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] DELETE LENTO

2007-11-29 Por tôpico Ronaldo de Oliveira Ramos
Favor enviar DDL da tabela bem como comando de DELETE. Pode ser a cláusula 
WHERE em coluna não indexada.

Euler Taveira de Oliveira [EMAIL PROTECTED] escreveu: Brasil Software wrote:
 Pessoal !
 Estou com um grande problema, migrei minha base do firebird para 
 postgresql e quando estou deletando um registro o tempo
 chega a ser vergonhoso em relação ao firebird.
 
É problema de performance? EXPLAIN ANALYZE comando, por favor?


-- 
  Euler Taveira de Oliveira
  http://www.timbira.com/
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


   
-
Abra sua conta no Yahoo! Mail, o único sem limite de espaço para armazenamento! ___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] DELETE LENTO

2007-11-29 Por tôpico Fabio Telles
Em 29/11/07, Leandro DUTRA[EMAIL PROTECTED] escreveu:
 2007/11/29, Fabio Telles [EMAIL PROTECTED]:
  Em 29/11/07, sergio[EMAIL PROTECTED] escreveu:
   Li essa resposta, mas preciso perguntar.
   Se tiver trigger ou Foreign Key?
   O truncate não vai servir, aí então só mesmo o delete?
 
  Em QUALQUER operação de carga, seja UPDATE, INSERT ou DELETE, você
  deveria desabilitar todos constraints, triggers, índices, etc. Só
  depois de concluída a transação você habilita/recria tudo novamente.

 Telles, isso vale também para o TRUNCATE?  No Oracle ele é análogo ao
 exp DIRECT = Y, passando por fora de todo tipo de conferência.
 Conceitualmente, nem devia fazer parte da linguagem SQL.

Pela documentação em http://www.postgresql.org/docs/8.2/static/sql-truncate.html
você pode optar pelo TRUNCATE com a opção RESTRICT (padrão) ou
CASCADE. O RESTRICT não permite que você realize o TRUNCATE se houver
qualquer restrição de FK na tabela. Note que a opção de CASCADE surgiu
na versão 8.2 do PostgreSQL.

Em qualquer uma das situações, o TRUNCATE não dispara nenhum gatilho
ON DELETE. O DELETE não é utilizado, e sim um DROP e CREATE. Sendo
assim o TRUNCATE não é uma operação de DML e sim de DDL.

No Oracle, diz a documentação: You cannot truncate the parent table
of an enabled referential integrity constraint. You must disable the
constraint before truncating the table. An exception is that you can
truncate the table if the integrity constraint is self-referential..
Ou seja, se comporta como um RESTRICT no PostgreSQL.

Por último... não o TRUNCATE não faz parte do padrão SQL, mas é
amplamente implementado pelos SGDBs.

[]s
Fábio Telles
-- 
blog: http://www.midstorm.org/~telles/
e-mail / jabber: [EMAIL PROTECTED]
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] DELETE LENTO

2007-11-29 Por tôpico Fabio Telles
Em 29/11/07, Dickson Guedes[EMAIL PROTECTED] escreveu:
 -BEGIN PGP SIGNED MESSAGE-
 Hash: SHA1

 Fabio Telles escreveu:
  Em QUALQUER operação de carga, seja UPDATE, INSERT ou DELETE, você
  deveria desabilitar todos constraints, triggers, índices, etc.

 Para desabilitar as Triggers no PG eu posso executar um /ALTER TABLE/
 ou posso utilizar /-X disable-triggers/ num restore, mas aí vai uma
 pergunta:

 Quando no PostgreSQL eu poderei desabilitar CONSTRAINTS via /ALTER
 TABLE/ por exemplo?

Bom... um ALTER TABLE impede qualquer operação de DML na tabela alvo.
Porém uma boa idéia seria dar um LOCK em todas tabelas com FKs antes
de desabilitar seus constraints e só liberar o lock após reestabelecer
todos os constraints. Eis um dos poucos casos em que um LOCK é
realmente necessário.

[]s
Fábio Telles

 [ ]s
 Guedes

 -BEGIN PGP SIGNATURE-
 Version: GnuPG v1.4.2 (GNU/Linux)
 Comment: Using GnuPG with SUSE - http://enigmail.mozdev.org

 iD8DBQFHTruhfNj5A+QkLMoRAmWgAJ9Uf8WKBwLO2+f+SKy10Myg9lCKBACgsqTW
 nlBV8CeSlHz0M3ouWTgJ4J8=
 =aUrx
 -END PGP SIGNATURE-

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



-- 
blog: http://www.midstorm.org/~telles/
e-mail / jabber: [EMAIL PROTECTED]
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] DELETE LENTO

2007-11-29 Por tôpico Igor
Isso vcs, fazem com o banco em produção?

Fabio Telles escreveu:
 Em 29/11/07, Dickson Guedes[EMAIL PROTECTED] escreveu:
   
 -BEGIN PGP SIGNED MESSAGE-
 Hash: SHA1

 Fabio Telles escreveu:
 
 Em QUALQUER operação de carga, seja UPDATE, INSERT ou DELETE, você
 deveria desabilitar todos constraints, triggers, índices, etc.
   
 Para desabilitar as Triggers no PG eu posso executar um /ALTER TABLE/
 ou posso utilizar /-X disable-triggers/ num restore, mas aí vai uma
 pergunta:

 Quando no PostgreSQL eu poderei desabilitar CONSTRAINTS via /ALTER
 TABLE/ por exemplo?
 

 Bom... um ALTER TABLE impede qualquer operação de DML na tabela alvo.
 Porém uma boa idéia seria dar um LOCK em todas tabelas com FKs antes
 de desabilitar seus constraints e só liberar o lock após reestabelecer
 todos os constraints. Eis um dos poucos casos em que um LOCK é
 realmente necessário.

 []s
 Fábio Telles
   
 [ ]s
 Guedes

 -BEGIN PGP SIGNATURE-
 Version: GnuPG v1.4.2 (GNU/Linux)
 Comment: Using GnuPG with SUSE - http://enigmail.mozdev.org

 iD8DBQFHTruhfNj5A+QkLMoRAmWgAJ9Uf8WKBwLO2+f+SKy10Myg9lCKBACgsqTW
 nlBV8CeSlHz0M3ouWTgJ4J8=
 =aUrx
 -END PGP SIGNATURE-

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

 


   

-- 
[]'s
Igor C. Batista
msn: [EMAIL PROTECTED]
skype: mld_crark

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


Re: [pgbr-geral] DELETE LENTO

2007-11-29 Por tôpico Leandro DUTRA
2007/11/29, Fabio Telles [EMAIL PROTECTED]:
 Em 29/11/07, Leandro DUTRA[EMAIL PROTECTED] escreveu:
  2007/11/29, Fabio Telles [EMAIL PROTECTED]:
  
   Em QUALQUER operação de carga, seja UPDATE, INSERT ou DELETE, você
   deveria desabilitar todos constraints, triggers, índices, etc. Só
   depois de concluída a transação você habilita/recria tudo novamente.
 
  Telles, isso vale também para o TRUNCATE?  No Oracle ele é análogo ao
  exp DIRECT = Y, passando por fora de todo tipo de conferência.
  Conceitualmente, nem devia fazer parte da linguagem SQL.
[…]
 Em qualquer uma das situações, o TRUNCATE não dispara nenhum gatilho
 ON DELETE. O DELETE não é utilizado, e sim um DROP e CREATE. Sendo
 assim o TRUNCATE não é uma operação de DML e sim de DDL.

Ah, agora entendi o que você quis dizer.  Eu estava pensando em
desempenho de conferência de restrições e reindexação.

Sim, a grande sacada do TRUNCATE é ser DDL; então índices não vão
fazer diferença, e serão recriados duma vez só.

-- 
+55 (11) 5685 2219   xmpp:[EMAIL PROTECTED]
+55 (11) 9406 7191  Yahoo!: ymsgr:sendIM?lgcdutra
+55 (11) 3040 7300  ICQ/AIM: aim:GoIM?screenname=61287803
MSN: msnim:[EMAIL PROTECTED]
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] DELETE LENTO

2007-11-29 Por tôpico Fabio Telles
 Desculpe fazer você escrever, mas na verdade eu vou reformular a minha
 pergunta:

 No lugar de:

 Quando no PostgreSQL eu poderei desabilitar CONSTRAINTS via /ALTER
 TABLE/ por exemplo?


 Favor ler:

 Em qual versão do PostgreSQL eu poderei utilizar o comando

 ALTER TABLE tabela DISABLE CONSTRAINT nome_constraint;?

 Para desabilitar a Constraint sem precisar exlui-la.

De acordo com a documentação, a partir da versão 8.1

[]s
Fábio Telles
-- 
blog: http://www.midstorm.org/~telles/
e-mail / jabber: [EMAIL PROTECTED]
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] DELETE LENTO

2007-11-29 Por tôpico Euler Taveira de Oliveira
Dickson Guedes wrote:

 Em qual versão do PostgreSQL eu poderei utilizar o comando
 
 ALTER TABLE tabela DISABLE CONSTRAINT nome_constraint;?
 
 Para desabilitar a Constraint sem precisar exlui-la.
 
Em nenhuma! Porque isto não está implementado e nem sei se vai ser
implementado...


-- 
  Euler Taveira de Oliveira
  http://www.timbira.com/
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] DELETE LENTO

2007-11-29 Por tôpico Fabio Telles
Em 29/11/07, Igor[EMAIL PROTECTED] escreveu:
 Isso vcs, fazem com o banco em produção?

Com certeza! Imagine uma operação de virada de mês ou ano onde uma
série de registros são excluídos de uma tabela... o DELETE é o cão!

[]s
Fábio Telles

 Fabio Telles escreveu:
  Em 29/11/07, Dickson Guedes[EMAIL PROTECTED] escreveu:
 
  -BEGIN PGP SIGNED MESSAGE-
  Hash: SHA1
 
  Fabio Telles escreveu:
 
  Em QUALQUER operação de carga, seja UPDATE, INSERT ou DELETE, você
  deveria desabilitar todos constraints, triggers, índices, etc.
 
  Para desabilitar as Triggers no PG eu posso executar um /ALTER TABLE/
  ou posso utilizar /-X disable-triggers/ num restore, mas aí vai uma
  pergunta:
 
  Quando no PostgreSQL eu poderei desabilitar CONSTRAINTS via /ALTER
  TABLE/ por exemplo?
 
 
  Bom... um ALTER TABLE impede qualquer operação de DML na tabela alvo.
  Porém uma boa idéia seria dar um LOCK em todas tabelas com FKs antes
  de desabilitar seus constraints e só liberar o lock após reestabelecer
  todos os constraints. Eis um dos poucos casos em que um LOCK é
  realmente necessário.
 
  []s
  Fábio Telles
 
  [ ]s
  Guedes
 
  -BEGIN PGP SIGNATURE-
  Version: GnuPG v1.4.2 (GNU/Linux)
  Comment: Using GnuPG with SUSE - http://enigmail.mozdev.org
 
  iD8DBQFHTruhfNj5A+QkLMoRAmWgAJ9Uf8WKBwLO2+f+SKy10Myg9lCKBACgsqTW
  nlBV8CeSlHz0M3ouWTgJ4J8=
  =aUrx
  -END PGP SIGNATURE-
 
  ___
  pgbr-geral mailing list
  pgbr-geral@listas.postgresql.org.br
  https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
 
 
 
 
 

 --
 []'s
 Igor C. Batista
 msn: [EMAIL PROTECTED]
 skype: mld_crark

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



-- 
blog: http://www.midstorm.org/~telles/
e-mail / jabber: [EMAIL PROTECTED]
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] DELETE LENTO

2007-11-29 Por tôpico Euler Taveira de Oliveira
Fabio Telles wrote:

 ALTER TABLE tabela DISABLE CONSTRAINT nome_constraint;?

 Para desabilitar a Constraint sem precisar exlui-la.
 
 De acordo com a documentação, a partir da versão 8.1
 
Acho que você se enganou... Você pode desabilitar gatilhos mas *não* os
gatilhos de chave estrangeira (vide manual em ALTER TABLE). A única
maneira de não fazer a verificação de integridade referencial é
removendo a restrição.


-- 
  Euler Taveira de Oliveira
  http://www.timbira.com/
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] DELETE LENTO

2007-11-28 Por tôpico Brasil Software
Pessoal !
Estou com um grande problema, migrei minha base do firebird para 
postgresql e quando estou deletando um registro o tempo
chega a ser vergonhoso em relação ao firebird.

Alguem pode me ajudar.
minha base tem:
293 tabelas
algumas com 2 milhões de registros.



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


Re: [pgbr-geral] Delete/Update with ORDER BY

2007-10-26 Por tôpico Roberto Baselio Lopes
Não sei se é isso mas eu faria o seguinte

select @var=0 from dual;

e depois

update teste set coluna1 = (@[EMAIL PROTECTED] + 1)

ou criaria uma sequence e

update teste set coluna1 = (sequence.nextval)




Em 26/10/07, Antonio Nascimento [EMAIL PROTECTED] escreveu:

 CREATE TABLE teste
 (
  coluna1 integer NOT NULL,
 CONSTRAINT chaveprimaria PRIMARY KEY (coluna1)
 )
 WITHOUT OIDS;

 INSERT INTO teste(coluna1) VALUES (1);
 INSERT INTO teste(coluna1) VALUES (2);

 Depois dos inserts (After inserts)

 {teste}
 |coluna1|
 | 1|
 | 2*   |

 update teste set coluna1 = (coluna1 + 1)

 coluna1 =  1   +   1
 coluna1 = 2*

 ERRO: duplicar chave viola a restrição de unicidade chaveprimaria
 SQL state: 23505
 primary key violation...

 Antonio







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




-- 
Roberto Baselio Lopes
e-mail / Google Talk: [EMAIL PROTECTED]
msn: [EMAIL PROTECTED]
Curriculo: http://www2.curriculum.com.br/ucn/rbaselio
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] Delete/Update with ORDER BY

2007-10-25 Por tôpico Evandro Andersen
Sorry, I expressed evil
The problem happens with the UPDATE
An example of the error below:

CREATE TABLE teste
(
 coluna1 integer NOT NULL,
 CONSTRAINT chaveprimaria PRIMARY KEY (coluna1)
)
WITHOUT OIDS;


INSERT INTO teste(coluna1) VALUES (1);
INSERT INTO teste(coluna1) VALUES (2);

update teste set coluna1 = (coluna1 + 1)


ERRO: duplicar chave viola a restrição de unicidade chaveprimaria
SQL state: 23505

I can do in MySQL and Oracle 

update teste set coluna1 = (coluna1 + 1) ORDER BY COLUNA1 DESC



Evandro Andersen
Brazil



2007/10/25, Roberts, Jon [EMAIL PROTECTED]:
 I have never seen order by in a delete statement in Oracle so I tested it.
 
 
 SQL*Plus: Release 10.2.0.1.0 - Production on Thu Oct 25 07:45:50 2007
 
 Copyright (c) 1982, 2005, Oracle.  All rights reserved.
 
 SQL connect / as sysdba
 Connected.
 SQL create table a (a1 number, a2 number);
 
 Table created.
 
 SQL delete from a where a1 = 10 order by a2;
 delete from a where a1 = 10 order by a2
 *
 ERROR at line 1:
 ORA-00933: SQL command not properly ended
 
 Sure enough, it doesn't work.  What are you trying to do with an order by on
 a delete?
 
 
 Jon
 
 -Original Message-
 From: Evandro Andersen [mailto:[EMAIL PROTECTED]
 Sent: Thursday, October 25, 2007 7:25 AM
 To: [EMAIL PROTECTED]
 Subject: [GENERAL] Delete/Update with ORDER BY
 
 In Oracle you can use this:
 
 
 
 DELETE FROM A WHERE A1 = 10 ORDER BY A2
 
 
 
 There is something in the Postgresql ?
 
 
 
 Evandro Andersen
 
 Brazil
 
 Postgresql 8.2
 
 
 
 
 





  Abra sua conta no Yahoo! Mail, o único sem limite de espaço para 
armazenamento!
http://br.mail.yahoo.com/
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Delete/Update with ORDER BY

2007-10-25 Por tôpico Leandro DUTRA
2007/10/25, Evandro Andersen [EMAIL PROTECTED]:
 Sorry, I expressed evil

Realmente é /evil/ escrever inglês aqui…

Mais um motivo para eviter /cross‐posting/.

-- 
+55 (11) 5685 2219   xmpp:[EMAIL PROTECTED]
+55 (11) 9406 7191  Yahoo!: ymsgr:sendIM?lgcdutra
+55 (11) 5686 9607  ICQ/AIM: aim:GoIM?screenname=61287803
MSN: msnim:[EMAIL PROTECTED]
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] delete com join

2007-09-15 Por tôpico icjunior07
Se eu mudar o parametro #add_missing_from 

para ON , ele ira funcionar normalmente com o delete normal sem usar o 
parametro USING?

pois com a versao 8.0.0.1 eu faco normal o delete

DELETE FROM TABELA1 WHERE ID = TABELA2.ID 

e na 8.2.4 tenho que fazer:

DELETE FROM TABELA1 USING TABELA2 WHERE ID=TABELA2.ID

se descomentar e colocar para ON  funciona?

Valeu pela ajuda galera, 

[]´s

Ismael Costa Junior


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


[pgbr-geral] delete com join

2007-09-14 Por tôpico icjunior07
Saudacoes a todos, 

Eu estou tentando fazer umas exclusoes em algumas tabelas do meu banco de 
dados, com a versao 8.2.4, com o
seguinte comando:

delete from tabela_financeiro
where id_cliente=tabela_financeiro_dup.id_cliente and 
id_loja=tabela_financeiro_dup.id_loja and
id_motorista=tabela_financeiro_dup.id_motorista and 
data=tabela_financeiro_dup.data and
pdv=tabela_financeiro_dup.pdv 
and cupom=tabela_financeiro_dup.cupom and valor=tabela_financeiro_dup.valor 

So que na hora em que executo aparece o seguinte erro:

ERROR: missing FROM-clause entry for table tabela_financeiro_dup
SQL state: 42P01
Character: 50

Ate a versao 8.0.0.1 que eu tenho em algumas bases este comando funciona 
normal, mas nesta nova versao nao rolou..
Eu dei uma pesquisada na documentacao e nao consegui encontrar algo sobre isso.
Procurei algumas sintaxes de delete com inner join , tentei usar , mas tb nao 
funcionou.

Alguem se deparou com algo assim?

Obrigado, 

Ismael Costa Junior


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


[pgbr-geral] delete com join

2007-09-14 Por tôpico icjunior07
Fala galera, 

eu pesquisei mais um pouco e consegui encontrar um comando que satisfez meu 
delete..

eu utilizei a clausula using nome_tabela

ficando assim meu delete:

delete from tabela_financeiro using tabela_financeiro_dup 
where tabela_financeiro.id_cliente=tabela_financeiro_dup.id_cliente and
tabela_financeiro.id_loja=tabela_financeiro_dup.id_loja 
and tabela_financeiro.id_motorista=tabela_financeiro_dup.id_motorista and
tabela_financeiro.data=tabela_financeiro_dup.data 
and tabela_financeiro.pdv=tabela_financeiro_dup.pdv 
and tabela_financeiro.cupom=tabela_financeiro_dup.cupom and 
tabela_financeiro.valor=tabela_financeiro_dup.valor 

Obrigado a todos, 

Ismael Costa Junior


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


Re: [pgbr-geral] delete com join

2007-09-14 Por tôpico Fabricio Fagundes
Que legal q conseguiu, mas vc pode tambem configurar isso no arquivo 
Postgresql.conf

La dentro tem um paramentro: add_missing_from  coloque ele como true,

Apessar disso nao ser muito recomendado, pois apartir da versao 8.1(se, nao
me engano) isso foi adicionado no postgresql, para gerar mais segurança ao
banco.

Fabricio Fagundes
[EMAIL PROTECTED]





Em 14/09/07, icjunior07 [EMAIL PROTECTED] escreveu:

 Fala galera,

 eu pesquisei mais um pouco e consegui encontrar um comando que satisfez
 meu delete..

 eu utilizei a clausula using nome_tabela

 ficando assim meu delete:

 delete from tabela_financeiro using tabela_financeiro_dup
 where tabela_financeiro.id_cliente=tabela_financeiro_dup.id_cliente and
 tabela_financeiro.id_loja=tabela_financeiro_dup.id_loja
 and tabela_financeiro.id_motorista=tabela_financeiro_dup.id_motorista and
 tabela_financeiro.data=tabela_financeiro_dup.data
 and tabela_financeiro.pdv=tabela_financeiro_dup.pdv
 and tabela_financeiro.cupom=tabela_financeiro_dup.cupom and
 tabela_financeiro.valor=tabela_financeiro_dup.valor

 Obrigado a todos,

 Ismael Costa Junior


 ___
 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


Re: [pgbr-geral] delete com join

2007-09-14 Por tôpico Osvaldo Kussama

--- Leandro Diniz Soares [EMAIL PROTECTED]
escreveu:

 Amigo,
 
 Sou novato em banco de dados... Na verdade trabalho
 com sites e usava o
 mysql. Mas agora estou entrando no postgresql.
 
 Esse seu delete vai apagar o registro da tabela
 principal e dos registros
 relacionados?
 
 Pq eu vi que quando montamos o banco podemos definir
 isso nos
 relacionamentos... Correto?
 
 No mysql tinha que fazer tudo na mão...
 
 Já que vc tem experiência teria como dar uma pequena
 explicação?
 
 Obrigado!
 
 
 Em 14/09/07, icjunior07 [EMAIL PROTECTED]
 escreveu:
 
  Fala galera,
 
  eu pesquisei mais um pouco e consegui encontrar um
 comando que satisfez
  meu delete..
 
  eu utilizei a clausula using nome_tabela
 
  ficando assim meu delete:
 
  delete from tabela_financeiro using
 tabela_financeiro_dup
  where

tabela_financeiro.id_cliente=tabela_financeiro_dup.id_cliente
 and
 

tabela_financeiro.id_loja=tabela_financeiro_dup.id_loja
  and

tabela_financeiro.id_motorista=tabela_financeiro_dup.id_motorista
 and
  tabela_financeiro.data=tabela_financeiro_dup.data
  and
 tabela_financeiro.pdv=tabela_financeiro_dup.pdv
  and
 tabela_financeiro.cupom=tabela_financeiro_dup.cupom
 and
 
 tabela_financeiro.valor=tabela_financeiro_dup.valor
 


Dê uma olhada em:
http://pgdocptbr.sourceforge.net/pg82/sql-createtable.html
particularmente na cláusula REFERENCES o item ON
DELETE. 

Osvaldo




  Flickr agora em português. Você clica, todo mundo vê.
http://www.flickr.com.br/
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral