2013-02-09 63 views
1

我使用SQL和Oracle數據庫,需要一些幫助 - 觸發器是一些我很難理解。PL/SQL觸發更新來自插入另一臺在一個表上

我需要一個觸發器,當我向表A中插入一行時,它會更新表B上的一行:特別是主鍵匹配剛添加到表A的行的相應外鍵的行。

因此,對於在表A實例列X是外鍵,它引用在表B柱Y(主密鑰)。當我添加一行到表AI時,需要表B的列Z在列X =列Y的行中添加1到它的數值。

這是我在SQL中基於SQL在我有限的觸發器的理解,在情況下,它可以幫助(我意識到這不是很好,把它當作僞代碼):

CREATE OR REPLACE TRIGGER test_trig 
AFTER INSERT OR UPDATE ON tableA 
FOR EACH ROW 

BEGIN 
    UPDATE tableB 
    SET columnZ = columnZ + 1 
    WHERE tableA.columnX = tableB.columnY; 
END test_trig; 
/

感謝

回答

0

足夠好的開始。

第一 - 讓我們這樣的出路 - 這是沒有得到很好的標準化 - 你所描述的價值似乎像它應該在運行時不能在數據操作時間計算。

考慮以下幾點:

插入= +1列 - 行

更新=?並不總是+1我想 - 可能只有當某些其他數據被修改時。例如 - 如果我更新表集合col1 = col1會怎麼樣。也許你想要的可能不是。

刪除=?刪除平均-1到列?

語法:

WHERE tableA.columnX = tableB.columnY; 

應該

WHERE :new.columnX = tableB.columnY; 
1

試試這個:

語法將

CREATE OR REPLACE TRIGGER test_trig 
AFTER INSERT OR UPDATE ON tableA 
FOR EACH ROW 

BEGIN 
    UPDATE tableB 
    SET columnZ = columnZ + 1 
    WHERE tableB.columnX = :NEW.columnX; 
END test_trig; 
/

:new.columnX引用表格中的columnX。

0

如果tableB.columnZ代表的參考表A記錄的計數,沒有意義觸發TableA上的UPDATE除非表A的參考列可以改變。

首先OCASION:tableA.ReferenceColumn不會改變:

CREATE OR REPLACE TRIGGER test_trig 
AFTER INSERT ON tableA 
FOR EACH ROW 
BEGIN 

    UPDATE tableB 
    SET columnZ = columnZ + 1 
    WHERE tableB.columnX = :NEW.columnX; 
END test_trig; 
/

二OCASION:tableA.ReferenceColumn確實發生了改變:

CREATE OR REPLACE TRIGGER test_trig 
AFTER INSERT OR UPDATE OF columnX ON tableA 
FOR EACH ROW 

BEGIN 

    IF UPDATING AND nvl(:OLD.columnX,0) <> 0 THEN 
     UPDATE tableB 
     SET columnZ = columnZ - 1 
     WHERE tableB.columnX = :OLD.columnX; 
    END IF: 

    IF nvl(:NEW.columnX,0) <> 0 THEN 
     UPDATE tableB 
     SET columnZ = columnZ + 1 
     WHERE tableB.columnX = :NEW.columnX; 
    END IF; 

END test_trig; 
/

三OCASION:tablaA記錄可以刪除:

CREATE OR REPLACE TRIGGER test_trig 
AFTER INSERT OR DELETE OR UPDATE OF columnX ON tableA 
FOR EACH ROW 

BEGIN 
    IF (UPDATING OR DELETING) AND nvl(:OLD.columnX,0) <> 0 THEN 
     UPDATE tableB 
     SET columnZ = columnZ - 1 
     WHERE tableB.columnX = :OLD.columnX; 
    END IF: 

    IF nvl(:NEW.columnX,0) <> 0 THEN 
     UPDATE tableB 
     SET columnZ = columnZ + 1 
     WHERE tableB.columnX = :NEW.columnX; 
    END IF; 
END test_trig; 
/
0

我猜你正在實施一些機制(A)保持的歷史(B)計數器或(C)數據完整性問題。 如果是這種情況,我會建議使用pl/sql包進行更新,該包將處理所有必要的更新/其他DML操作。 這是應用程序通過pl/sql包更新數據的最佳實踐。通過這種方式,您可以在內部控制流程,並且更容易維護。另外,當你忘記在該表上有觸發器時,你可以在將來保存自己的問題。

一個技巧,我可以爲您提供有關觸發器 - 在您決定使用觸發器之前,請確保您已經耗盡其他所有可能性

相關問題