PostgreSQL - Error en trigger

 
Vista:
sin imagen de perfil
Val: 2
Ha disminuido 1 puesto en PostgreSQL (en relación al último mes)
Gráfica de PostgreSQL

Error en trigger

Publicado por Elio Gabriel (2 intervenciones) el 05/07/2018 03:51:57
Hola a todos y gracias de antemano. Estoy desarrollando una base de datos en la cual tengo que controlar las divisas que utiliza el sistema. para lo cual me valgo de una tabla denominada "privado.divisas" como se puede observar en la siguiente imagen:

captura_1

Solo una moneda puede ser la local, para ello se debe colocar un TRUE en el campo "dvs_local" y FALSE para el resto de los registros en le mencionado campo. Ademas de colocar la paridad de la misma en 1. Todo esto lo intento realizar por medio de un trigger, como se muestra a continuación:

1
2
3
4
5
CREATE TRIGGER divisas_local_trg
  AFTER UPDATE
  ON privado.divisas
  FOR EACH STATEMENT
  EXECUTE PROCEDURE privado.divisas_local_fnc();

Y la función del trigger es la siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE OR REPLACE FUNCTION privado.divisas_local_fnc()
RETURNS trigger AS
$BODY$
declare
	filtro varchar(150);
begin
	filtro := old.dvs_nombre;
	if new.dvs_local = true then
		update privado.divisas set dvs_local = not(new.dvs_local) where dvs_nombre <> filtro;
		new.dvs_paridad = 1;
	end if;
	return new;
end
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION privado.divisas_local_fnc()
  OWNER TO costos_industriales;

EL problema es que cuando pretendo modificar alguna divisa y seleccionarla como local me aparece el siguiente error:

captura_2

Según mi parecer no veo error. Desde ya gracias por su atención. Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Error en trigger

Publicado por martin maximiliano (121 intervenciones) el 07/07/2018 16:06:06
Tanto old y new toman instancia en triggers que se disparan por cada fila modificada, por tanto hay un old para la fila antes de modificar y una new para la nueva fila, estas declarando tu trigger como STATEMENT, en este caso se dispara cuando un script sql completo se termina de ejecutar, no hay un old o new ya que en un script pueden pasar muchas cosas sobre un mismo o varios registros, creo que necesitas declarar tu trigger como :

1
2
3
4
5
6
7
8
9
CREATE TRIGGER divisas_local_trg
 
  AFTER UPDATE
 
  ON privado.divisas
 
  FOR EACH ROW
 
  EXECUTE PROCEDURE privado.divisas_local_fnc();
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar