Así es como su función de activación funcionaría correctamente:
CREATE OR REPLACE FUNCTION loca_app.func_historico_mod_usuarios()
RETURNS trigger AS
$func$
BEGIN
EXECUTE format(
'INSERT INTO loca_app.tb_modificacoes
(mod_momento, mod_valor_anterior, mod_valor_atual, mod_usuario, mod_dado)
VALUES (now() , $1.%1$I , $2.%1$I , $3 , $4)
)', TG_ARGV[0])
USING OLD, NEW, TG_RELID
, (SELECT dad_id FROM loca_app.tb_dados
WHERE dad_nome = TG_ARGV[0] -- cast? see blow
LIMIT 1);
RETURN NULL; -- only good for AFTER trigger
END
$func$ LANGUAGE plpgsql;
Puntos principales
-
Pase los valores de fila especiales
OLDyNEWasí comoTG_RELIDcomo valores paraEXECUTEcon elUSINGcláusula. Puede que tengas que lanzarTG_RELIDa un tipo de datos adecuado. La definición de la tabla detb_modificacoesno se revela. O realmente quieres algo más aquí. Consulte a continuación.$1,$2y$3en la cadena SQL pasada aEXECUTEreferirse a expresiones en elUSINGcláusula, no a los parámetros de la función, a los que se puede hacer referencia con la misma sintaxis posicional en el cuerpo de la función fueraEXECUTE. -
Concatene su comando SQL dinámico usando
format(). Mucho más limpio y seguro. Citar y escapar identificadores , código y valores ¡adecuadamente!%1$Iy%1$Lson especificadores de formato paraformat(). Lea el manual para obtener más detalles. -
¡Se requiere el caso correcto! Su convención para deletrear identificadores con letras mayúsculas tiene sentido en Oracle, donde los identificadores sin comillas se convierten en letras mayúsculas. No es útil en Postgres, donde todo se pliega en minúsculas:
-
No uses
ILIKEenDAD_NOME ILIKE 'USU_NASCIMENTO'. Los identificadores de Postgres distinguen entre mayúsculas y minúsculas. podrías tener múltiples valores coincidentes endad_nome. Usa=en su lugar y pase los identificadores escritos correctamente. Y asegúrate de quedad_nomese define único. Ver más abajo. -
Tu comentario dice:
MOD_USUARIO , -- Translated to: User (ID). Pero eso no es lo que pasas. El manual:Es posible que desee utilizar
current_userosession_useren cambio: -
Puedes eliminar
LIMIT 1de la subconsulta ifdad_nomese defineUNIQUE. De lo contrario, debe decidir qué fila elegir en caso de empate, conORDER BY. -
Las funciones de activación son requeridas para terminar con un
RETURNdeclaración. También podría serRETURN NULLpara unAFTERgenerar. El manual:
Relacionado:
- Cómo pasar NUEVO.* a EJECUTAR en la función de activación
- Reemplace las comillas dobles con comillas simples en Postgres (plpgsql)
Aparte: Si bien es nuevo en Postgres, es posible que desee utilizar este tipo de SQL dinámico avanzado con cuidado. Necesita entender lo que está haciendo.