|
|||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
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);
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.
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 | D6Se 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 | D6Para inverter a ordem, para que os alfanuméricos venham antes dos numéricos, use order by number desc, code.
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).
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.)
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 haroldVocê 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.
| ||||||||||||||||||||||||||||||||||||||
Comments and Corrections are welcome. Suggestions and contributions of items are also welcome. Send them in!. Copyright A. Elein Mustain 2003 |