Perfecto! Probado y funcionando!
Gracias El 8 de abril de 2011 10:16, Ramón Alberto Bruening González < albertobruen...@hotmail.com> escribió: > Hola a todos, me paso algo igual y era que cada vez que cambiaba la > estructura de una tabla no encontraba dicha tabla el mismo trigger de > auditoria, entonces lo que hice fue cambiar lo siguiente: > > Original: > spi_exec "SELECT relname AS tgname FROM pg_class WHERE relfilenode = > $TG_relid" > > Modificado: > spi_exec "SELECT relname AS tgname FROM pg_class WHERE oid = $TG_relid" > > Cambia eso y avisame que tal te va.... > > Alberto B. > > ------------------------------ > Date: Fri, 8 Apr 2011 10:07:42 -0430 > Subject: [pgsql-es-ayuda] ERROR: can't read "tgname": no such variable > From: cesar.carbon...@gmail.com > To: pgsql-es-ayuda@postgresql.org > > > Saludos > > Tengo una función de auditoría similar a [0], hasta ahora, la estoy > "personalizando" y va funcionando. > Estoy agregando otra función que chequee X intentos fallidos para bloquear > el usuario: > > CREATE OR REPLACE FUNCTION check_login(uname TEXT, pass TEXT) > RETURNS SETOF usuarios AS $$ > DECLARE > passed BOOLEAN; > inten INTEGER; > BEGIN > SELECT (clave = $2) INTO passed > FROM usuarios > WHERE usuario = $1; > > IF (passed = false) THEN > UPDATE usuarios SET intento = (intento + 1) WHERE usuario = $1; > > SELECT intento INTO inten FROM usuarios WHERE usuario = $1; > > IF (inten = 3) THEN > UPDATE usuarios SET activo = false WHERE usuario = $1; > END IF; > RETURN; > ELSE > UPDATE usuarios SET intento = 0 WHERE usuario = $1; > RETURN QUERY SELECT * FROM usuarios WHERE usuario = $1; > END IF; > > RETURN; > END; > $$ LANGUAGE plpgsql > SECURITY DEFINER; > > > La tabla usuarios también tiene el disparador de la auditoría. > > Al agregarle la función check_login al sistema, y hacer login, me devuelve: > > ERROR: can't read "tgname": no such variable > CONTEXT: can't read "tgname": no such variable > while executing > "spi_exec "SELECT nspname AS scname FROM pg_namespace AS n JOIN pg_class AS > c ON c.relnamespace = n.oid WHERE c.relname = '$tgname'"" > (procedure "__PLTcl_proc_909190_trigger_908521" line 15) > invoked from within > "__PLTcl_proc_909190_trigger_908521 trg_audit_log 908521 usuarios cc1 {{} > id tabla20_campo2 usuario clave default_mask nivel_acceso fregistro activo > us..." > in PL/Tcl function "log_to_audit_table" > sentencia SQL: «UPDATE cc1.usuarios SET intento = 0 WHERE usuario = $1 » > PL/pgSQL function "check_login" line 19 at SQL statement > > > Entiendo por el mensaje que como estoy haciendo un UPDATE dentro de la > función y no se dispara el trigger? cómo debería hacerse? > > [0]http://www.alberton.info/postgresql_table_audit.html > > -- > -- > Sí no eres parte de la solución... eres parte del problema. > -- > ... y no dejes de leer: > Netiqueta: Conjunto de reglas que regulan la conducta del usuario en > internet > http://es.wikibooks.org/wiki/Netiquette > -- > Cesar A. Carbonara R. > C.I. Nº V.11.952.572 > -- > Usuario Linux 377997 > www.gulmer.org.ve > > -- -- Sí no eres parte de la solución... eres parte del problema. -- ... y no dejes de leer: Netiqueta: Conjunto de reglas que regulan la conducta del usuario en internet http://es.wikibooks.org/wiki/Netiquette -- Cesar A. Carbonara R. C.I. Nº V.11.952.572 -- Usuario Linux 377997 www.gulmer.org.ve