sexta-feira, 6 de março de 2009

Triggers


O problema enfrentado foi criar registros em uma tabela que contenha a quantidade de página e as páginas. Por exemplo, caso o número de páginas seja 10, necessita-se 10 registros com as páginas de 1 a 10.

Para resolver isso, optou-se de utilizar gatilhos (TRIGGERS) na tabela ufcaio. Para cada operação nesta tabela reflete-se na tabela ufcaio_destino.
Tabela destino igual a tabela origem

CREATE TABLE teste.ufcaio_destino
(
uf character varying,
estado character varying,
paginas integer,
pagina integer
)
WITHOUT OIDS;
ALTER TABLE teste.ufcaio_destino OWNER TO postgres;

Tabela origem.

CREATE TABLE teste.ufcaio
(
uf character varying,
estado character varying,
paginas integer,
pagina integer
)
WITHOUT OIDS;
ALTER TABLE teste.ufcaio OWNER TO postgres;

Associando um Trigger na tabela origem.

CREATE TRIGGER ufcaio_trigger
AFTER INSERT OR UPDATE OR DELETE
ON teste.ufcaio
FOR EACH ROW
EXECUTE PROCEDURE teste.ufcaio();

Função chamada pelo Trigger.

CREATE OR REPLACE FUNCTION teste.ufcaio()

RETURNS trigger AS
$BODY$
BEGIN
--
IF (TG_OP = 'DELETE') THEN
delete from teste.ufcaio_destino where uf=OLD.uf;
return OLD;
ELSIF (TG_OP = 'UPDATE') THEN
delete from teste.ufcaio_destino where uf=NEW.uf;
FOR i IN 1..NEW.paginas LOOP
insert into teste.ufcaio_destino (uf, estado, paginas, pagina) values (NEW.uf, NEW.estado, NEW.paginas, i);
END LOOP;
RETURN NEW;
ELSIF (TG_OP = 'INSERT') THEN
delete from teste.ufcaio_destino where uf=NEW.uf;
FOR i IN 1..NEW.paginas LOOP
insert into teste.ufcaio_destino (uf, estado, paginas, pagina) values (NEW.uf, NEW.estado, NEW.paginas, i);
END LOOP;
RETURN NEW;
END IF;
RETURN NULL; -- result is ignored since this is an AFTER trigger
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION teste.ufcaio() OWNER TO postgres;

quinta-feira, 5 de março de 2009

Criando um Database novo Postgres

Hoje necessitei criar um Database novo no PostgreSQL

Criar uma pasta para acomodar o Database
mkdir /usr/local/pgsql/data

Atribuir a propriedade para o usuário postgres
chown postgres /usr/local/pgsql/data

Mudar para usuário postgres
su - postgres

Criar o Database com a aplicação initbd
/usr/local/pgsql/bin/initdb -D -A /usr/local/pgsql/data --locale='UTF-8'

Atualizar no arquivo postgres.conf as porta e a possibilidade de acesso por clientes remotos.
listen_addresses = '*'
port = 5433

Atualizar o arquivo pg_hba.conf para aceitar conexão por qualquer computador da rede 10.68.0.0
host all all 10.68.0.0/8 md5

Ligar o Banco de Dados
postmaster -i -D /usr/local/pgsql/data >>logfile 2>&1 &

Desligar o Banco de Dados
pg_ctl stop -D /usr/local/pgsql/data -w

Alterar a senha do postgres (comando SQL)
ALTER USER davide WITH PASSWORD 'hu8jmn3';

quarta-feira, 7 de janeiro de 2009

São Silvestre 2008




Site com resultado oficial da corrida: Meu número foi 14781

Passando pela linha de chegada
link


Após a chegada, eu estou me arrastando.

terça-feira, 23 de dezembro de 2008

cron com SUSE 11

Tentei por alguns dias fazer funcionar o cron em um SUSE 11.o com insucesso.

O programa (script) que desenvolvi funcionava perfeitamente como usuário root, porém no cron não funcionou.

Uma das formas de verificar o funcionamento do cron é através do comando abaixo.

tail /var/log/messages

Neste arquivo são armazendos as mensagens de execução do cron.

Programei cron através do comando:

crontab -u root -e

* * * * * date > /root/teste

Este script é executado a cada minuto. É armazenado no arquivo teste a data e hora a cada minuto.

Porém o meu script não funcionava no cron.

Após alguns testes, descobri que é necessário definir no script os arquivos com o caminho absoluto, e eu havia definido com caminho relativo.

Extrai uma coluna de uma lista

O meu problema é extrair uma coluna de uma lista. Por exemplo, com o comando

ps -aux


recebo

root 3399 0.0 0.0 1580 612 ? S Dec22 0:00 syslogd -m 0
root 3403 0.0 0.0 1524 468 ? S Dec22 0:00 klogd -x
root 3414 0.0 0.0 1512 448 ? S Dec22 0:04 irqbalance
rpc 3432 0.0 0.0 1676 568 ? S Dec22 0:00 portmap
rpcuser 3452 0.0 0.0 1664 720 ? S Dec22 0:00 rpc.statd
root 3464 0.0 0.0 1572 400 ? S Dec22 0:00 mdadm --monitor -
root 3481 0.0 0.0 83556 604 ? S Dec22 0:00 /sbin/auditd
root 3569 0.0 0.0 7592 1916 ? S Dec22 0:01 cupsd
root 3594 0.0 0.0 3656 1572 ? S Dec22 0:00 /usr/sbin/sshd
root 3610 0.0 0.0 2136 900 ? S Dec22 0:00 xinetd -stayalive
root 3639 0.0 0.0 6100 2580 ? S Dec22 0:01 sendmail: accepti
smmsp 3648 0.0 0.0 5992 2292 ? S Dec22 0:00 sendmail: Queue r
root 3659 0.0 0.0 1568 472 ? S Dec22 0:00 gpm -t imps2 -m /
root 3669 0.0 0.0 1600 640 ? S Dec22 0:00 crond
xfs 3693 0.0 0.0 5452 3112 ? S Dec22 0:00 xfs -droppriv -da
daemon 3703 0.0 0.0 1584 580 ? S Dec22 0:00 /usr/sbin/atd
root 3735 0.0 0.1 11644 5232 ? S Dec22 0:00 /opt/fgs/www/bin/
apache 3746 0.0 0.1 11776 5328 ? S Dec22 0:00 /opt/fgs/www/bin/
apache 3747 0.0 0.1 11776 5328 ? S Dec22 0:00 /opt/fgs/www/bin/
apache 3748 0.0 0.1 11776 5328 ? S Dec22 0:00 /opt/fgs/www/bin/
root 3756 0.0 0.0 4244 1116 ? S Dec22 0:00 sh /usr/RaidMan/R
root 3760 0.5 0.4 228124 19852 ? S Dec22 9:51 ./jre/bin/java -D
root 3772 0.0 0.0 1504 432 tty2 S Dec22 0:00 /sbin/mingetty tt
root 3773 0.0 0.0 1504 432 tty3 S Dec22 0:00 /sbin/mingetty tt
root 3774 0.0 0.0 1504 428 tty4 S Dec22 0:00 /sbin/mingetty tt
root 3775 0.0 0.0 1496 424 tty5 S Dec22 0:00 /sbin/mingetty tt
root 3776 0.0 0.0 1496 424 tty6 S Dec22 0:00 /sbin/mingetty tt

Desta lista necessito retirar a segunda coluna.

Com o comando abaixo é possível obter somente as informações da segunda coluna.

ps -aux | awk '{ print $2 }'

Recebo:

3399
3403
3414
3432
3452
3464
3481
3569
3594
3610
3639
3648
3659
3669
3693
3703
3735
3746
3747
3748
3756
3760
3772
3773
3774
3775
3776

E qual a finalidade disso?

Uma utilidade para o meu dia a dia, necessito matar os processos do Postgres.

ps -aux | grep postgres: | awk '{ print $2 } ' | while read l; do echo 'kill ' $l ; done

ps -axu - lista os processos

grep postgres: - seleciona os processo postgres:

awk '{ print $2 }' - retira a segunda coluna da lista de processo

while read l - coloca na variável l o número do processo

do echo 'kill' $l - escreve no monitor o comando kill número do processo. Caso deseje realmente apagar o processo, utilize o comando do kill $l.

Ajudas de Carlos Eduardo de Andrade Brasileiro e Frederico Meireles Palma

sexta-feira, 19 de dezembro de 2008

Comando para apagar em lote

O meu problema é apagar um conjunto de arquivo por lote. Poderia ser utilizado o comando

rm *.pdf

Mas, caso existam muitos arquivos em uma pasta ou os arquivos estejam em pastas diferentes não é possível utilizar este comando.

O comando abaixo procura todos os arquivos .pdf e apaga-os.

find . -name *.pdf | while read LINHA; do rm $LINHA ; done

quarta-feira, 19 de novembro de 2008

Busca arquivo diretorio Linux

Colaboração: Ricardo Jurczyk Pinheiro

Data de Publicação: 19 de November de 2008

Uma necessidade que tenho vez por outra, no Linux, é descobrir em que
arquivo de configuração, dentro do /etc, devo mexer. Como o /etc tem vários
diretórios, e dentro deles outros arquivos, acabei desenvolvendo uma solução
"rápida e suja", que funciona muito bem:


#!/bin/sh
#
# Pesquisa - Encontra um padrao dentro de uma lista de arquivos
# numa arvore de diretorios
# Autor: Ricardo Jurczyk Pinheiro - ricardojpinheiro@ibest.com.br
# Versao 0.
000000000000000000000000000000000000000000000000000001
#
#
if [ $# -ne 2 ]; then
echo "$0 (palavra a ser procurada) (arvore de diretorios)"
exit 1
else
for nome in $(find $2 -type f | sort | uniq); do
echo $nome
cat $nome | grep $1
done
fi

E basta fazer um pipe com o less, que resolve o problema de excesso de informações na tela.

Ricardo Jurczyk Pinheiro - Linux user #82838 - http://estudiodaintrospeccao.blogspot.com