2012-06-26 33 views
9

Giả sử chúng ta có 3 bản ghi trong bảng: orig_tabkích hoạt cho các giá trị chỉ thay đổi

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

Bây giờ dữ liệu được thay đổi:

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

client gì muốn là các hồ sơ cập nhật và chỉ có các cột được cập nhật (có, tôi biết nó không có ý nghĩa gì nhưng họ sử dụng một số hệ thống cũ từ những năm 1970 và họ muốn làm một số đăng nhập vv). Vì vậy, các bảng báo cáo nên được như thế này:

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

gì này tôi đã cố gắng:

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; 

với giải pháp này, tôi nhận được:

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

Tôi biết rằng nó ở đâu đó trong claus chèn trong khi cập nhật tuyên bố nhưng tôi không thể tìm ra làm thế nào để có claus này thay đổi theo yêu cầu của tôi. Bất kì lời đề nghị nào?

Xin cảm ơn trước.

Trả lời

20

Bạn cần điều này:

Trong một trigger UPDATE, một tên cột có thể được xác định với một CẬP NHẬT vị có điều kiện để xác định xem cột có tên đang được cập nhật. Ví dụ, giả sử một trigger được định nghĩa như sau:

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

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

END; 

Từ Oracle documentation(9i)

11gR2 documentation

+4

+1, nhưng 9i tài liệu? Đây là [phiên bản 11g] (http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/triggers.htm#sthref771) –

+2

Điều này dường như kích hoạt nếu cột y thứ là một phần của câu lệnh UPDATE. Không chỉ nếu giá trị thay đổi. –

Các vấn đề liên quan