Ir para conteúdo
Fórum Script Brasil

Marcel Costa

Membros
  • Total de itens

    4
  • Registro em

  • Última visita

Tudo que Marcel Costa postou

  1. Preciso pegar um valor que esta em uma outra tabela, para conctenar com a matricula Ex.: Matricula antiga: 0123456 Matricula nova: sal0123456 Esse sal > vem do municipio "SALvador" Para pegar o nome do Municipio do campus, fiz uma função, que segue abaixo: CREATE OR REPLACE FUNCTION matricula_aluno(mat_aluno character varying) RETURNS character varying AS $BODY$ DECLARE municipio character varying(20); matriculanova character varying(20); BEGIN Select into municipio mun."MUN_NOME" From aluno a JOIN curso c ON a.curs_cod = c.curs_cod JOIN campus cm ON c.camp_cod = cm.camp_cod JOIN municipios mun ON cm.mun_cod = mun."MUN_COD" Where alun_matricula = mat_aluno; select into municipio substring(municipio from 0 for 4); select into municipio lower(municipio); matriculanova := municipio||mat_aluno; return matriculanova; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION matricula_aluno(character varying) OWNER TO postgres; Essa função, faz todo um select, que chega ate o MUN_NOME, quando o alun_matricula = parametro passado pela função. Essa função esta funcionando. Pega as 3 primeiras letras do municipio e conctena com o número de matricula. Só que, essa função só funciona se eu colocar a TRIGGER como AFTER. Mas, com a trigger em AFTER, a função não consegue inserir no registro. O que eu posso fazer?
  2. Galera, Estou tentando fazer uma trigger de LOG. Quando um usuario da um INSERT, UPDATE ou DELETE, a trigger verifica se a tabela Nome_tabela+_log existe no banco. Se não existe, ele ira criar essa tabela. se existir, ele vai dar um insert com todas informações OLD.* na tabela de LOG. Com o comando abaixo. Esse comando, vai varrer toda tabela e em cada campo da tabela, vai pegar o seu OLD e jogar na tabela LOG: execute 'insert into ' || nome_tabela_log ||'('|| r.coluna ||') values (OLD.' || r.coluna || ');'; Exemplo: insert into produtos_log(cod_prod) values (OLD.cod_prod); So que, quando ele realiza esse comando. esta dando um erro. Segue o erro abaixo: ERRO: faltando entrada para tabela "old" na cláusula FROM LINE 1: insert into produtos_log(cod_prod) values (OLD.cod_prod); ^ QUERY: insert into produtos_log(cod_prod) values (OLD.cod_prod); CONTEXT: PL/pgSQL function "log_tabela" line 41 at comando EXECUTE ********** Error ********** ERRO: faltando entrada para tabela "old" na cláusula FROM SQL state: 42P01 Context: PL/pgSQL function "log_tabela" line 41 at comando EXECUTE Agradeço a todos! Segue a Trigger Abaixo: CREATE OR REPLACE FUNCTION log_tabela() RETURNS trigger AS $BODY$ declare r record; comando text; nome_tabela_log text; nome_tabela text; --cod_prod integer; begin nome_tabela_log := TG_TABLE_NAME || '_log'; -- Atribui o nome da tabela + Log na variavel nome_tabela_log nome_tabela := TG_TABLE_NAME; -- Atriui o nome da tabela a variavel nome_tabela IF ((select count(relname) from pg_class where relname = nome_tabela_log) = 0) -- Verifica se a tabela nome_tabela_log Existe no Banco de Dados then BEGIN -- Se não existe, Ele Cria a tabela e seus campos igual a tabela Principal, adicionando o campo OPERAÇÃO, DATA, Usuario RAISE NOTICE 'Criando Tabela de Log... %',nome_tabela_log; execute 'create table ' || nome_tabela_log || ' as select * from ' || nome_tabela; execute 'alter table ' || nome_tabela_log || ' add column operacao char'; execute 'alter table ' || nome_tabela_log || ' add column data timestamp'; execute 'alter table ' || nome_tabela_log || ' add column usuario varchar'; END; ELSE BEGIN -- Se Existir, ele vai adicionar os campos da tabela principal na Tabela LOG --RAISE NOTICE '%',nome_tabela_log; --RAISE NOTICE '%',nome_tabela; --cod_prod := OLD.cod_prod; --RAISE NOTICE '%',cod_prod; for r in (SELECT a.attname AS coluna FROM pg_attribute AS a JOIN pg_class AS c ON c.oid=a.attrelid AND c.relname !~ '^pg_' JOIN pg_type AS t ON t.oid=a.atttypid LEFT OUTER JOIN pg_attrdef AS d ON c.oid=d.adrelid AND d.adnum=a.attnum WHERE a.attnum>0 AND c.relname = TG_TABLE_NAME ORDER BY a.attnum) loop execute 'insert into ' || nome_tabela_log ||'('|| r.coluna ||') values (OLD.' || r.coluna || ');'; end loop; END; END IF; RETURN NEW; end;$BODY$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION log_tabela() OWNER TO postgres;
  3. Esse codigo abaixo, tem algum a ver com o que eu estou querendo. Quero gerar uma tabela Log_produtos, a partir de todos os campos da tabela Protudos: create table log_produtos as (SELECT a.attname FROM pg_attribute AS a JOIN pg_class AS c ON c.oid=a.attrelid AND c.relname !~ '^pg_' JOIN pg_type AS t ON t.oid=a.atttypid LEFT OUTER JOIN pg_attrdef AS d ON c.oid=d.adrelid AND d.adnum=a.attnum WHERE a.attnum>0 AND c.relname = 'produtos' ORDER BY a.attnum); Agradeço a todos!
  4. Galera, Boa Tarde, Como faço pra fazer uma Trigger Dinamica, que eu possa gravar o Log em um Tabela de Histórico, que pode ser usada em qualquer tabela do meu banco? Agradeço a todos!
×
×
  • Criar Novo...