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';