Ayuda en creacion de trigger

Lists: pgsql-es-ayuda
From: "Urko" <urko(at)7itria(dot)com>
To: <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Problema con ordenar ignora espacios
Date: 2006-01-25 12:29:08
Message-ID: 000101c621aa$f0976b50$2c001aac@PcUrko
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda


Buenos dias y gracias de antemano

Cuando accedo a los datos ya sea desde el open office o el pgadmin

PABLO MARTIN DIAZ
SILVIA MARTIN ESCUDERO
CLAUDIA MARTINEZ VILLA
JESUS MARTIN FERNANDEZ
JULIA MARTIN GARCIA

Lo unico que he concluido es que ignora los espacios.
Es eso posible, se puede desactivar de alguna forma
si podeis ayudarme muchisimas gracias
la bse de datos esta en postgres 8.0.1 y en UNICODE pero no uso caracteres
acentuados ni que no sean los standard


Urko



From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: Urko <urko(at)7itria(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Problema con ordenar ignora espacios
Date: 2006-01-25 13:37:23
Message-ID: 20060125133723.GA996@surnet.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Urko escribió:

> Buenos dias y gracias de antemano

Buenos dias, de nada de antemano.

> Cuando accedo a los datos ya sea desde el open office o el pgadmin
>
> PABLO MARTIN DIAZ
> SILVIA MARTIN ESCUDERO
> CLAUDIA MARTINEZ VILLA
> JESUS MARTIN FERNANDEZ
> JULIA MARTIN GARCIA
>
> Lo unico que he concluido es que ignora los espacios.

Efectivamente; y no es solo Postgres, sino que cualquier programa que
ordene hara esto (programas decentes por supuesto. Siempre es factible
encontrar programas mal hechos que simplemente comparan bytes). Por
ejemplo, sort entrega esto:

$ sort < entrada
MARTIN DIAZ
MARTIN ESCUDERO
MARTINEZ VILLA
MARTIN FERNANDEZ
MARTIN GARCIA

(le tuve que quitar los nombres del principio, pues es obvio que el
ordenamiento lo hiciste asi). Esto sucede porque la definicion de
ordenamiento esta definido de esta manera en la biblioteca C, es decir
es parte del "sistema operativo" y no es realmente culpa de Postgres.

Con sort puedes decirle que use solamente el primer "campo":

$ sort -k1,1 < entrada
MARTIN DIAZ
MARTIN ESCUDERO
MARTIN FERNANDEZ
MARTIN GARCIA
MARTINEZ VILLA

cosa que, hasta donde se, no se puede hacer con Postgres.

> Es eso posible, se puede desactivar de alguna forma

Creo que lo que deberias hacer es normalizar la base de datos, separando
los apellidos maternos de los paternos; esto ademas te salvara el culo
cuando tengas que comparar apellidos compuestos como "DEL RIO" con "DE
LA FUENTE" y "DÉLANO", puesto que el listado ordenado debe ser

DE LA FUENTE
DÉLANO
DEL RIO

y por lo tanto no es simple cosa de decirle que no ignore los espacios,
porque te daria este otro resultado:

$ LC_ALL=C sort < entrada
DE LA FUENTE
DEL RIO
DÉLANO

cosa que evidentemente no es correcta.

De nada a posteriori,

--
Alvaro Herrera Developer, http://www.PostgreSQL.org
Al principio era UNIX, y UNIX habló y dijo: "Hello world\n".
No dijo "Hello New Jersey\n", ni "Hello USA\n".


From: Ricardo David Carrillo Sánchez <rcarrillosmx(at)yahoo(dot)com(dot)mx>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Ayuda en creacion de trigger
Date: 2006-01-25 19:30:37
Message-ID: 20060125193037.22389.qmail@web31011.mail.mud.yahoo.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda


Hola a todos!!!,
Directo al grano, he tratado desde hace un pa de dìas
el realizar un trigger que me registre los movimientos
realizados en ciertas tablas, ahora bien, al realiarlo
como viene en los ejemplos de la documentacion online
y otros documentos que encontre respeto al tema, esto
es lo que pude realizar:

DROP TABLE ejemplo;
CREATE TABLE ejemplo
(
nombre text,
apellido text
);

CREATE FUNCTION audita() RETURNS trigger AS '
DECLARE
log_db record;
BEGIN
IF TG_OP="DELETE" THEN
INSERT INTO log_db
(usuario,registro,fechayh,tabla,opera) values
(getpgusername(),OLD.nombre,now(),TG_RELNAME,TG_OP);
ELSE
INSERT INTO log_db
(usuario,registro,fechayh,tabla,opera) values
(getpgusername(),NEW.nombre,now(),TG_RELNAME,TG_OP);
END IF;
RETURN NEW;
END;
' LANGUAGE plpgsql;

CREATE TRIGGER ejemplo BEFORE INSERT OR DELETE OR
UPDATE ON ejemplo
FOR EACH ROW EXECUTE PROCEDURE audita();

para lo cual me manda un error del siquiente tipo:
DROP TABLE
CREATE TABLE
psql:otro-trigger.psql:19: ERROR: syntax error at or
near "$1" at character 14
QUERY: INSERT INTO $1
(usuario,registro,fechayh,tabla,opera) values
(getpgusername(), $2 ,now(), $3 , $4 )
CONTEXT: SQL statement in PL/PgSQL function "audita"
near line 5
psql:otro-trigger.psql:19: LINE 1: INSERT INTO $1
(usuario,registro,fechayh,tabla,opera) valu...
psql:otro-trigger.psql:19: ^
psql:otro-trigger.psql:22: ERROR: function audita()
does not exist

Por otro lado probe el ejemplo que viene en la
documentaciòn y de igual forma no me lo acepta :

CREATE TABLE empleados (
empleado_nombre text NOT NULL,
salario integer
);
CREATE TABLE empleados_audit(
operacion char(1) NOT NULL,
horafecha timestamp NOT NULL,
userid text NOT NULL,
empleado_nombre text NOT NULL,
salario integer
);
CREATE OR REPLACE FUNCTION procesa_empleados_audit()
RETURNS TRIGGER AS '
BEGIN
--
-- Crea un registro en empleado_audit para
reflejar las operaciones
-- realizadas en empleados utiliza las variables
especiales TG_OP
-- para efectuar la operación
IF (TG_OP == "DELETE") THEN
INSERT INTO empleados_audit SELECT "D",
now(), user, OLD.*;
RETURN OLD;
ELSIF (TG_OP == "UPDATE") THEN
INSERT INTO empleados_audit SELECT "U",
now(), user,
NEW.empleado_nombre,
NEW.salario;
RETURN NEW;
ELSIF (TG_OP == "INSERT") THEN
INSERT INTO empleados_audit SELECT "I",
now(), user, NEW.*;
RETURN NEW;
END IF;
RETURN NULL; -- el resultado es ignorado puesto
que este
-- es un trigger AFTER
END;
' language plpgsql;
CREATE TRIGGER empleados_audit AFTER INSERT OR UPDATE
OR
DELETE ON empleados FOR EACH ROW EXECUTE
PROCEDURE
procesa_empleados_audit();

En verdad agradecerìa mucho cualquier orientación.
saludos.

:::::::::::::::::::::::::::::::::::::::::::::::
:: El éxito es una suma de fracasos..... ::
:: el secreto está en no acostubrase a ambos ::
:::::::::::::::::::::::::::::::::::::::::::::::




___________________________________________________________
Do You Yahoo!?
La mejor conexión a Internet y <b >2GB</b> extra a tu correo por $100 al mes. http://net.yahoo.com.mx


From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: Ricardo David Carrillo Sánchez <rcarrillosmx(at)yahoo(dot)com(dot)mx>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Ayuda en creacion de trigger
Date: 2006-01-25 21:04:09
Message-ID: 20060125210409.GB6045@surnet.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Ricardo David Carrillo Sánchez escribió:

> CREATE FUNCTION audita() RETURNS trigger AS '
> DECLARE
> log_db record;
> BEGIN
> IF TG_OP="DELETE" THEN
> INSERT INTO log_db
> (usuario,registro,fechayh,tabla,opera) values
> (getpgusername(),OLD.nombre,now(),TG_RELNAME,TG_OP);
> ELSE
> INSERT INTO log_db
> (usuario,registro,fechayh,tabla,opera) values
> (getpgusername(),NEW.nombre,now(),TG_RELNAME,TG_OP);
> END IF;
> RETURN NEW;
> END;
> ' LANGUAGE plpgsql;

No entiendo que es lo que pretendes con el INSERT INTO apuntando a un
record. Supongo que quisiste poner un nombre de tabla ahi?

> Por otro lado probe el ejemplo que viene en la
> documentaciòn y de igual forma no me lo acepta :

Y cual es el error?

--
Alvaro Herrera Developer, http://www.PostgreSQL.org
"En las profundidades de nuestro inconsciente hay una obsesiva necesidad
de un universo lógico y coherente. Pero el universo real se halla siempre
un paso más allá de la lógica" (Irulan)