Re: Dos funciones

Lists: pgsql-es-ayuda
From: Gilberto Castillo Martínez <gilberto(dot)castillo(at)etecsa(dot)cu>
To: "pgsql-es-ayuda(at)postgresql(dot)org" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Dos funciones
Date: 2008-03-24 13:55:50
Message-ID: 1206366950.7200.6.camel@gilbertoc-desktop
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Tengo estas dos funciones:

CREATE OR REPLACE FUNCTION inserta_registro()
RETURNS "trigger" AS
$BODY$
BEGIN
-- if a trigger insert operation occurs
IF TG_OP = 'INSERT' THEN
-- inserto los datos column y asigno el corriente tiempo
insert into "public"."trazas" ("id_usuario", "fecha",
"operacion","tabla","id_llave_tabla") values (getpgusername(), now(),
'INSERT','Grupos', NEW.id_grupo);
ELSE
insert into "public"."trazas" ("id_usuario", "fecha",
"operacion","tabla","id_llave_tabla") values (getpgusername(), now(),
'UPDATE','Grupos', NEW.id_grupo);
END IF;
-- displays the new row on an insert
RETURN NEW;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;

*************************************

CREATE OR REPLACE FUNCTION inserta_registro(text, text)
RETURNS text AS
$BODY$
DECLARE
_TABLA alias for $1;
_id_tabla alias for $2;

BEGIN
-- if a trigger insert operation occurs
IF TG_OP = 'INSERT' THEN
-- inserto los datos column y asigno el corriente tiempo
insert into "public"."trazas" ("loginname", "fecha_tiempo",
"operacion","nombre_tabla","nombre_columna") values (getpgusername(),
now(), 'INSERT',_TABLA, _id_tabla);
ELSE
insert into "public"."trazas" ("loginname", "fecha_tiempo",
"operacion","nombre_tabla","nombre_columna") values (getpgusername(),
now(), 'UPDATE',_TABLA, _id_tabla);
END IF;
-- displays the new row on an insert
RETURN $1;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;

Mi intención es llamarlas desde un trigger, la primera me funciona sin
difuculta, pero me resuelve el poder utilizar para todas mis tabla ...
la segunda función es mas o menos lo que deseo hacer... pero esta me da
error al utilizar dentro del trigger .... necesito me ayuden a resolver
el problema.

Saludos,
Gilberto.


From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: Gilberto Castillo Martínez <gilberto(dot)castillo(at)etecsa(dot)cu>
Cc: "pgsql-es-ayuda(at)postgresql(dot)org" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Dos funciones
Date: 2008-03-24 14:30:57
Message-ID: 20080324143057.GA5484@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Gilberto Castillo Martínez escribió:

> Mi intención es llamarlas desde un trigger, la primera me funciona sin
> difuculta, pero me resuelve el poder utilizar para todas mis tabla ...
> la segunda función es mas o menos lo que deseo hacer... pero esta me da
> error al utilizar dentro del trigger .... necesito me ayuden a resolver
> el problema.

Las funciones para trigger deben retornar el tipo especial TRIGGER. Tu
segunda funcion retorna text, por lo tanto no sirve. Después de
corregir ese error, ¿qué problema tienes?

--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support


From: Gilberto Castillo Martínez <gilberto(dot)castillo(at)etecsa(dot)cu>
To: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
Cc: "pgsql-es-ayuda(at)postgresql(dot)org" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Dos funciones
Date: 2008-03-24 14:39:56
Message-ID: 1206369596.7200.10.camel@gilbertoc-desktop
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Cuando trato de ponerle trigger, al retorno de la segunda función ... me
da un error de parametro ... algo como que a las funciones que retornan
trigger ... no se pede pasar parametros.

El lun, 24-03-2008 a las 11:30 -0300, Alvaro Herrera escribió:
> Gilberto Castillo Martínez escribió:
>
> > Mi intención es llamarlas desde un trigger, la primera me funciona sin
> > difuculta, pero me resuelve el poder utilizar para todas mis tabla ...
> > la segunda función es mas o menos lo que deseo hacer... pero esta me da
> > error al utilizar dentro del trigger .... necesito me ayuden a resolver
> > el problema.
>
> Las funciones para trigger deben retornar el tipo especial TRIGGER. Tu
> segunda funcion retorna text, por lo tanto no sirve. Después de
> corregir ese error, ¿qué problema tienes?
>


From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: Gilberto Castillo Martínez <gilberto(dot)castillo(at)etecsa(dot)cu>
Cc: "pgsql-es-ayuda(at)postgresql(dot)org" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Dos funciones
Date: 2008-03-24 14:49:32
Message-ID: 20080324144932.GB5484@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Gilberto Castillo Martínez escribió:
> Cuando trato de ponerle trigger, al retorno de la segunda función ... me
> da un error de parametro ... algo como que a las funciones que retornan
> trigger ... no se pede pasar parametros.

Muestra el CREATE TRIGGER que estas ejecutando?

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.


From: Gilberto Castillo Martínez <gilberto(dot)castillo(at)etecsa(dot)cu>
To: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
Cc: "pgsql-es-ayuda(at)postgresql(dot)org" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Dos funciones
Date: 2008-03-24 15:13:53
Message-ID: 1206371633.7200.14.camel@gilbertoc-desktop
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Y me sigue dando error.

CREATE TRIGGER para_grupo
BEFORE INSERT OR UPDATE
ON grupos
FOR EACH ROW
EXECUTE PROCEDURE inserta_registro(text,text);

La de abajo me responde que las funciones definidas como Trigger ... no
permiten paso de parametros... ¿porque?

CREATE OR REPLACE FUNCTION inserta_registro(text, text)
RETURNS "trigger" AS
$BODY$
DECLARE
_TABLA alias for $1;
_id_tabla alias for $2;

BEGIN
-- if a trigger insert operation occurs
IF TG_OP = 'INSERT' THEN
-- inserto los datos column y asigno el corriente tiempo
insert into "public"."trazas" ("loginname", "fecha_tiempo",
"operacion","nombre_tabla","nombre_columna") values (getpgusername(),
now(), 'INSERT',_TABLA, _id_tabla);
ELSE
insert into "public"."trazas" ("loginname", "fecha_tiempo",
"operacion","nombre_tabla","nombre_columna") values (getpgusername(),
now(), 'UPDATE',_TABLA, _id_tabla);
END IF;
-- displays the new row on an insert
RETURN NEW;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;

El lun, 24-03-2008 a las 11:49 -0300, Alvaro Herrera escribió:
> Gilberto Castillo Martínez escribió:
> > Cuando trato de ponerle trigger, al retorno de la segunda función ... me
> > da un error de parametro ... algo como que a las funciones que retornan
> > trigger ... no se pede pasar parametros.
>
> Muestra el CREATE TRIGGER que estas ejecutando?
>
>


From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: Gilberto Castillo Martínez <gilberto(dot)castillo(at)etecsa(dot)cu>
Cc: "pgsql-es-ayuda(at)postgresql(dot)org" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Dos funciones
Date: 2008-03-24 15:44:00
Message-ID: 20080324154400.GC5484@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Gilberto Castillo Martínez escribió:
> Y me sigue dando error.
>
>
> CREATE TRIGGER para_grupo
> BEFORE INSERT OR UPDATE
> ON grupos
> FOR EACH ROW
> EXECUTE PROCEDURE inserta_registro(text,text);
>
> La de abajo me responde que las funciones definidas como Trigger ... no
> permiten paso de parametros... ¿porque?

Arriba donde pones "text" deben ir los parametros -- el nombre de la
tabla y el de la columna. Obviamente estos parametros son definidos al
tiempo de creacion del trigger!!

Otra cosa a tener en cuenta es que si quieres construir una sentencia,
debes hacerlo con un string y luego pasarlo a EXECUTE. Por ej.

sql = $s$ insert into "public"."trazas" ("loginname", "fecha_tiempo",
"operacion","nombre_tabla","nombre_columna") values (getpgusername(),
now(), 'INSERT', $s$ || _TABLA || $s$ , $s$ _id_tabla $s$ ); $s$;
execute sql;

Y una tercera observacion que te puedo hacer es que esto que intentas ya
esta escrito -- echa una mirada en pgfoundry.org, proyecto "tablelog".

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.


From: Gilberto Castillo Martínez <gilberto(dot)castillo(at)etecsa(dot)cu>
To: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
Cc: "pgsql-es-ayuda(at)postgresql(dot)org" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Dos funciones
Date: 2008-03-24 16:25:09
Message-ID: 1206375909.7200.17.camel@gilbertoc-desktop
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Alvaro ...gracias.

Todo funciona bien ya.... le voy a dar un vistazo al proyecto "tablelog"

Saludos,
Gilberto.
El lun, 24-03-2008 a las 12:44 -0300, Alvaro Herrera escribió:
> Gilberto Castillo Martínez escribió:
> > Y me sigue dando error.
> >
> >
> > CREATE TRIGGER para_grupo
> > BEFORE INSERT OR UPDATE
> > ON grupos
> > FOR EACH ROW
> > EXECUTE PROCEDURE inserta_registro(text,text);
> >
> > La de abajo me responde que las funciones definidas como Trigger ... no
> > permiten paso de parametros... ¿porque?
>
> Arriba donde pones "text" deben ir los parametros -- el nombre de la
> tabla y el de la columna. Obviamente estos parametros son definidos al
> tiempo de creacion del trigger!!
>
> Otra cosa a tener en cuenta es que si quieres construir una sentencia,
> debes hacerlo con un string y luego pasarlo a EXECUTE. Por ej.
>
>
> sql = $s$ insert into "public"."trazas" ("loginname", "fecha_tiempo",
> "operacion","nombre_tabla","nombre_columna") values (getpgusername(),
> now(), 'INSERT', $s$ || _TABLA || $s$ , $s$ _id_tabla $s$ ); $s$;
> execute sql;
>
> Y una tercera observacion que te puedo hacer es que esto que intentas ya
> esta escrito -- echa una mirada en pgfoundry.org, proyecto "tablelog".
>