Tengo una tabla que tiene un montón de columnas, una de las cuales es una columna 'last_update_time'. Cada vez que cambio el valor de cualquiera de las otras columnas, me gustaría que 'last_update_time' se actualice automáticamente a SYSDATE.

Sé que normalmente usarías disparadores para este tipo de cosas, pero que yo sepa, no es posible tener un disparador para que una tabla mute esa misma tabla.

¿Cuál es la mejor manera de implementar la funcionalidad descrita anteriormente?

0
krise 22 jul. 2020 a las 11:14

2 respuestas

La mejor respuesta

Puede usar un disparador antes de la actualización de. Solo necesita especificar las columnas que podrían actualizarse en la cláusula antes de

Mira esto

SQL> create table testtrg ( c1 number, c2 date ) ;

Table created.

SQL> create or replace trigger mytrig
before update of c1
on testtrg
referencing new as new old as old
for each row
declare
begin
   :new.c2  := sysdate;
end;
/  2    3    4    5    6    7    8    9   10   11   12   13

Trigger created.

SQL> select * from testtrg;

no rows selected

SQL> insert into testtrg values ( 1 , sysdate - 360 );

1 row created.

SQL> commit;

Commit complete.

SQL> select * from testtrg ;

        C1 C2
---------- ---------
         1 28-JUL-19

SQL> update testtrg set c1=2 ;

1 row updated.

SQL> commit ;

Commit complete.

SQL>  select * from testtrg ;

        C1 C2
---------- ---------
         2 22-JUL-20

SQL>
1
Roberto Hernandez 22 jul. 2020 a las 12:34

En mis tablas me gusta hacer un seguimiento de cuándo se creó, además de cuándo se modificó por última vez. Mis disparadores se parecen a esto:

CREATE OR REPLACE TRIGGER tnsnames.tns_server_override_trg
BEFORE INSERT OR UPDATE
ON "TNSNAMES".tns_server_override
FOR EACH ROW
BEGIN
    :new.modified_dt   := SYSDATE;
    :new.modified_by   := SYS_CONTEXT( 'USERENV', 'OS_USER' );

    CASE
       WHEN INSERTING
    THEN
        :new.created_dt   := :new.modified_dt;
        :new.created_by   := :new.modified_by;
    WHEN UPDATING
    THEN
        :new.created_dt   := :old.created_dt;
        :new.created_by   := :old.created_by;
    END CASE;
END;
0
Brian Leach 22 jul. 2020 a las 17:41