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?
2 respuestas
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>
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;
Nuevas preguntas
sql
El lenguaje de consulta estructurado (SQL) es un lenguaje para consultar bases de datos. Las preguntas deben incluir ejemplos de código, estructura de tabla, datos de muestra y una etiqueta para la implementación de DBMS (por ejemplo, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2, etc.) que se utiliza. Si su pregunta se relaciona únicamente con un DBMS específico (usa extensiones / características específicas), use la etiqueta de ese DBMS en su lugar. Las respuestas a las preguntas etiquetadas con SQL deben usar SQL estándar ISO / IEC.