AE
By A. Elein Mustain
Traduzidos por Juliano da Silva Ignacio
General Bits 21-Jul-2003 Edição: 35


General Bits é uma coluna baseada na lista de discussão do PostgreSQL pgsql-general.
Para saber mais sobre a lista de discussão pgsql-general e sobre o PostgreSQL, procure em http://www.postgresql.org/.
Arquivos
General Tidbits
Artigos Português
Artículos en Castellanos
7.4 Documentación
Google General Bits
Notícias
Para receber um aviso via email sobre as novas edições do General Bits, envie um email para Elein.
PostgreSQL Consulting, Support & Training
Assinaturas
 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Pulos na Sequência
[GENERAL] Como encontrar Sequências Faltantes 15/Jul/2003

As sequências são garantidas de serem únicas e em ordem numérica, mas elas não são garantidas para serem sequenciais. Algumas sequências são usadas temporariamente (cached) pelas consultas e se não for usada, ela é pulada. Registros também podem ser removidos no meio de uma sequência. Isto tudo está de acordo sobre como as sequências devem funcionar.

Ocasionalmente você deve achar que você precisa saber onde os buracos estão na sua sequência. Isto é muito raro se as sequências estiverem ligadas à sua unicidade e à própria necessidade de ordenação. Claro que, se números pulados são importantes assim, você pode quere usar alguma outra coisa ao invés da sequência...

A instrução SQL abaixo deveria ser capaz de encontrar os buracos da sequência na sua tabela. Isto foi deixado como um exercício aos leitores para escrever esta solução como uma função em plpython, guardando os valores anteriores em SD[], eliminando a necessidade de ter que criar uma subconsulta com EXISTS. :-)

SELECT
  CASE WHEN start = finish THEN start::text
       ELSE start || '-' || finish END AS gap
FROM (
  SELECT hole.id AS start, MIN(f.id)-1 AS finish
  FROM fred f, (
    SELECT id+1 AS id FROM fred f1
    WHERE NOT EXISTS (SELECT 1 FROM fred f2 WHERE f2.id = f1.id+1)
  ) AS hole
  WHERE f.id > hole.id
  GROUP BY 1
) AS wilma;


Aqui está a tabela que eu usei para testar:

CREATE TABLE fred (
  id INTEGER PRIMARY KEY
);

INSERT INTO fred VALUES (1);
INSERT INTO fred VALUES (2);
INSERT INTO fred VALUES (3);
INSERT INTO fred VALUES (5);
INSERT INTO fred VALUES (6);
INSERT INTO fred VALUES (7);
INSERT INTO fred VALUES (10);
INSERT INTO fred VALUES (16);
INSERT INTO fred VALUES (18);
INSERT INTO fred VALUES (30);

Colaboradores: Madhavi Daroor madhavi em zoniac.com, Henshall Stuart shenshall em tnp-southwest.co.uk, greg em turnstep.com

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Notas sobre Liberações de Versão
[GENERAL] Onde posso encontrar anotações sobre a liberação da versão 7.3.3? 17/Jul/2003

Anotações sobre liberação de versões vêem com a última liberação na documentação do Guia do Administrador inserido na instalação do sistema PostgreSQL ou podem ser encontrados na página Links para Documentos do PostgreSQL . Procure no Apêndice A do Guia do Administrador.

Para ver a última versão mais recente você pode procurar nos documentos por última versão de desenvolvimento .

Se você está tentando se decidir por fazer uma atualização ou não, é fortemente recomentado que você reveja as mudanças entre as versões liberadas, para então, poder fazer a escolha com mais informações e tempo.

Colaboradores: P G pg_dba em yahoo.com, Alvaro Herrera alvherre em dcc.uchile.cl, Henrik Steffen steffen em city-map.de, Tom Lane tgl em sss.pgh.pa.us

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Ordenação Alfanumérica
[SQL] ordenação numérica em dados mistos alfa/numéricos 16/Jul/2003

Quando você tem um campo alfanumérico, a ordem natural será sempre alfabética. Isto significa que 11 virá antes de 3, por exemplo.

Se sua tabela contém:

	select * from an_test order by code;
	  name   | code 
	---------+------
	 one     | 1
	 eleven  | 11
	 three   | 3
	 five    | 5
	 seven   | 7
	 nine    | 9
	 A-two   | A1
	 A-four  | A4
	 C-ten   | C10
	 C-eight | C8
	 B-six   | D6
Se você quer ordenar sua coluna numericamente por números e alfabeticamente com caracteres, use uma subconsulta para criar uma coluna do tipo inteiro para números e NULLos para as colunas alfanuméricas. Lembre-se que na ordenação, NULLos aparecem no final. Então, usando uma subconsulta, ordene a nova coluna e a coluna do código.
	select name, code from
		( select *, 
			(case when code ~ '^[0-9]+' 
			then code::integer
			else NULL
			end) as number 
		from an_test ) foo
order by number, code;

	  name   | code 
	---------+------
	 one     | 1
	 three   | 3
	 five    | 5
	 seven   | 7
	 nine    | 9
	 eleven  | 11
	 A-two   | A1
	 A-four  | A4
	 C-ten   | C10
	 C-eight | C8
	 B-six   | D6
Para inverter a ordem, para que os alfanuméricos venham antes dos numéricos, use order by number desc, code.

Colaboradores: Dmitry Tkach dmitry em openratings.com, Gary Stainburn gary.stainburn em ringways.co.uk, Bruno Wolff III bruno em wolff.to, elein em varlena.com

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

A Ordem Faz Diferença no arquivo pg_hba.conf
[GENERAL] Ajuda com previlégios ou arquivo pg_hba.conf 19/Jul/2003

Você pode usar o arquivo pg_hba.conf para restringir um usuário a um banco de dados particular. O arquivo pg_hba.conf geralmente se encontra no seu diretório PGDATA e geralmente pertence ap usuário postgres. Este é o arquivo que habilita e desabilita as conexões com sua base de dados.

Se você quer permitir à qualquer um acessar mas limitar o acesso do usuário cool para cool somente base de dados, configure o arquivo pg_hba.conf como mostrado a seguir:

# If you want to allow non-local connections, you need to add more
# "host" records.  Also, remember TCP/IP connections are only enabled
# if you enable "tcpip_socket" in postgresql.conf.

# TYPE  DATABASE USER   IP-ADDRESS   IP-MASK           METHOD

# For user cool on db cool
local  cool     cool                                   password sameuser
host    all     cool    127.0.0.1    255.255.255.255   reject
host    all     cool    x.x.x.x      255.255.255.224   reject
host    all     cool    192.168.0.0  255.255.255.0     reject
#For local others
local   all      all                                   password sameuser
host    all      all    127.0.0.1    255.255.255.255   trust
host    all      all    x.x.x.x      255.255.255.224   trust
#
A ordem das entradas fazem diferença. Quando cool acessa o o PostgreSQL, as primeiras linhas contém o nome do usuário e a base de dados que serão aplicadas. O usuário cool pode acessar cool e nada mais. Outros continuam e podem acessar todos as bases de dados locais ou especificadas pelo número IP (x.x.x.x).

Colaboradores: Arcadius A. ahouans em sh.cvut.cz, Richard Poole RP at JALAPENO.CRAZYDOGS.ORG, Andrew Gould andrewgould em yahoo.com

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Usando variáveis em scripts SQL
[GENERAL] qual e o escopo dos valores de parâmetros do psql? 17/Jul/2003

Você pode configurar e usar suas próprias variáveis SQL dentro de uma sessão do psql ou em um script SQL executado pelo psql. Mostrar as variáveis SQL não é bem documentado (Eu não encontrei nada.)

commando função
\set mostra todo conjunto de variáveis SQL
\set foo bar configura a variável SQL foo com o valor bar

Para ver uma variável SQL em uma sessão interativa ou por registro, tente \echo. Aqui nós estamos configurando foo para "harold" e mostrando ele.

	e=# \set foo harold
	e=# \echo Variable foo is set to :foo
	Variable foo is set to harold
Você pode usar as variáveis SQL na prática (e de maneiras não muito práticas). Aqui a variável SQL é usada como um nome de função e então, a função é executada usando o nome da variável SQL.
	e=# \set when now()
	e=# \echo :when
	now()
	elein=# select :when;
              	now              
	-------------------------------
 	2003-07-20 18:39:24.339276-07
	(1 row)

Claro que as variáveis SQL podem ser usadas em instruções SQL ordinárias.

	e=# \set newuser huey
	e=# insert into users (user_id, user_name) values (99,:newuser);
	INSERT 2037329 1

Há um cuidado no entanto, se o nome da variável SQL :foo estiver entre aspas, ela não será avaliada. Preste atenção quando o registro do usuário foi inserido acima, user_name é um campo texto mas ele não requer aspas. No entanto, se você for criar, por exemplo, uma função, você não poderia usar uma variável SQL na função porque o corpo da função está entre aspas.

Quando várias trocas globais de variáveis são necessárias mas, a tarefa é simples e direta, você também pode escrever somente um "shell script" (arquivo de lote) onde as variáveis do shell são substituídas quando você precisar delas.

Você irá precisar usar aspas simples neste caso. Também, se você quiser criar uma função em plpgsql em um "script bash", você terá que colocar barra invertida com sinais de dólar para os parâmetros em plpgsql no corpo da função.

Usando consultas diretas você pode consultar o banco de dados de dentro do "shell script" usando as opções -Atc em um comando de marcação. No caso abaixo, algumas permissões de gerenciamento estão sendo feitas com uma função booleana (lógica) canupdateusers().

	#!/bin/bash

	# valida as variáveis em tempo de execução
	user_id=$1
	user_name=$2

	# qual base de dados?
	echo "Entre com o nome da base de dados (default é $USER):"
	read db
	[ -z $db ] && db=$USER

	perm=`psql -Atc "select canupdateusers( $USER );"`;
	if [ $perm != 't' ]
	then
		echo "$User não tem permissão para atualizar a tabela de usuários."
		exit 1;
	fi

	pgsql $db << END

	insert into users (user_id, user_name) values ( $user_id , '$user_name' );

	END
	exit 0;

Ambos, variáveis SQL e "shell scripts" com variáveis, são particularmente úteis em manter e atualizar esquemas em múltiplas bases de dados.

Colaboradores: Dick Wieland dick.wieland em wiline.com, Doug McNaught doug em mcnaught.org, Nigel J. Andrews nandrews em investsystems.co.uk, elein at varlena.com


Comments and Corrections are welcome. Suggestions and contributions of items are also welcome. Send them in!.
Copyright A. Elein Mustain 2003

Comentários e Correções são bem vindos. Sugestões e contribuições de itens também são bem vindos. Envie-os!
Copyright A. Elein Mustain 2003, 2004, 2005
Traduzidos por Juliano da Silva Ignacio
Google
Search General Bits & varlena.com Search WWW