2012-06-26 15 views
9

Digamos que tenemos 3 registros en la tabla: orig_tabdisparo para valores solamente se pueden cambiar

--------------------------------------------- 
| PK | Name | Address | Postal Code | 
--------------------------------------------- 
| 1 | AA | Street1 | 11111  | 
| 2 | BB | Street2 | 22222  | 
| 3 | CC | Street3 | 33333  | 
--------------------------------------------- 

Ahora se cambian los datos:

--------------------------------------------- 
| PK | Name | Address | Postal Code | 
--------------------------------------------- 
| 1 | AA | Street1 | 11111  | 
| 2 | BB | Street2 | 44444  | 
| 3 | CC | Dtreet7 | 33333  | 
--------------------------------------------- 

lo que el cliente quiere es los registros de actualización y sólo las columnas actualizadas (sí, sé que no tiene ningún sentido, pero usan algún sistema antiguo de la década de 1970 y quieren hacer algo de registro, etc.). Por lo que la tabla de informes debería ser así:

--------------------------------------------- 
| PK | Name | Address | Postal Code | 
--------------------------------------------- 
| 2 |  |   | 44444  | 
| 3 |  | Dtreet7 |    | 
--------------------------------------------- 

Esto lo que he intentado:

CREATE OR REPLACE TRIGGER vr_reporting_trigger 
    AFTER UPDATE ON orig_tab 
    FOR EACH ROW 
BEGIN 
IF inserting THEN 
INSERT INTO rep_tab(pk, name, address, code) 
    SELECT :new.pk, :new.name, :new.address, :new,code FROM DUAL 
    WHERE NOT EXISTS (SELECT 1 FROM rep_tab WHERE pk = :new.pk); 
UPDATE rep_tab t SET t.name = :new.name, t.address = :new.address, t.code = :new.code 
    WHERE t.pk = :new.pk; 
ELSIF updating THEN 
IF :new.pk <> :old.pk THEN 
    UPDATE rep_tab t 
     SET t.name = :new.name, t.address = :new.address, t.code =: new.code 
     WHERE t.pk = :old.pk ; 
    END IF; 
    MERGE INTO rep_tab d 
    USING DUAL ON (d.pk = :old.pk) 
    WHEN MATCHED THEN 
    UPDATE SET d.name = :new.name, d.address = :new.address, d.code =: new.code 
    WHEN NOT MATCHED THEN 
    INSERT (d.pk,d.name, d.address, d.code) VALUES (:new.pk,:new.name, new.address, new.code); 
END IF; 
END; 

con esta solución, me sale:

--------------------------------------------- 
| PK | Name | Address | Postal Code | 
--------------------------------------------- 
| 2 | BB | Street2 | 44444  | 
| 3 | CC | Dtreet7 | 33333  | 
--------------------------------------------- 

Sé que en algún lugar de Noel de inserción en la actualización de la declaración, pero no puedo entender cómo cambiar esta cláusula según mi requisito. ¿Cualquier sugerencia?

Gracias de antemano.

Respuesta

20

usted necesita este:

En un desencadenador UPDATE, un nombre de columna puede especificarse con un predicado condicional ACTUALIZACIÓN para determinar si la columna llamada está siendo actualizada . Por ejemplo, supongamos que un disparador se define como las siguientes:

CREATE OR REPLACE TRIGGER ... 
... UPDATE OF Sal, Comm ON Emp_tab ... 
BEGIN 

... IF UPDATING ('SAL') THEN ... END IF; 

END; 

De Oracle documentation(9i)

11gR2 documentation

+4

+1, pero 9i documentos? Aquí está la [versión 11g] (http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/triggers.htm#sthref771) –

+2

Esto parece activarse si tholumn es parte de la instrucción UPDATE. No solo si el valor cambia. –

Cuestiones relacionadas