[pgsql-ayuda] triggers

Ing. Roberto Andrade Fonseca randrade@abl.com.mx
Tue, 21 Aug 2001 22:22:23 -0500 (CDT)


Hola:
On Sun, 19 Aug 2001, Felipe Fernandez wrote:

> Me he hecho un lio con los triggers  as=ED que recurro a la experiencia d=
e
> otros. Me explico con un ejemplo
>=20
> Tengo dos tablas
>=20
> create table clientes (
>     codigo varchar(10) nor null primary key,
>      nombre varchar(40)
> );
>=20
> create table facturas (
>     numero int4 not null primary key,
>     fecha date,
>     cliente varchar(10) references clientes,
>     ....
> );
>=20
> Si hago lo anterior me crea unos triggers sin nombre con unas funciones
> extra=F1as que he deducido tengo que crear. Lo que pretendo es que cuando
> cambie el codigo del cliente en su tabla correspondiente se me cambie
> tambien en la tabla de facturas. Supongo que la funcione que se ejecuta
> en el triger es la siguiente:
>=20
> create function cambiocliente (varchar, varchar) returns bool as '
>      update facturas set cliente =3D $2 where cliente =3D$1;
>     select 1;
> ' language 'sql';
>=20
> Pues no logro que funcione. Evidentemente no estoy entendiendo algo pero
> por mas que consulto los manuales, traducidos o no, no me aclaran nada
> mas all=E1 de lo que estoy exponiendo.

NOOOOOO.

La llave primaria debe ser respetada como la ni=F1a de tus ojos!

Es el identificador de tus registros o renglones. No los cambies pues te pu=
edes meter en problemas:

1. Facturo el 1 de enero de 2001 a Juan Perez, cliente 21.
2. Facturo el 1 de febrero a Mar=EDa L=F3pez, cliente 23.

Por alguna raz=F3n, cambio a P=E9rez de 21 a 23, ya mezcle los registros de=
 dos clientes.

Luego quiero cambiar a L=F3pez de 23 a 71, pero ya tengo en 23 a P=E9rez y =
a L=F3pez. Fuente de m=E1s problemas.

Otro caso:

Tengo un reporte de enero en que P=E9rez es mi cliente 21. En marzo lo camb=
i=E9 a 23.

Reviso mi reporte de enero en julio, ya no se por cual llave primaria busca=
r a P=E9rez.


Otro caso:

En una base de datos real (m=E1s de 50 tabla) puedo tener varias (m=E1s de =
10) referencias a algo tan importante como el id de mis clientes. No puedo =
cambiar ese id, pues:

1. Tendr=EDa que hacerlo en cada una de las tablas en que tengo referencias=
 a ese campo.

2. Si us=E9 referencias al id del cliente, no podr=E9 borrar o modificar es=
e valor mientras existan registros den la otras tablas que hagan referencia=
s a =E9l.

NO MODIFIQUES LLAVES PRIMARIAS.
=20
O expl=EDcanos porqu=E9 necesitas hacerlo.

Saludos,

Roberto Andrade Fonseca
randrade@abl.com.mx