
Ayuda para crear un trigger a partir de otro trigger utilizado en postgresql
Publicado por Lisandro Daniel (4 intervenciones) el 21/06/2015 19:19:42
Buenas tardes, hace poco diseñé la siguiente función, con su respectivo disparador en una base de datos bajo PostgreSQL
CREATE OR REPLACE FUNCTION generar_usuario() RETURNS TRIGGER AS $generar_usuario$
DECLARE
USUARIO text;
CLAVE text;
BEGIN
IF (TG_OP = 'UPDATE') THEN
USUARIO := (SELECT "CODIGO_NACIONALIDAD" FROM "PERSONAS", "NACIONALIDAD" WHERE NEW."NACIONALIDAD" = "NACIONALIDAD"."ID") || NEW."CEDULA";
CLAVE := MD5((SELECT "CODIGO_NACIONALIDAD" FROM "PERSONAS", "NACIONALIDAD" WHERE NEW."NACIONALIDAD" = "NACIONALIDAD"."ID") || NEW."CEDULA");
UPDATE "USUARIOS" SET "USUARIO" = USUARIO, "CLAVE" = CLAVE WHERE OLD."ID" = "USUARIOS"."PERSONA";
RETURN NEW;
ELSIF (TG_OP = 'INSERT') THEN
USUARIO := (SELECT "CODIGO_NACIONALIDAD" FROM "PERSONAS", "NACIONALIDAD" WHERE NEW."NACIONALIDAD" = "NACIONALIDAD"."ID") || NEW."CEDULA";
CLAVE := MD5((SELECT "CODIGO_NACIONALIDAD" FROM "PERSONAS", "NACIONALIDAD" WHERE NEW."NACIONALIDAD" = "NACIONALIDAD"."ID") || NEW."CEDULA");
INSERT INTO "USUARIOS"("ID", "USUARIO", "CLAVE", "PERSONA") VALUES(NEW."ID", USUARIO, CLAVE, NEW."ID");
RETURN NEW;
END IF;
RETURN NULL;
END;
$generar_usuario$ language plpgsql;
CREATE TRIGGER generar_usuario AFTER INSERT OR UPDATE ON "PERSONAS" FOR EACH ROW EXECUTE PROCEDURE generar_usuario();
...dicho código permite generar un insert y/o update en otra tabla llamada "USUARIOS", luego de ser insertados y/o actualizados los datos en la tabla "PERSONAS", proceso que se realiza de forma automatizada sin inconvenientes.
La ayuda que necesito es para convertir este código en una función con disparador, que pueda ser utilizada en Oracle, con el mismo propósito (ya que estoy migrando la base de datos actual bajo postgresql a oracle express)
He intentado utilizar el siguiente código (para probar la parte de eventos de inserción)
CREATE OR REPLACE TRIGGER "GENERAR_USUARIO"
AFTER INSERT ON PERSONAS
FOR EACH ROW
BEGIN
INSERT INTO "USUARIOS"("ID", "USUARIO", "CLAVE", "PERSONA") VALUES(:NEW."ID", (SELECT "CODIGO_NACIONALIDAD" FROM NACIONALIDAD, PERSONAS WHERE :NEW."NACIONALIDAD" = NACIONALIDAD.ID) || :NEW."CEDULA", MD5((SELECT "CODIGO_NACIONALIDAD" FROM NACIONALIDAD, PERSONAS WHERE :NEW."NACIONALIDAD" = NACIONALIDAD.ID) || :NEW."CEDULA"),:NEW."ID");
END "GENERAR_USUARIO";
/
ALTER TRIGGER "GENERAR_USUARIO" ENABLE
/
obtengo como error lo siguiente al insertar un registro en la tabla "PERSONAS"
error ORA-04091: table KRIOS.PERSONAS is mutating, trigger/function may not see it ORA-06512: at "KRIOS.GENERAR_USUARIO", line 2 ORA-04088: error during execution of trigger 'KRIOS.GENERAR_USUARIO'
No logro dar con la falla, luego de evaluar el código con Oracle APEX, me indica "Este disparador no tiene ningún error.". De antemano agradezco la ayuda y orientación que puedan brindarme en mis primeros pasos en Oracle.
CREATE OR REPLACE FUNCTION generar_usuario() RETURNS TRIGGER AS $generar_usuario$
DECLARE
USUARIO text;
CLAVE text;
BEGIN
IF (TG_OP = 'UPDATE') THEN
USUARIO := (SELECT "CODIGO_NACIONALIDAD" FROM "PERSONAS", "NACIONALIDAD" WHERE NEW."NACIONALIDAD" = "NACIONALIDAD"."ID") || NEW."CEDULA";
CLAVE := MD5((SELECT "CODIGO_NACIONALIDAD" FROM "PERSONAS", "NACIONALIDAD" WHERE NEW."NACIONALIDAD" = "NACIONALIDAD"."ID") || NEW."CEDULA");
UPDATE "USUARIOS" SET "USUARIO" = USUARIO, "CLAVE" = CLAVE WHERE OLD."ID" = "USUARIOS"."PERSONA";
RETURN NEW;
ELSIF (TG_OP = 'INSERT') THEN
USUARIO := (SELECT "CODIGO_NACIONALIDAD" FROM "PERSONAS", "NACIONALIDAD" WHERE NEW."NACIONALIDAD" = "NACIONALIDAD"."ID") || NEW."CEDULA";
CLAVE := MD5((SELECT "CODIGO_NACIONALIDAD" FROM "PERSONAS", "NACIONALIDAD" WHERE NEW."NACIONALIDAD" = "NACIONALIDAD"."ID") || NEW."CEDULA");
INSERT INTO "USUARIOS"("ID", "USUARIO", "CLAVE", "PERSONA") VALUES(NEW."ID", USUARIO, CLAVE, NEW."ID");
RETURN NEW;
END IF;
RETURN NULL;
END;
$generar_usuario$ language plpgsql;
CREATE TRIGGER generar_usuario AFTER INSERT OR UPDATE ON "PERSONAS" FOR EACH ROW EXECUTE PROCEDURE generar_usuario();
...dicho código permite generar un insert y/o update en otra tabla llamada "USUARIOS", luego de ser insertados y/o actualizados los datos en la tabla "PERSONAS", proceso que se realiza de forma automatizada sin inconvenientes.
La ayuda que necesito es para convertir este código en una función con disparador, que pueda ser utilizada en Oracle, con el mismo propósito (ya que estoy migrando la base de datos actual bajo postgresql a oracle express)
He intentado utilizar el siguiente código (para probar la parte de eventos de inserción)
CREATE OR REPLACE TRIGGER "GENERAR_USUARIO"
AFTER INSERT ON PERSONAS
FOR EACH ROW
BEGIN
INSERT INTO "USUARIOS"("ID", "USUARIO", "CLAVE", "PERSONA") VALUES(:NEW."ID", (SELECT "CODIGO_NACIONALIDAD" FROM NACIONALIDAD, PERSONAS WHERE :NEW."NACIONALIDAD" = NACIONALIDAD.ID) || :NEW."CEDULA", MD5((SELECT "CODIGO_NACIONALIDAD" FROM NACIONALIDAD, PERSONAS WHERE :NEW."NACIONALIDAD" = NACIONALIDAD.ID) || :NEW."CEDULA"),:NEW."ID");
END "GENERAR_USUARIO";
/
ALTER TRIGGER "GENERAR_USUARIO" ENABLE
/
obtengo como error lo siguiente al insertar un registro en la tabla "PERSONAS"
error ORA-04091: table KRIOS.PERSONAS is mutating, trigger/function may not see it ORA-06512: at "KRIOS.GENERAR_USUARIO", line 2 ORA-04088: error during execution of trigger 'KRIOS.GENERAR_USUARIO'
No logro dar con la falla, luego de evaluar el código con Oracle APEX, me indica "Este disparador no tiene ningún error.". De antemano agradezco la ayuda y orientación que puedan brindarme en mis primeros pasos en Oracle.
Valora esta pregunta


0