Em quinta-feira, 1 de setembro de 2011 23:25:54, George R. C. Silva escreveu: > Em quinta-feira, 1 de setembro de 2011 22:04:55, Pedro Cavalheiro escreveu: >> Boa noite a todos! >> >> Fabiano, >> >>> O seu retorno seria os registros do "select"? E se alguém passar um >>> passar >>> um comando "select * from tabela; insert into tabela..." ? O retorno >>> seria o >>> que? >> >> Sim, o retorno deve ser os registros do select. No caso de alguém >> passar uma query multipla, acredito que o mais fácil seria levar em >> conta apenas a última (ignorando os retornos anteriores). Até por isso >> comentei que pode funcionar de um jeito ou de outro (retornando tudo >> ou apenas a última consulta, o que for mais fácil para definir). No >> caso de insert, update ou delete, não é necessário retornar nada. >> >>> O retorno como está não funciona para trazer vários registros, para isso >>> você deve usar um setof com record ou type. >> >> Sim, estou ciente disso. Justamente p or isso que entrei em contato com >> o grupo, não sei como prosseguir. Tentei definir de diversos modos > >> diferentes a combinação de setof, record, entre outros, mas sempre >> recebia algum erro. >> Não entendi bem a sintaxe que precisa ser definida para receber o >> retorno em tabela. >> Queria algo como adicionar os resultados da query numa variável, e >> retornar essa variável (isso é apenas uma explicação, não sei se é >> possível em pgplsql). >> >> Infelizmente, não tenho como criar uma função para criação das querys. >> Já existe um sistema em funcionamento, com diversos consultas >> "gigantescas" que tornam a ideia inviável. >> O único modo de fazer isto é definindo retorno por type? Quais as >> exigências deste tipo? Não existe algum modo mais prático, sem nenhum >> tipo de "filtro", para retornar uma tabela de uma consulta? >> >> Desde já, agradeço pela ajuda. >> >> Abraços a todos. >> >> Atenciosamente, >> Pedro Cavalheiro >> >> Em 1 d e setembro de 2011 20:01, Fabiano Machado Dias >> <[email protected]> escreveu: >>> Em 1/9/2011 17:49, Pedro Cavalhe > iro escreveu: >>> >>> Opa! >>> >>> Segue a função atual: >>> >>> Ela pode receber todo tipo de consulta, desde select, insert, >>> delete... enfim, qualquer comando, sendo que também é possível que ela >>> receba mais de 1 ao mesmo tempo. ex. "insert into tabela (coluna) >>> values ('valor'); select * from tabela;" >>> Neste caso, o que importa para o retorno é apenas o select (não sei se >>> isso faz diferença para a complexidade). >>> Os outros parâmetros são gravados em uma tabela que é consultada em >>> uma trigger disparada em INSERT, UPDATE, ou DELETE. (essa parte está >>> funcionando perfeitamente) >>> >>> CREATE OR REPLACE FUNCTION log_user ( >>> sql text, >>> id_user integer, >>> cod_deck integer >>> ) >>> RETURNS text AS >>> $body$ >>> DECLARE >>> USUARIO INTEGER := id_user; >>> DECK INTEGER := cod_deck; >>> BEGIN >>> PERFORM ul.id FROM log_usuario ul LIMIT 1 FOR UPDATE; >>> UPDATE log_usuario SET id=USUARIO, id_deck=DECK; >>> execute sql; >>> retur > n 'ops ^^'; >>> END; >>> $body$ >>> LANGUAGE 'plpgsql' >>> VOLATILE >>> RETURNS NULL ON NULL INPUT >>> SECURITY INVOKER >>> COST 100; >>> >>> >>> Desde já, agradeço pela ajuda. >>> >>> Atenciosamente, >>> Pedro Cavalheiro >>> >>> O seu retorno seria os registros do "select"? E se alguém passar um >>> passar >>> um comando "select * from tabela; insert into tabela..." ? O retorno >>> seria o >>> que? >>> >>> O retorno como está não funciona para trazer vários registros, para isso >>> você deve usar um setof com record ou type. >>> >>> Uma record para você não adianta porque na chamada você precisa saber o >>> retorno da pl. >>> >>> Já um type é mais flexível mas você precisaria definir ele antes, >>> então você >>> poderia criar ele antes usando a estrutura do select, mas isso é algo >>> bem >>> complicado, vai ter que pensar muit o bem, tratar erros, saber os >>> tipos de >>> campos ou talvez consultar no catálogo. >>> >>> Eu uso uma pl que escreve os comandos, mas faço diferente, passo os >>> campos e >>> os co > nteúdos por array, o nome da tabela e a ação, daí ela monta a query e >>> executa. >>> >>> Dá uma olhada na documentação: >>> >>> http://www.postgresql.org/docs/9.0/interactive/plpgsql-control-structures.html >>> >>> >>> >>> Abraço, >>> Fabiano Machado Dias >>> >>> Português - detectado >>> Inglês >>> Português >>> >>> Inglês >>> Português >>> >>> _______________________________________________ >>> pgbr-geral mailing list >>> [email protected] >>> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral >>> >>> >> _______________________________________________ >> pgbr-geral mailing list >> [email protected] >> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral > > > Pelo que vi você quer logar o acesso à cer tas tabelas, correto? > > Ao invés de usar uma função mega hiper complexa, por que não usa rules? > > Você pode adicionar um rule para insert, delete, update E select, > facilitando muito sua vida. E claro, qualquer acesso á tabel > a que nao pela sua função nao será logado, mas pela rule sim.
Pf, esquece minha sugestão, não é isso que você precisa. Desculpem pelo barulho.. _______________________________________________ pgbr-geral mailing list [email protected] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
